我的目标是使用 tc、IMQ 接口和 iptables 限制每个系统用户的带宽。目前,我在批量下载(即 scp)方面遇到了问题,这会导致 ssh 服务器等交互式程序出现延迟。
这是我的配置:
# UPLOAD # OUTBOUND #
tc qdisc add dev imq0 root handle 1:0 htb default 11
tc class add dev imq0 parent 1:0 classid 1:1 htb rate 700kbit ceil 700kbit
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 450kbit ceil 700kbit prio 0
tc class add dev imq0 parent 1:1 classid 1:11 htb rate 250kbit ceil 250kbit prio 1
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev imq0 parent 1:0 prio 1 protocol ip handle 11 fw flowid 1:11
# DOWNLOAD # INBOUND #
tc qdisc add dev imq1 root handle 2:0 htb default 11
tc class add dev imq1 parent 2:0 classid 2:2 htb rate 7000kbit ceil 7000kbit
tc class add dev imq1 parent 2:1 classid 2:10 htb rate 4500kbit ceil 7000kbit prio 0
tc class add dev imq1 parent 2:1 classid 2:11 htb rate 2500kbit ceil 2500kbit prio 1
tc filter add dev imq1 parent 2:0 prio 0 protocol ip handle 10 fw flowid 2:10
tc filter add dev imq1 parent 2:0 prio 1 protocol ip handle 11 fw flowid 2:11
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 1
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -N IMQ-OUT
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ-OUT
iptables -t mangle -A IMQ-OUT -p tcp -m length --length :64 -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -p tcp -m length --length :64 -j RETURN
iptables -t mangle -A IMQ-OUT -m owner --uid-owner root -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -m owner --uid-owner root -j RETURN
iptables -t mangle -A IMQ-OUT -m owner --uid-owner test1 -j MARK --set-mark 11
iptables -t mangle -A IMQ-OUT -m owner --uid-owner test1 -j RETURN
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -o eth0 -j IMQ --todev 0
执行配置后的类和过滤器:
tc class show dev imq0
class htb 1:11 parent 1:1 prio 1 rate 250000bit ceil 700000bit burst 1599b cburst 1599b
class htb 1:10 parent 1:1 prio 0 rate 450000bit ceil 700000bit burst 1600b cburst 1599b
class htb 1:1 root rate 700Kbit ceil 700Kbit burst 1600b cburst 1600b
tc filter show dev imq0
filter parent 1: protocol ip pref 1 fw
filter parent 1: protocol ip pref 1 fw handle 0xb classid 1:11
filter parent 1: protocol ip pref 49152 fw
filter parent 1: protocol ip pref 49152 fw handle 0xa classid 1:10
尝试使用 sfq 添加 qdisc,如下所示
# tc qdisc add dev imq0 parent 1:10 handle 10:0 sfq perturb 10
# tc qdisc add dev imq0 parent 1:11 handle 11:0 sfq perturb 10
# tc qdisc add dev imq1 parent 2:10 handle 10:0 sfq perturb 10
# tc qdisc add dev imq1 parent 2:11 handle 11:0 sfq perturb 10
但它却冻结了我的计算机(需要重新启动)。
我对这个话题还不熟悉,如能得到任何帮助我将不胜感激。
答案1
您可以使用 connbytes tc 选项。它将计算连接、上传和下载的总字节数。
例如,scp 问题可以这样解决:
iptables -t mangle -A IMQ-OUT -p tcp --dport 22 -m connbytes --connbytes 10000000: --connbytes-dir both --connbytes-mode bytes -m owner --uid-owner root -j MARK --set-mark 11
iptables -t mangle -A IMQ-OUT -p tcp ! --dport 22 -m owner --uid-owner root -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -p udp -m owner --uid-owner root -j MARK --set-mark 10
iptables -t mangle -A IMQ-OUT -p icmp -m owner --uid-owner root -j MARK --set-mark 11
将上面几行替换下面这几行:
iptables -t mangle -A IMQ-OUT -m owner --uid-owner root -j MARK --set-mark 10
虽然您需要小心使用“恢复标记”和“保存标记”,但您不希望恢复 TCP/22 10 标记,而是希望 connbyte 在标记之前进行计数并做出决定。
然后您可以按照以下方式更改此行:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
变为:
iptables -t mangle -A PREROUTING -p tcp ! --dport 22 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -p udp -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -p icmp -j CONNMARK --restore-mark
答案2
我正在深入研究这个问题:
我必须添加另一个 tc 类来下载和上传,我们称它们为交互式类,并添加过滤器
tc filter add dev imq0 protocol ip parent 1:0 prio 1 u32 match ip tos 0x10 0xff flowid 1:12
tc filter add dev imq1 protocol ip parent 2:0 prio 1 u32 match ip tos 0x10 0xff flowid 2:12
并改为较低优先级
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11
tc filter add dev imq1 parent 2:0 prio 0 protocol ip handle 10 fw flowid 2:10
tc filter add dev imq1 parent 2:0 prio 0 protocol ip handle 11 fw flowid 2:11
现在非批量流量转到 up1:12 down2:12,不再有滞后问题。