Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

【Rocky Linux 10】fail2banでiptables-multiportエラーが発生!再起動で直る謎と根本対策

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

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つ見えてきます。

  1. Warning: Extension multiport revision 0 not supported... 「multiport(複数ポート指定)のモジュールがカーネルにロードされていない、またはサポートされていないよ」という警告です。

  2. 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にも設定変更後の状態を確認してもらいました!

確認しました。問題なさそうです。

  • fail2banactive (running) / enabled
  • fail2ban-client pingpong
  • 稼働 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-failbanaction = iptables-multiport-log が残っていますが、現在の稼働 jail 一覧には入っていないので現時点では影響していません。気になるなら後でコメントアウトまたは nftables 化しておくと整理できます。

まとめ

  • 原因: Rocky Linux 10の nftables 環境下で、古い iptables の互換アクション(multiport)を使っていることによるモジュール読み込みのタイムラグ。

  • 挙動の謎: モジュールが後からロードされるため、再起動で直ったように見えていた。

  • 対策: banaction = nftables に変更して、最新のパケットフィルタリングの仕組みに最適化する。

「再起動すれば直るからいいや」と放置しがちなエラーですが、いざという時にBANが失敗していてはセキュリティの意味がありません。Rocky Linux 10環境の方は、ぜひこの機会に nftables への移行を試してみてください!

【参考】

iptables v1.8.2 (nf_tables): RULE_APPEND failed (Invalid argument): rule in chain OUTPUT – Server Fault

Failed to execute ban jail ‘ssh-ddos’ action ‘iptables-multiport’ · Issue #3212 · fail2ban/fail2ban

 

タイトルとURLをコピーしました