流量控制 - 使用 scp 进行批量下载会导致 sshd 滞后

流量控制 - 使用 scp 进行批量下载会导致 sshd 滞后

我的目标是使用 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,不再有滞后问题。

相关内容