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
問題は、DROP ではなく REJECT (ICMP を使用) を使用することです。
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>
これは、この OS バージョンの公式 fail2ban apt パッケージに同梱されているデフォルトの iptables アクション ファイルです。
また、[sshd] の下に「blocktype=drop」を追加しようとしましたが、効果はありませんでした。
fail2ban サービスは実際の iptables コマンドをログに記録しないため、これをデバッグする方法がわかりません。
何が足りないのでしょうか?
答え1
単一の jail のアクションに何らかのパラメータを指定するには、action
すべてのパラメータを設定する必要があります (通常は のデフォルト セクションでも指定されますjail.conf
)。または、禁止アクションの場合は、次のようなものを使用できます。
[some_jail]
banaction = %(known/banaction)s[blocktype=DROP]
DROP vs. REJECTというテーマに関しては、ネットフィルタサブシステム自体と同じくらい古くから議論されており、双方に多くの賛否両論がある。
禁止に関する懸念については、https://github.com/fail2ban/fail2ban/issues/2217#issuecomment-423248516詳細については。
答え2
私は @sebres の解決策を受け入れましたが、いくつかの注意点を追加したいと思います。
iptables-allports banaction の場合、reject ブロックタイプ内にスペースを含めることができます。その場合は引用符で囲む必要があります。
例:
[sshd]
banaction=iptables-allports[blocktype="REJECT --reject-with icmp-port-unreachable"]
2 つ目の興味深い点は、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 レベルと禁止 (サポートされている場合) の両方で protocol=all を指定する必要があり、そうしないと機能しません。