使用 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 命令。
我错过了什么?
答案1
要为单个监狱的操作提供一些参数,您必须设置action
所有参数(通常也在默认部分提供jail.conf
),或者在禁止操作的情况下,您可以使用类似这样的操作:
[some_jail]
banaction = %(known/banaction)s[blocktype=DROP]
关于 DROP 与 REJECT 的主题,讨论由来已久,就像网络过滤子系统本身一样,双方都有许多优缺点。
有关禁止问题,请参阅https://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516了解详情。
答案2
我已经接受了@sebres 的解决方案,但我想补充一些陷阱。
对于 iptables-allports banaction,reject blocktype 里面可以有空格。你需要用引号引起来。
例子:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
第二件有趣的事情:banaction 和 jail 配置都有一个名为“protocol”的参数。当下面的配置没有抛出任何错误时,我首先感到困惑,但它没有阻止 UDP 请求:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
发生这种情况的原因是我没有在 jail 中设置 protocol=all。您需要在 jail 级别指定 protocol=all:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
protocol=all
原因是 named-ddos 部分在 iptables 中创建了一个新的链,被禁止的 IP 在该链中创建规则。如果您未在 jail 级别指定 protocol=all,则链将定义如下:
Chain INPUT (policy DROP 22 packets, 952 bytes)
pkts bytes target prot opt in out source destination
1371 229K named-ddos tcp -- * * 0.0.0.0/0 0.0.0.0/0
确实,禁令将创建 proto=all 的规则链内,但该链本身不会用于非 TCP 数据包。结论是,您需要在 jail 级别和 banaction 中指定 protocol=all(如果它支持),否则它将不起作用。