使用 Ipset 配置 Iptables

使用 Ipset 配置 Iptables

如果有人能帮我设置一个非常简单的 ipset 规则,我将不胜感激。我真的不明白为什么它似乎不起作用。所以它就是这样的:

  1. 我创建了一个简单的文件,其中包含我想要阻止的 IP 地址,并将其命名为 blocklist。

  2. 然后我创建我的 ipset 并像这样引用它:

    ipset create blocklist nethash
    for i in $(cat /path/to/blocklist); do ipset add blocklist $i; done
    -A INPUT -p tcp --match multiport --dport 25,587 -m set --match-set blocklist src -j DROP
    

当我用

ipset test blocklist (IP address here) and press enter

它说该 IP 地址在列表中。

当我用

iptables -L -n -v

它说我的 iptables 规则存在并且正在运行。

但是,当我从阻止列表中的 IP 地址连接时,它不会通过说连接超时来阻止此 IP 地址,而是直接连接并直接通过...我迷茫了...有人能指点一下,我的设置哪里有错误吗?欢迎提供任何指示/帮助/建议等!提前致谢!

PS 当我在没有任何多端口选项的情况下进行设置并且仅阻止一个端口时,它工作正常,如下所示:

-A INPUT -p tcp --dport 80 -m set --match-set blocklist src -j DROP

但是当我在第 25 个端口上做同样的事情时它不起作用:

-A INPUT -p tcp --dport 25 -m set --match-set blocklist src -j DROP

我真的搞不懂。我的 Postfix 运行正常,并且监听着我的第 25 个端口。

PSS 我唯一想到的就是我可以拥有的 ipset 集合的数量是有限的(这可能吗?),这就是为什么我的最后一条规则不起作用,因为它被推到了允许的限制之外......毫无头绪......

答案1

我可能不得不自己回答这个问题,因为看起来 serverfault 上没有人知道答案。好吧,这真的很简单。由于 iptable 规则是连续工作的,因此只需要在上面的代码中将 -A INPUT 更改为 -I INPUT。问题解决了。

它在我的输入链中创建了修正的 (-A) 规则,并将它们放在后面,这似乎与之前的其他规则相冲突。诀窍是执行插入 (-I),这会创建一个新规则并将其放在前面,从而停止与其他规则的冲突并开始完美运行。

希望它也能对某些人有所帮助。

答案2

问题出在 iptables 规则上:

-A INPUT -p tcp --match multiport --dport 25,587 -m set --match-set blocklist src -j DROP
                                  ^^^^^^^

多端口匹配的参数是--dports,而不是--dport:

-A INPUT -p tcp --match multiport --dports 25,587 -m set --match-set blocklist src -j DROP
                                  ^^^^^^^^

答案3

正如您似乎已经发现的那样,您所做的事情从根本上来说没有什么错误 - 只是您似乎被 iptables 规则优先级所困扰。也就是说,第一场比赛获胜。

一般来说,你可能希望你的INPUT链条看起来像这样:

-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -m set --match-set blocklist src -j DROP
<... other rules ....>
-A INPUT -j LOG
-A INPUT -j DROP

您可能需要考虑研究 fail2ban,它可能有助于根据您为其配置的 jail 自动填充您的 ipset(tl;dr:jails 链接到过滤器,它在指定的文件/日志事件上运行正则表达式(例如失败的 SSH 登录、管理面板 URL 请求等),提取 IP,并从适当的 ipset 中添加/删除它)。

相关内容