我的目标是使用 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
但它的作用是冻结我的电脑(需要重新启动)。
我是这个主题的新手,任何帮助表示赞赏。
您可以使用 connbytes tc 选项。它将计算连接、上传和下载的总字节数。
例如,scp 问题可以这样解决:
将上面的行代替这一行:
虽然,您需要注意“restore-mark”和“save-mark”,但您不希望恢复 TCP/22 10 标记,您希望 connbyte 计数并在标记之前做出决定。
然后,您可以通过以下方式更改此行:
变成:
我正在研究这个问题,所以:
我必须添加另一个 tc 类来下载和上传,让我们称它们为交互式类并添加过滤器
并更改为较低的优先级
现在非批量流量到 up1:12 down2:12,不再有滞后问题。