我想在 iptables 中对每个源 IP 执行速率限制。例如,将主机建立新 SSH 连接的速率限制为每分钟 5 个。据我所知,有两种方法可以做到这一点:
使用 hashlimit 模块
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m hashlimit --hashlimit-name SSH --hashlimit-above 5/min \
--hashlimit-mode srcip -j REJECT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
使用最近的模块
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent \
--rcheck --seconds 60 --hitcount 5 --name SSH --rsource -j REJECT
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
-m recent --set --name SSH --rsource -j ACCEPT
我的问题:
- 这两者的行为方式有什么区别吗?
- 如果只注重性能的话,哪一个更可取?
- 同时使用这两个模块是否存在明显的缺点?
答案1
Is there any difference in how these two will behave?
不,你所写的内容在功能上会做同样的事情。
With an emphasis on performance, which one is preferable?
可以说,最近的性能更好,因为它维护一个表但不使用哈希桶。
Is there a significant downside to using both modules?
我不确定你为什么要同时使用这两个模块。当你只需要一个模块时,同时使用这两个模块会对性能产生影响。
答案2
这两者的行为方式有什么区别吗?
取决于您期望的连接数。
在大多数发行版中,最近的模块设置为只记住每个地址的少量地址和数据包;分别为 100 和 20。因此,如果您想将命中次数限制为 21 次,那么使用最近的默认值是不可能的。
虽然可以指定存储桶的数量、条目数量和到期时间,但 Hashlimit 默认似乎没有这样的限制。