使用 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,拒絕區塊類型內部可以有空格。你需要引用它。
例子:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
第二個有趣的事情:banaction 和jail 配置都有一個名為「protocol」的參數。當下面的配置沒有拋出任何錯誤,但它沒有阻止 UDP 請求時,我首先感到困惑:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
發生這種情況是因為我缺少監獄中的協議=所有設定。您需要在監獄層級指定protocol=all:
[named-ddos]
banaction=iptables-allports[blocktype=DROP,protocol=all]
protocol=all
原因是,named-ddos 部分在 iptables 中創建了一條新鏈,而被禁止的 ip 正在該鏈內創建規則。如果你沒有在監獄層級指定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(如果支援的話),否則不起作用。