Skip to content

内网限速

zfl9 edited this page May 25, 2023 · 4 revisions

限速原理很简单,就是将超过规定速率的包给丢掉(限速一般只针对 TCP,UDP 很少有这种需求),由于这些包不会交付给接收方,因此发送方不会收到这些包的 ACK 确认消息,在发送方看来,就是“丢包”了,然后触发 TCP 重传机制,达到限速目的。

一个简单的例子(这些 iptables 规则在 ss-tproxy 主机设置):

## 连接级别
# 192.168.1.0/24网段的主机,每条tcp连接,上传限速100kb/s
iptables -t mangle -I PREROUTING -p tcp -s 192.168.1.0/24 -m hashlimit --hashlimit-name upload --hashlimit-mode srcip,srcport --hashlimit-above 100kb/s -j DROP

# 192.168.1.0/24网段的主机,每条tcp连接,下载限速100kb/s
iptables -t mangle -I POSTROUTING -p tcp -d 192.168.1.0/24 -m hashlimit --hashlimit-name download --hashlimit-mode dstip,dstport --hashlimit-above 100kb/s -j DROP

## 主机级别
# 192.168.1.0/24网段的主机,每个内网ip,上传限速100kb/s
iptables -t mangle -I PREROUTING -p tcp -s 192.168.1.0/24 -m hashlimit --hashlimit-name upload --hashlimit-mode srcip --hashlimit-above 100kb/s -j DROP

# 192.168.1.0/24网段的主机,每个内网ip,下载限速100kb/s
iptables -t mangle -I POSTROUTING -p tcp -d 192.168.1.0/24 -m hashlimit --hashlimit-name download --hashlimit-mode dstip --hashlimit-above 100kb/s -j DROP

如果是要限制从直连网站(白名单)下载的速度,要设置一条 snat 规则,不然限速是不会有效的,因为数据包直接由路由器发到内网客户机了,不会经过 ss-tproxy 主机(如果 ipts_set_snat 已经设为了 true,则不需要这条规则):

iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -j MASQUERADE

可以利用post_start钩子函数来设置这些规则,post_stop来清理这些规则(把-I/-A改为-D就是删除)。

Clone this wiki locally