Rocky Linux 10環境に fail2ban (v1.1.0) を導入していると、ログに突然以下のようなエラーが吐き出されて、IPのBAN(遮断)に失敗することがあります。
stderr: 'Warning: Extension multiport revision 0 not supported, missing kernel module?'
stderr: 'iptables v1.8.11 (nf_tables): RULE_INSERT failed (No such file or directory): rule in chain INPUT'
Failed to execute ban jail 'xxxxxx' action 'iptables-multiport' info 'ActionInfo({'ip': 'xxxxxx', 'family': 'inet4', 'fid': <function Actions.ActionInfo.<lambda> at xxxxxx>, 'raw-ticket': <function Actions.ActionInfo.<lambda> at xxxxxx>})': Error starting action Jail('xxxxxx')/iptables-multiport: 'Script error'
厄介なのは、「特に設定を変えていないのに、fail2banを再起動すると何事もなかったかのように直る」という点です。「一体何が起きているの?」と頭を抱えている人に向けて、このエラーの正体と、すっきり解決するための根本対策を解説します。
1. エラーの原因:iptables(バックエンド)とカーネルモジュールのズレ
エラーメッセージを紐解くと、原因が2つ見えてきます。
-
Warning: Extension multiport revision 0 not supported...「multiport(複数ポート指定)のモジュールがカーネルにロードされていない、またはサポートされていないよ」という警告です。 -
iptables v1.8.11 (nf_tables): RULE_INSERT failed...近年のRed Hat系OS(Rocky Linux含む)では、内部的なパケットフィルタリングの仕組みが古いiptablesから新しいnftablesへと完全に移行しています。このエラーは、fail2banが「iptablesのふりをしたnftables(iptables-nft)」にルールを差し込もうとして、互換性の問題やモジュールの未ロードによって失敗したことを意味しています。
なぜ「再起動すると直る」のか?
システム起動直後や特定のタイミングでは、カーネルに必要なモジュール(xt_multiport など)がまだ読み込まれておらず、fail2banがエラーを起こします。
しかし、その後別のネットワーク処理や手動での再起動によって裏でカーネルモジュールが自動ロードされるため、設定をいじらなくても「再起動したらなんか直った」という現象が起きてしまうのです。
2. 【根本対策】アクションを「nftables」に変更する
Rocky Linux 10のような最新のOSでは、いつまでも互換レイヤー(iptables-multiport)を使い続けるよりも、OS標準の nftables を直接制御するようにfail2banの設定を変更するのが一番スマートで確実な根本対策です。
設定手順はとても簡単です。
設定手順
jail.local(または対象のJail設定ファイル)を開き、デフォルトのアクション(banaction)を iptables-multiport から nftables に書き換えます。
[DEFAULT]
# 修正前:banaction = iptables-multiport
# 修正後:OS標準のnftablesを直接使うように指定
banaction = nftables
banaction_allports = nftables[type=allports]
個別で別ファイルでjailを設定している場合は同様に変更します。
#action = iptables-multiport[name="http", port="http,https", protocol="tcp"] action = nftables-multiport[name="http", port="http,https", protocol="tcp"]
これだけで、fail2banは内部で nftables のコマンド(nft)を使って直接パケットを遮断するようになるため、存在しないiptablesのチェインやカーネルモジュールの読み込み問題に煩わされることがなくなります。
3. 設定変更後の確認
設定を保存したら、fail2banのサービスを再起動します。
Bash
sudo systemctl restart fail2ban
正しく nftables で動作しているかは、以下のコマンドで確認できます。fail2ban用のテーブル(f2b-xxxx)が自動で作成されていれば成功です。
Bash
sudo nft list tables
table inet firewalld
table ip filter
table inet f2b-table
4. AIにも設定変更後の状態を確認してもらいました!

確認しました。問題なさそうです。
fail2banはactive (running)/enabledfail2ban-client pingはpong- 稼働 jail は
apache-403-404, apache-badbots, recidive, sshdの4つ - 実行中の各 jail の action は
nftables/nftables-multiport系になっていました iptables側に fail2ban ルールは出ていませんnftables側にはtable inet f2b-tableが作成済みapache-403-404では現在 2 IP が ban されていて、nftables の set に反映されています- fail2ban の直近 journal に起動失敗や action エラーは見当たりません
補足として、設定ファイル内には未使用セクションの xinetd-fail に banaction = iptables-multiport-log が残っていますが、現在の稼働 jail 一覧には入っていないので現時点では影響していません。気になるなら後でコメントアウトまたは nftables 化しておくと整理できます。
まとめ
-
原因: Rocky Linux 10の
nftables環境下で、古いiptablesの互換アクション(multiport)を使っていることによるモジュール読み込みのタイムラグ。 -
挙動の謎: モジュールが後からロードされるため、再起動で直ったように見えていた。
-
対策:
banaction = nftablesに変更して、最新のパケットフィルタリングの仕組みに最適化する。
「再起動すれば直るからいいや」と放置しがちなエラーですが、いざという時にBANが失敗していてはセキュリティの意味がありません。Rocky Linux 10環境の方は、ぜひこの機会に nftables への移行を試してみてください!
【参考】
Failed to execute ban jail ‘ssh-ddos’ action ‘iptables-multiport’ · Issue #3212 · fail2ban/fail2ban
