我有一个网关,它的操作系统是 Linux。假设我的下行带宽是 100 Mbps。我想将使用此网关的每个设备的最大下载速度限制为 1Mbps。换句话说,如果有 100 个设备,理论上每个设备都可以获得 1 Mbps 的带宽。我尝试通过 Linux 命令“tc”进行流量整形。以下是我的命令。我的接口名称是“eth0”。但问题是这些命令只能限制特定设备的速度(这里,它的 MAC 地址是 M0M1M2M3M4M5)。我想要的命令是限制每个设备的速度。这些命令应该是通用的,因为我不知道将数据包发送到网关的设备的 MAC 地址。有没有简单的命令/方法可以做到这一点?我们需要动态添加 TC 规则吗?提前致谢。
tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
#dst MAC=M0M1M2M3M4M5
tc filter add dev eth0 parent 1: protocol ip prio 5 u32 match u32 0xM2M3M4M5 0xffffffff at -12 match u16 0xM0M1 0xffff at -14 flowid 1:1
答案1
使用此示例:
tc qdisc del dev eth1 root
tc qdisc add dev eth1 root handle 1: htb default 10
tc class add dev eth1 parent 1: classid 1:10 htb rate 1mbit ceil 1mbit
tc class add dev eth1 parent 1: classid 1:11 htb rate 1mbit ceil 1mbit
tc class add dev eth1 parent 1: classid 1:12 htb rate 1mbit ceil 1mbit
如果需要,可以添加更多
tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2 match u32 0x23AD5518 0xFFFFFFFF at -12 match u16 0x0800 0xFFFF at -14 flowid 1:11
tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2 match u32 0x23AD5520 0xFFFFFFFF at -12 match u16 0x0800 0xFFFF at -14 flowid 1:12
如果需要,可以添加更多 Mac
或者使用更简单的 ip 版本:
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.10.101 flowid 1:11
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.10.102 flowid 1:12
如果需要,添加更多 IP
答案2
以下是基于https://amd.co.at/adminwiki/Linux_Trafficshaping:
#!/bin/bash
#Cleaning up
tc qdisc del dev eth0 root handle 1: > /dev/null 2>&1
#Add the root handle, setting the default leaf
tc qdisc add dev eth0 root handle 1: htb default 5
#Set the basic speed of the device
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# add a leaf for every IP in the 10.0.1.0/24 class, with mimimum guaranteed bandwidth of 1mbit and max available bandwidth of 1mbit, as per OP request
for i in $(seq 2 255); do
tc class add dev eth0 parent 1:1 classid 1:$i htb rate 1mbit ceil 1mbit
#Add SFQ queueing disciplines
tc qdisc add dev eth0 parent 1:$i handle $i: sfq perturb 10
#prioritize traffic
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.0.1.$i flowid 1:$i
done
如果您想让每个IP使用超过1Mbps的带宽,只要当前产生流量的每个IP至少有1Mbps的保证带宽,那么您应该ceil 1mbit
改为ceil 100mbit
。
如果您的目标是在任何情况下都不让客户端的速度超过 1Mbps,请按原样使用脚本。