我的理解是使用 ipset 运行 Fail2ban 更快。为此:
我按照说明(针对 Fedora 37 进行了修改)从 Git 下载并安装了 ritsu/ipset-fail2ban。
我的banaction仍然设置为:
banaction_allports = firewallcmd-rich-rules[actiontype=]
当我尝试添加或替换上面的内容时:
banaction = firewallcmd-ipset
我收到如下错误:
2023-04-09 15:51:46,130 fail2ban.actions [986]: NOTICE [postfix-auth] Restore Ban 117.69.159.181
2023-04-09 15:51:46,526 fail2ban.utils [986]: ERROR 7f29c6bd0ea0 -- exec: ipset -exist create f2b-postfix-unv hash:ip timeout 0
firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp -m multiport --dports smtp,imap2,imap3,imaps,pop3,pop3s,465,587, submission -m set --match-set f2b-postfix-unv src -j REJECT --reject-with icmp-port-unreachable
2023-04-09 15:51:46,527 fail2ban.utils [986]: ERROR 7f29c6bd0ea0 -- stderr: "Error: COMMAND_FAILED: '/usr/sbin/iptables-restore -w -n' failed: iptables-restore v1.8.8 (legacy): invalid port/service `' specified"
2023-04-09 15:51:46,527 fail2ban.utils [986]: ERROR 7f29c6bd0ea0 -- stderr: 'Error occurred at line: 2'
2023-04-09 15:51:46,527 fail2ban.utils [986]: ERROR 7f29c6bd0ea0 -- stderr: "Try `iptables-restore -h' or 'iptables-restore --help' for more information."
2023-04-09 15:51:46,527 fail2ban.utils [986]: ERROR 7f29c6bd0ea0 -- stderr: ''
2023-04-09 15:51:46,527 fail2ban.utils [986]: ERROR 7f29c6bd0ea0 -- returned 13
如果我运行,firewall-cmd --list-all-zones
我会得到一个当前被禁止的 IP 地址列表。
但是它们不在任何区域文件中/etc/firewalld/zones
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere match-set blacklist-fail2ban src
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere 185.191.32.198 tcp dpt:http
如果我错了,我哪里错了?
谢谢
[附录 1]
根据 Ginnungagap 关于框架问题的建议,我对他关于尾随逗号的询问的回答是:
我的错误示例的 jail.local 是:
[postfix-unv]
enabled = true
filter = postfix-unv
port = smtp,imap2,imap3,imaps,pop3,pop3s,465,587, submission
logpath = /var/log/maillog
maxretry = 1
bantime = 604800
我没有看到额外的逗号。我也没有在实际过滤器中看到额外的逗号。我会研究nftables。
[附录 2]
按照你的建议改变banaction。当我发布 cmd nft list 规则集时,它似乎起作用了。
我重启了firewalld,它没有额外的规则(即rich sets)
我重新启动了 fail2ban,它在大约一分钟内加载了所有被禁止的规则。
我还需要 Git 中的文件吗(如上所述)?
谢谢 Ginnungagap,非常感谢您的帮助。
直接规则 fail2ban 尝试注入在导致记录错误的端口列表中有一个尾随逗号
iptableq-restore
。无论如何,我强烈建议转向 nftables,这将使 fail2ban 管理自己的表和本机集支持。iptables 出于兼容性目的仍然存在,但远不如 nftables 灵活。
firewalld 仅在使用 nftables 后端时刷新自己的表,因此
firewall-cmd
不会清除 fail2ban 的表(或 firewalld 以外的任何表)。将后端更改为 nftables 相当简单,只需添加
banaction = nftables-multiport
到您的监狱或分别更改全局banaction
和banaction_allports
到nftables-multiport
和nftables-allports
。