我正在尝试编写带有明确白名单的 iptables 规则,任何新的未见流量都应在 60 秒内绕过 iptables 规则,以便为应用程序进一步处理流量提供时间。如果数据包在 60 秒内无法通过应用程序的身份验证,则应进一步处理规则。(Fail2Ban 不是这里的选项,原因超出了本文的范围)。
我的想法是使用 2 个 RECENT 列表,并使用 WHITELIST 标记尚未看到的数据包,并使用 rcheck 允许它们停留 60 秒,然后将这些数据包添加到另一个名为 WLFAIL 的列表中以供进一步处理。如果数据包不在 WLFAIL 中,则将它们添加到 WHITELIST,如下所示:
//#1 - First allow packets in the whitelist for 60 seconds
-A RULELIST -m recent --rcheck --seconds 60 --hitcount 1 --name WHITELIST --mask 255.255.255.255 --rsource -j ACCEPT
//#2 - You're not in the WHITELIST, if you're not in the WLFAIL list we'll add you to WHITELIST
-A RULELIST -m recent ! --rcheck --name WLFAIL --mask 255.255.255.255 --rsource -j addtowhitelist
//#3 - Since you're in WLFAIL, you don't belong in WHITELIST anymore
-A RULELIST -m recent --remove --name WHITELIST --mask 255.255.255.255 --rsource
...
//#4 - This should add to WHITELIST
-A addtowhitelist -m recent --set --name WHITELIST --mask 255.255.255.255 --rsource -j ACCEPT
第 2 行似乎永远无法匹配,而且我似乎找不到用于反向匹配“不在列表中”的正确语法。我是否误解了 Bang 的作用?正确的做法是什么?
答案1
我自己的代码中出现了错误 - 我在 -j 中输入了一个拼写错误。
因此,对于有此问题的任何人来说 - 第 2 行的语法是正确的 - 您可以与列表进行反向匹配。