使用 Ubuntu 20.04 LTS,我在 /etc/fail2ban/jail.local 中有这个:
[DEFAULT]
bantime = 3600
banaction = iptables
blocktype = drop
[sshd]
enabled = true
protocol = tcp
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
但这是我在列出 iptables 规则时看到的:
╰─# iptables -L f2b-sshd -n -v
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
13 1356 REJECT all -- * * 222.187.232.205 0.0.0.0/0 reject-with icmp-port-unreachable
18 1516 REJECT all -- * * 221.181.185.153 0.0.0.0/0 reject-with icmp-port-unreachable
17 1064 REJECT all -- * * 222.186.180.130 0.0.0.0/0 777 55854 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
问题是它使用 REJECT(使用 ICMP)而不是 DROP。
action.d/iptables.conf 包含以下内容:
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
它是默认的 iptables 操作文件,随该操作系统版本的官方 fail2ban apt 软件包一起提供。
还尝试在 [sshd] 下添加“blocktype=drop”,但没有效果。
我不确定如何调试它,因为 fail2ban 服务不会记录实际的 iptables 命令。
我错过了什么?
要为单个监狱的操作提供一些参数,您必须设置
action
所有参数(通常也提供在的默认部分中jail.conf
),或者在禁止操作的情况下,您可以使用类似的东西:关于 DROP vs. REJECT 的主题,讨论就像 net-filter 子系统本身一样古老,双方都有很多优点/缺点。
有关禁止问题,请参阅https://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516了解详细信息。
我已经接受了@sebres 的解决方案,但我想补充一些问题。
对于 iptables-allports banaction,reject 块类型内部可以有空格。你需要引用那个。
例子:
第二个有趣的事情:banaction 和 jail 配置都有一个名为“protocol”的参数。当下面的配置没有抛出任何错误时,我首先感到困惑,但它没有阻止 UDP 请求:
发生这种情况是因为我错过了监狱中的协议=所有设置。您需要在监狱级别指定协议=全部:
原因是 named-ddos 部分在 iptables 中创建了一条新链,而被禁止的 ip 在该链中创建了规则。如果你没有在监狱级别指定协议=全部,那么链将被定义如下:
确实,banaction 将在链内创建 proto=all 的规则,但链本身不会用于非 tcp 数据包。结论是在jail级别和banaction中都需要指定protocol=all(如果支持的话),否则不起作用。