我经常通过 DSL 上行连接使用 SCP 上传大量数据,该连接的速度限制为 1kbit/s。虽然我确实希望交互式 SSH 会话具有最高优先级,但简单地将 SSH 设置为最高优先级会导致连接在 SCP 上传期间无法使用。
如何区分 SSH 和 SCP 的服务质量设置,尤其是在 OpenWRT 中?
答案1
至少 OpenSSH 设置不同的 TOS 位(0x16
用于交互式会话,0x08
用于批量传输),如在 quora 上讨论过。
使用与这些位匹配的规则可以轻松利用这一点。看来最高匹配的 QoS 会生效,请确保不要对端口 22/SSH 有通用规则:OpenWRT 默认情况下会附带将 SSH 和 DNS 一起匹配的规则。对于这些规则,我使用了0x04
和的重叠 DSCP 值,0x02
如上面链接的 quora 帖子中建议的那样。
config classify
option target "Priority"
option ports "22"
option dscp 0x04
option comment "ssh"
config classify
option target "Bulk"
option ports "22"
option dscp 0x02
option comment "scp"
对于“裸”iptables 设置,这些是生成的规则(-m dscp --dscp 0x04
和-m dscp --dscp 0x02
参数是最有趣的部分):
-A qos_Default_ct -p tcp -m mark --mark 0x0/0xf -m tcp -m multiport --ports 22 -m dscp --dscp 0x04 -m comment --comment ssh -j MARK --set-xmark 0x11/0xff
-A qos_Default_ct -p tcp -m mark --mark 0x0/0xf -m tcp -m multiport --ports 22 -m dscp --dscp 0x02 -m comment --comment scp -j MARK --set-xmark 0x44/0xff
请务必在使用 重新加载 QoS 设置后重新启动 SCP 传输/etc/init.d/qos restart
。 QoS 设置仅应用于新流。
在应用这些规则之前(使用单个 SSH“优先级”规则),我在 SCP 上传期间的 ping 值约为 200 毫秒;应用该规则后,时间降至 70-100 毫秒(相比之下,空闲线路的时间为 30 毫秒)。