值得指出使用ufw的LIMIT功能可能导致的意外后果。
假设第一个ufw规则在端口22 / tcp上设置了总括限制:
To Action From
-- ------ ----
[ 1] 22/tcp LIMIT IN Anywhere
...
假设仍然可以通过以下ufw规则以及最后的默认策略“ deny(incoming)”来过滤在该限制下运行的任何连接。
至少对于UFW 0.35,该假设是错误的。实际上,LIMIT IN逻辑立即接受未由限制条件拒绝的任何输入。
在伪代码中,LIMIT逻辑为
if CONDITION then DENY else ACCEPT
而其他ufw规则似乎具有逻辑性:
if CONDITION then (DENY|ACCEPT) else continue to next rule
。
我个人发现这是ufw LIMIT的意外行为,只有在系统日志文件中意外地发现许多22号端口登录尝试后,才发现该行为,但由于其他ufw规则过滤,该尝试从未发生过。
行为确认的细节
ufw插入的iptables代码的相关行如下:
-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit
-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT
上面的清单可以用
iptables -S | grep ufw-user-limit
前两行是连续的ufw-user-input
,可以通过
iptables -S | grep ufw-user-input