fail2banはDROPブロックタイプを使用しません

fail2banはDROPブロックタイプを使用しません

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 を指定する必要があり、そうしないと機能しません。

関連情報