技术解析

iptables 的 limit 和 connlimit 等模块现在是内置还是需要另外引入?
0
2021-07-08 17:59:40
idczone
百度还是找不到说明。
自己的 vps 上写相关的规则发现没作用,搞不清是否需要额外引入才能用?
iptables-save 看看
vps 是 openvz 的么
一般不需要

要看 iptable 的版本是否支持了。 可以用 man iptable 看一下,是否有 limit 功能。
http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html/>https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#LIMITMATCH

谢谢两位。我对比了几个 vps ,不同 linux 内核版本,使用 iptables 相关含模块的规则,也没报错,估计是内置。不过效果比如 limit 模块,不同 vps 上明显效果不一样,不知道是否内核版本差别。
我继续学习中。谢谢回复。现在就想怎么对不断开新端口的 BT 连接进行限制。我看到一个 ip 应该用了 BT ,随机占用端口 2xxxx 开始到 5xxxx ,嗯, ss 的连接,不知道只能有效阻止这种。

我想说 7 开始已经不用 iptables 了

内核编绎可选

limit 肯定比 connlimit 好, connlimit 实际测试在打开网页方面会导致断开白页。但是这属于全局限制,需要具体指定 ip ,用 hashlimit 吧,可以通过限制并发来限制流量。更高级的有 quota 。

quota 我也用了,流量能限制住,但是速度限不了,我那个 vps , hk 的带宽很小峰值 3M ,如果有一个人下载, ping 这个 vps 就可能几百上千的 ms 值了。
connlimit 我目前是想限制住 bt 程序的连接数量,超过 50 就 drop ;
limit 我是想用来限制下速度,不过在不同 vps 上,效果不太一样。不清楚原因了。

比较理想的是用 tc ,不过 vps 不支持。
connlimit 一直没有好的印象,容易导致网络中断,像打开网页时突然就是白屏页面,在第三方固件和 ros 上测试过,印象一直不好, vps 上还没实际应用过。
limit 是需要一个具体 ip 才能实现效果的,所以如果仅仅使用 limit 需要不断的侦测源 /目的 ip ,然后用脚本动态调用 iptables 进行插值处理才能针对特定 ip 实现连接数匹配,而 hashlimit 则是个增强版至少解决前面这些过程。

-A INPUT -p tcp -m multiport --dport 80,1723,8080,8443,8843 -m hashlimit --hashlimit-name obfs --hashlimit 80/sec --hashlimit-burst 350 --hashlimit-mode srcip,srcport --hashlimit-htable-expire 300000 -j ACCEPT
-A INPUT -p tcp -m multiport --dport 80,1723,8080,8443,8843 -j REJECT
这个 hashlimit 由于是用令牌筒概念实现的,所以匹配的每秒数据包通过数量就有多有少,造成流量的不精确,效果肯定是不如 tc 的。有时候没有别的方法也只能根据 tcp 握手的过程,通过限制数据包来达到限制流量的过程。

你楼上的例子 80/sec --hashlimit-burst 350 这些数字的单位是 packets 包?
实际就是 1500x80=120000bytes 最高峰值可以 1500x350=512K 是大概这意思吧
我现在最想解决就是限制 BT 程序通过 SS ,我发现 BT 程序会不断的请求端口, tail ss 的日志,会发现连续不断请求,我曾经观察过请求的端口号从 20000 多一直到 50000 多, ss 里面我不知道如何限制。所以想看 iptables 是否可以阻止这种情况。

我尝试用下面两种,都限制不了 4011 4016 两个端口的速度。我分开写,就是一次写一个端口号也不行。改限制到 OUTPUT ,同样也限制不到速度。 y2b 播放就是直接满速占用 vps 带宽。
iptables -A INPUT -p tcp -m multiport --dport 4011,4016 -m hashlimit --hashlimit-name portslimit --hashlimit 80/sec --hashlimit-burst 100 --hashlimit-mode srcport --hashlimit-htable-expire 300000 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 4011,4016 -j REJECT
iptables -A INPUT -p tcp --dport 4011 -m limit --limit 80/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 4011 -j DROP

limit 的原理是匹配每秒通过的数据包,根据 tcp 握手的过程通过限制源数据包的数量来同时限制返回的数据包数量,所以原则上不是用来限制流量用途的。一般能调节的就是--hashlimit-burst 100 突发最高可以通过 100 包,然后不断的减少直到 0 ,而 hashlimit 80/sec 是用来产生多少包来补偿--hashlimit-burst 100 减少的,但最高也只能到 100 ,所以它不是用来限流量的,只是因为限制并发而连带的抑制流量过程。
我那两句用 wget 测试的时候, wget 属于单线程可以将流量限制在 200kb-1mb 之间。也许你应该用-hashlimit-mode srcip 限制每 ip ,然后调整 80/sec 为 40/sec 。然后再试试。

谢谢详细说明。我再去调整测试下。除了 tc (似乎很复杂,而且 vps 估计用不了),应该也就 iptables 能稍微限制一下速度了吧。

-m multiport 使用这个 match 后,后面的--hashlimit 80/sec --hashlimit-burst 100 ,这个数是对于之前 multiport 列举的每个端口都是这个值还是之前列举端口的总和?
感觉有点像是端口合计。又有点不确定。

这个 hashlimit 我也研究得少,不知道如何进行测试。你可以通过 hashlimit-name portslimit
通过 cat /proc/net/ipt_hashlimit/portslimit 看看。它的本意做为 limit 的增强版本匹配每个源 ip ,但是多了 srcip srcport dstip dstport 我也答不上来了。。。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服