我写了以下防火墙规则:
iptables -A 输入 -m hashlimit --hashlimit 1/小时 --hashlimit-burst 3 --hashlimit-mode srcip,dstport --hashlimit-name ssh -j 接受
我原本以为一小时后会充值 1,但实际上一分钟内就充值 1。我从同一个源 IP 和同一个目标端口发送消息,所以我原本以为它每小时会接受 3 个连接,然后 1 个。但它接受的更多(每 20-30 秒一个)。如果我使用--限制 1/小时我可以观察到预期的行为,但我需要使用 hashlimit,因为我需要根据 srcip 和 dstport 进行过滤。我做错了什么?谢谢!
答案1
我认为您遇到了即将过期的条目。手册页中的一项例外情况:
--hashlimit-burst amount Maximum initial number of packets to match: this number gets recharged by one every time the limit specified above is not reached, up to this number; the default is 5. When byte-based rate matching is requested, this option specifies the amount of bytes that can exceed the given rate. This option should be used with caution -- if the entry expires, the burst value is reset too.
并且任何哈希条目的保存时间都是通过选项指定的--hashlimit-htable-expire
。我不知道这个条目的默认值是什么,但我猜它比一小时短很多,这可以解释为什么你的连接速度比预期的要快。
您应该考虑进一步调整这些值,例如每分钟允许一个 - 在这种情况下,您的服务器只需要记住最后一分钟的 IP,而不是最后一小时的 IP。
答案2
一个问题是
--hashlimit 1/hour
如果
--hashlimit-upto 1/hour
使用-j ACCEPT
看
man iptables-extensions