如何为指定本地主机限制带宽?tc与iptables配置衔接疑问
你已经找对思路啦!用iptables标记特定主机的数据包,再配合tc的分层队列就能实现精准的带宽限制,不用影响整个接口的设备。下面是完整的操作步骤:
实现特定本地主机的带宽限制
1. 清理原有tc配置(可选但推荐)
避免之前的残留规则干扰,先重置目标接口的队列规则:
tc qdisc del dev $IF root
记得把$IF换成你的实际接口名,比如路由器的eth0或者桥接接口br0。
2. 添加根队列(使用HTB分层令牌桶)
直接用TBF会限制整个接口,我们需要用HTB来创建可分类的根队列,这样能把不同主机的流量分到不同的限速组:
tc qdisc add dev $IF root handle 1: htb default 10
这里handle 1:是根队列的标识,default 10表示未标记的流量会走默认类1:10(我们不给这个默认类限速,所以其他主机不受影响)。
3. 创建专属限速类
给你要限制的主机段(192.168.1.128/25)创建一个专属的流量类,设置你想要的带宽和突发值:
tc class add dev $IF parent 1: classid 1:10 htb rate 100kbps burst 1mb
这个classid 1:10就是你之前iptables命令里要关联的类标识,一定要对应上!
4. 给限速类添加队列优化(可选)
为了让限速后的流量更平滑,减少延迟波动,可以给这个类加一个先进先出队列:
tc qdisc add dev $IF parent 1:10 handle 10: pfifo limit 100
5. 用iptables标记目标主机的数据包
你之前的命令只差一点细节(注意--dst前面不要加反斜杠),如果是出站流量(本地主机访问外网的流量),用这条:
iptables -t mangle -A POSTROUTING -d 192.168.1.128/25 -j CLASSIFY --set-class 1:10
如果是入站流量(外网访问这些本地主机的流量),要把POSTROUTING换成PREROUTING:
iptables -t mangle -A PREROUTING -d 192.168.1.128/25 -j CLASSIFY --set-class 1:10
6. 验证配置是否生效
查看tc的队列和类规则:
tc class show dev $IF tc qdisc show dev $IF
查看iptables的标记规则:
iptables -t mangle -L POSTROUTING -v
取消限制的方法
如果后续要移除限速,先删除iptables规则,再清理tc配置:
# 删除出站流量标记规则 iptables -t mangle -D POSTROUTING -d 192.168.1.128/25 -j CLASSIFY --set-class 1:10 # 清理tc配置 tc qdisc del dev $IF root
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

