随着互联网应用的快速发展,网络流量的管理变得越来越重要。企业和组织需要在保证内网应用正常运行的同时,控制外网流量,以确保网络资源的合理分配。Traffic Control(TC)是Linux系统中强大的网络流量管理工具,它能够对网络流量进行细粒度的控制和调节。TC不仅可以用来限速,还可以用来进行流量分流、流量监控等操作。在这篇博客中,我们将介绍TC的基础概念和命令,并通过一个实际案例,展示如何使用TC进行内外网分流限速,使网络管理更加高效和便捷。
1. TC 基础概念、命令
Traffic Control(TC)是 Linux 内核提供的一个命令行工具,用于管理和控制网络流量。它允许用户定义规则以限制带宽、控制流量优先级、过滤数据包等。 TC 的工作主要依赖于三个核心组件:队列调度器(qdisc)、类(class)和过滤器(filter)。
- 队列调度器(qdisc):它决定了数据包在网络接口上如何被处理和传递。常见的 qdisc 类型包括 pfifo_fast 、htb(层次令牌桶)和 ingress 等。
- 类(class):在 HTB 等层次调度器中,类用于定义流量的层次结构,允许不同的流量类型获得不同的带宽分配。
- 过滤器(filter):过滤器用于匹配和识别特定类型的数据包,以便将其分配到合适的类中。
TC 的命令主要包括:
tc qdisc:管理队列调度器。tc class:管理类。tc filter:管理过滤器。
这些命令可以结合使用,构建复杂的流量管理策略。
2. 应用一:TC 对内外网进行分流限速
在这个实战案例中,我们将使用 TC 对内外网进行分流限速。具体步骤如下:
网卡:ens68
IFB虚拟网卡:ens68-ifb
步骤 1: 清除现有规则
首先,我们需要清除任何现有的规则,以确保配置干净利落。
tc qdisc del dev ens68 root 2>/dev/null
tc qdisc del dev ens68 ingress 2>/dev/null
tc qdisc del dev ens68-ifb root 2>/dev/null
ip link set ens68-ifb down 2>/dev/null步骤 2: 启用 IFB 设备
加载 IFB 模块:
首先,确保加载了 IFB (Intermediate Functional Block)模块。如果模块尚未加载,可以使用以下命令:
sudo modprobe ifb这将加载 IFB 内核模块,使系统支持 IFB 设备。
创建 IFB 设备:
如果你的系统没有自动创建 IFB 设备,可以手动创建。通常,IFB 设备以 ifb0, ifb1 的格式命名。你可以使用以下命令创建:
sudo ip link add name ens68-ifb type ifb
此命令将创建一个名为 ifb0 的 IFB 设备。你可以根据需要创建多个设备,并命名为 ifb1, ifb2 等。
接下来,我们启用 IFB设备,这将用于处理下行流量。
ip link set dev ens68-ifb up步骤 3: 配置下行流量重定向(Ingress 限速)
通过配置 Ingress 调度器,我们将下行流量重定向到 IFB 设备。
tc qdisc add dev ens68 handle ffff: ingress
tc filter add dev ens68 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ens68-ifb步骤 4: 配置上行限速(HTB on ens68)
在 ens68 设备上创建 HTB 队列调度器,并定义内网和公网的流量类。
tc qdisc add dev ens68 root handle 1: htb default 20
tc class add dev ens68 parent 1: classid 1:1 htb rate 1000mbit # 总带宽
tc class add dev ens68 parent 1:1 classid 1:10 htb rate 100000mbit ceil 100000mbit # 内网通道# 内网通道(100Gbps)
tc class add dev ens68 parent 1:1 classid 1:20 htb rate 20mbit ceil 20mbit # 公网通道(限速 20Mbps)步骤 5: 配置下行限速(HTB on ens68-ifb)
在 ens68-ifb 设备上配置 HTB 队列调度器,设置内网和公网的带宽限制。
tc qdisc add dev ens68-ifb root handle 1: htb default 20
tc class add dev ens68-ifb parent 1: classid 1:1 htb rate 1000mbit
tc class add dev ens68-ifb parent 1:1 classid 1:10 htb rate 100000mbitceil 100000mbit # 内网通道(100Gbps)
tc class add dev ens68-ifb parent 1:1 classid 1:20 htb rate 40mbit ceil 40mbit # 公网通道(限速 40Mbps)步骤 6: 添加上行过滤器(豁免内网)
假设内网IP端为:10.20.0.0/16,使用过滤器来识别内网流量,从而对内网流量进行豁免。
tc filter add dev ens68 protocol ip parent 1: u32 match ip dst 10.20.0.0/16 flowid 1:10步骤 7: 添加下行过滤器(豁免内网)
类似地,添加过滤器来识别下行内网流量。
tc filter add dev ens68-ifb protocol ip parent 1: u32 match ip src 10.20.0.0/16 flowid 1:10通过以上配置,我们成功实现了对内外网的分流限速。内网流量将获得不受限的带宽,而公网流量则被限制在指定的范围内。这种配置不仅优化了网络资源,还确保了内网应用的稳定运行。 TC 的强大功能让流量管理变得简单而高效。
#!/bin/bash
# 网络设备名称
DEV="ens68"
IFB_DEV="${DEV}-ifb"
# 内网 IP 范围
INTERNAL_NET="10.20.0.0/16"
# 清除现有规则
tc qdisc del dev $DEV root 2>/dev/null
tc qdisc del dev $DEV ingress 2>/dev/null
tc qdisc del dev $IFB_DEV root 2>/dev/null
ip link set $IFB_DEV down 2>/dev/null
# 启用 IFB 设备
ip link set dev $IFB_DEV up
# 配置下行流量重定向(Ingress 限速)
tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $IFB_DEV
# 配置上行限速(HTB on $DEV)
tc qdisc add dev $DEV root handle 1: htb default 20
tc class add dev $DEV parent 1: classid 1:1 htb rate 1000mbit # 总带宽
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 100000mbit ceil 100000mbit # 内网通道(100Gbps)
tc class add dev $DEV parent 1:1 classid 1:20 htb rate 20mbit ceil 20mbit # 公网通道(限速 20Mbps)
# 配置下行限速(HTB on $IFB_DEV)
tc qdisc add dev $IFB_DEV root handle 1: htb default 20
tc class add dev $IFB_DEV parent 1: classid 1:1 htb rate 1000mbit
tc class add dev $IFB_DEV parent 1:1 classid 1:10 htb rate 100000mbit ceil 100000mbit # 内网通道(100Gbps)
tc class add dev $IFB_DEV parent 1:1 classid 1:20 htb rate 40mbit ceil 40mbit # 公网通道(限速 40Mbps)
# 添加上行过滤器(豁免内网)
tc filter add dev $DEV protocol ip parent 1: u32 match ip dst $INTERNAL_NET flowid 1:10
# 添加下行过滤器(豁免内网)
tc filter add dev $IFB_DEV protocol ip parent 1: u32 match ip src $INTERNAL_NET flowid 1:10
echo "Traffic Control rules have been successfully configured."