Linuxサーバで通信制御を行う際、iptables
のルールを設定しても期待通り反映されない、または再起動や別ツールの影響で上書きされてしまうことがあります。
この記事では、そのような状況での原因と修正方法を体系的に解説します。
目次
主な症状
- 手動で設定したルールがすぐに消える
- 再起動後にルールが初期化される
- 他のサービス(例:firewalld, ufw)が上書きしている
- 意図したポートが開放/遮断されない
想定環境
- OS:RHEL / CentOS / Rocky / AlmaLinux / Ubuntu
- 管理ツール:iptables、firewalld、nftables など
原因と修正方法
原因 | 説明 | 修正方法 |
---|---|---|
① firewalld と iptables の競合 | CentOS/RHEL 7 以降では firewalld が iptables のラッパーとして動作します。直接 iptables を操作すると、firewalld が上書きします。 | firewalldを無効化し、iptablesを直接管理するか、firewall-cmdで設定します。 例:firewalld無効化 bash<br>sudo systemctl stop firewalld<br>sudo systemctl disable firewalld<br> 例:firewalld経由で設定 bash<br>sudo firewall-cmd --add-port=80/tcp --permanent<br>sudo firewall-cmd --reload<br> |
② ルールが永続化されていない | 手動で設定したルールは再起動時に失われます。 | 設定を保存・復元するようにします。 例(RHEL系) bash<br>sudo service iptables save<br> または bash<br>sudo iptables-save > /etc/sysconfig/iptables<br> 起動時に読み込み bash<br>sudo systemctl enable iptables<br> |
③ 他ツール(cloud-init, ufw, dockerなど)が上書き | Docker や ufw が独自のチェーンを生成し、既存ルールを上書きすることがあります。 | 対象ツールの挙動を理解し、チェーンの順序を調整。 例:Dockerチェーンの確認 bash<br>sudo iptables -L -n --line-numbers<br> Dockerネットワークの変更 bash<br>sudo nano /etc/docker/daemon.json<br># "iptables": false を設定<br> |
④ nftables に移行しているシステム | RHEL9 / Debian11以降では iptables コマンドが nftables のラッパになっているため、設定が反映されないことがあります。 | nft コマンドを使用して設定を行うか、iptables-legacyを使用します。例:nftablesでのルール追加 bash<br>sudo nft add rule inet filter input tcp dport 80 accept<br> |
⑤ チェーンの順序やポリシー設定の誤り | INPUTチェーンにREJECTが先にあるなど、順序の問題で通らない。 | 順序を見直す。 ルール確認 bash<br>sudo iptables -L INPUT --line-numbers<br> 特定ルール削除 bash<br>sudo iptables -D INPUT 1<br> |
具体的な確認コマンド例
# 現在のルール確認
sudo iptables -L -n -v
# ルールの番号付き表示
sudo iptables -L INPUT --line-numbers
# 永続化ファイル内容確認(RHEL系)
cat /etc/sysconfig/iptables
# firewalld状態確認
sudo systemctl status firewalld
トラブル発生時の手順まとめ
手順 | 内容 |
---|---|
① | firewalld が有効か確認 (systemctl status firewalld ) |
② | iptables -L -n -v でルールを確認 |
③ | Docker や ufw が上書きしていないか確認 |
④ | 永続化ファイルの有無確認 (/etc/sysconfig/iptables ) |
⑤ | 必要に応じて nftables への切り替え検討 |
原因と対応の対応表
原因 | 対応方法 |
---|---|
firewalldによる上書き | firewalld停止またはfirewall-cmdで設定する |
永続化されていない | iptables-save または service iptables save を使用 |
Docker/ufwによる上書き | 設定順序を調整、または該当ツールの設定変更 |
nftablesとの競合 | nft コマンドまたは iptables-legacy を使用 |
チェーン順序誤り | ルール順序を確認し、不要ルール削除・並び替え |
まとめ
iptables ルールが反映されない原因の多くは firewalldとの競合 または 永続化設定の不足 によるものです。
Dockerやnftablesの影響も見逃せません。
「どのサービスがルールを管理しているのか」を整理し、適切な方法で永続化・管理することが安定運用の鍵です。