fail2ban 不使用 DROP blocktype

fail2ban 不使用 DROP blocktype

使用 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(如果它支持),否则它将不起作用。

相关内容