サーバーを構築してから「iptablesのコマンドが複雑でどこから手をつければいいかわからない」「firewalldは使えるが、内部で何が起きているか把握できていない」――こう感じているLinux管理者は少なくありません。
現在はfirewalldやnftablesといった使いやすいフロントエンドが普及していますが、クラウドVPS・コンテナホスト・旧来のCentOS環境など、iptablesを直接扱わなければならない場面は今も多くあります。また、iptablesを理解しておくと、Linuxカーネルがどのようにパケットを処理するかという根本的な仕組みが把握でき、トラブルシューティング力が大きく向上します。
この記事では、iptablesのテーブル・チェーンの概念から、サーバーを守る実践的なルール設定まで、インフラエンジニア・社内SEが「明日から使える」レベルで解説します。

iptablesとは?Linuxカーネルのnetfilterを操作するツール
iptablesは、Linuxカーネルに組み込まれたnetfilterというパケットフィルタリングフレームワークを制御する、ユーザースペースのコマンドツールです。1997年頃から存在し、現在も多くのサーバーで稼働しています。
ネットワークパケットがサーバーに届いたとき、カーネルはnetfilterの仕組みを通じて「どのパケットを通すか・捨てるか」を判断します。iptablesはその判断ルールを読み書きするためのインタフェースです。
firewalldはiptablesやnftablesをバックエンドとして使うフロントエンドツールです。nftablesはiptablesの後継として設計されました。どちらを使う場合でも、パケットフィルタリングの基礎概念はiptablesを通して理解しておくと応用が効きます。
テーブルとチェーンの2層構造を理解する
iptablesのルールはテーブル(table)とチェーン(chain)という2層構造で管理されます。この概念を先に理解しておくと、コマンドの意味が格段にわかりやすくなります。
1. 主なテーブルの種類
iptablesには複数のテーブルがありますが、セキュリティ設定で最もよく使うのは filter テーブルです。
・filterテーブル: パケットを通すか捨てるかを決める。ファイアウォール設定の主戦場
・natテーブル: ネットワークアドレス変換(NAT)に使う。ルーターやIPマスカレードの設定で使用
・mangleテーブル: パケットヘッダーを書き換える特殊な用途。一般的なサーバー設定では使用頻度は低い
特に指定しない限り、iptablesコマンドは filter テーブルを操作します。
2. チェーンの種類と役割
テーブルの中には複数のチェーンがあり、パケットが通過する経路ごとに異なるチェーンでルールが評価されます。filterテーブルには以下の3つの組み込みチェーンがあります。
・INPUTチェーン: このサーバー宛てに届いたパケット。SSH接続やWebリクエストの受信を制御する
・OUTPUTチェーン: このサーバーから外部に送信されるパケット
・FORWARDチェーン: このサーバーを経由して転送されるパケット。ルーターとして動作する場合に使用
一般的なWebサーバー・SSHサーバーの設定では、INPUTチェーンのルール設定が最も重要です。
3. ルールの評価順序とデフォルトポリシー
チェーン内のルールは上から順番に評価され、最初にマッチしたルールのターゲットが適用されます。どのルールにもマッチしなかった場合は、そのチェーンのデフォルトポリシーが適用されます。
・ACCEPT: パケットを通す
・DROP: パケットを捨てる(送信元に通知なし)
・REJECT: パケットを拒否して送信元にエラーを返す
・LOG: パケット情報をsyslogに記録する(処理は続行)
基本的なルールの書き方
iptablesのルール追加コマンドの基本構文は以下のとおりです。
# 基本構文 iptables -A <チェーン> [マッチ条件] -j <ターゲット> # 例: TCPの22番ポートへの接続を許可 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 現在のルール一覧を表示(パケットカウンタ付き) iptables -n -v -L
主なオプションを整理します。
・-A <チェーン>: ルールをチェーンの末尾に追加(Append)
・-I <チェーン> <番号>: ルールを指定した位置に挿入(Insert)
・-D <チェーン>: ルールを削除(Delete)
・-p <プロトコル>: プロトコルを指定(tcp/udp/icmpなど)
・-s <IPアドレス>: 送信元IPアドレスを指定
・–dport <ポート番号>: 宛先ポートを指定(-pとセットで使用)
・-m state –state: 接続状態でフィルタリング(ESTABLISHED/NEW/RELATEDなど)
・-m limit –limit: 接続頻度を制限するレート制限
・-j <ターゲット>: マッチ時の動作(ACCEPT/DROP/REJECT/LOG)
・-n: IPアドレスをホスト名に逆引きしない(一覧表示の高速化)
・-L: 現在のルール一覧を表示
サーバーを守る実践的なルール設定
ここでは、SSHとHTTP/HTTPSを提供する一般的なLinuxサーバー向けの実践的な設定を解説します。ルールは上から順番に評価されるため、記述順序が重要です。
1. デフォルトポリシーをDROPに設定する
「明示的に許可したもの以外はすべて拒否する」という考え方がセキュリティの基本です。まずINPUT・FORWARDチェーンのデフォルトポリシーをDROPにします。
【注意】デフォルトDROPを設定すると、後続のルール設定を誤るとSSH接続できなくなります。コンソールアクセスが確保できる環境か、接続が切れても問題ない状況で作業してください。
# デフォルトポリシーをDROPに設定 iptables -P INPUT DROP iptables -P FORWARD DROP # OUTPUTは通常ACCEPTのまま iptables -P OUTPUT ACCEPT
2. ループバックと確立済み接続を許可する
ローカルホスト(127.0.0.1)からの通信と、既に確立済みのTCPセッションを許可します。この2つは必ず最初に設定します。ループバックを忘れると、データベース接続など内部プロセス間通信が壊れることがあります。
# ループバックインタフェースを許可 iptables -A INPUT -i lo -j ACCEPT # 確立済み・関連接続を許可(レスポンスパケットがブロックされないように) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3. SSH接続を制限する
SSH(ポート22)はブルートフォース攻撃の主な標的です。可能であれば送信元IPアドレスを絞り込みます。固定IPアドレスが使える場合はそのIPのみ許可するのが最善です。
# 想定例: 管理用PCのグローバルIPが203.0.113.10/32の場合 iptables -A INPUT -p tcp --dport 22 -s 203.0.113.10/32 -j ACCEPT # 送信元IPを絞れない場合はレート制限を設ける # (1分あたり新規接続3回まで、初回バースト上限5) iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT
より高度なブルートフォース対策には、fail2banを組み合わせる方法も有効です。sshd_configの設定強化については、Linuxのsshd_config設定完全ガイドもあわせて参照してください。
4. HTTP・HTTPSを許可する
WebサーバーとしてHTTP(80番)・HTTPS(443番)を提供する場合は以下のルールを追加します。
# HTTP・HTTPSを許可 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
5. ICMPエコーリクエスト(ping)を許可する
pingに使われるICMPを完全に遮断すると、ネットワーク疎通確認ができなくなります。echo-requestのみ許可するのが現実的です。
# ICMPエコーリクエスト(ping)を許可 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
6. 拒否パケットをログに記録する
DROPされたパケットをsyslogに記録しておくと、後から攻撃の痕跡を調査できます。LOGターゲットはパケットを通過させるため、最終的なDROPルールの直前に配置します。
# DROPされるパケットをsyslogに記録(プレフィックスで識別しやすくする) iptables -A INPUT -j LOG --log-prefix "iptables_DROP: " --log-level 4
7. 想定例: Webサーバー向けルールセットの全体像
以上のルールをまとめた設定例を示します(SSH送信元IP制限あり・HTTP/HTTPS全許可の構成)。実際の運用では自社環境に合わせて調整してください。
# 想定例: 一般的なWebサーバー向けiptables設定 # デフォルトポリシー設定 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # ループバック許可 iptables -A INPUT -i lo -j ACCEPT # 確立済み・関連接続を許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ICMPエコーリクエスト許可 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # SSH許可(レート制限付き: 1分あたり3接続・バースト5) iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT # HTTP/HTTPS許可 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # DROPパケットをログに記録 iptables -A INPUT -j LOG --log-prefix "iptables_DROP: " --log-level 4
ルールを永続化する方法
iptablesのルールはサーバーを再起動すると初期化されます。設定を恒久化するには以下の方法を使います。
1. iptables-saveとiptables-restoreを使う
# 現在のルールをファイルに保存 iptables-save > /etc/iptables/rules.v4 # 手動でルールをロードする場合 iptables-restore < /etc/iptables/rules.v4
2. iptables-persistentを使う(Debian/Ubuntu系)
# iptables-persistentのインストール(インストール時にルール保存の確認がある) apt-get install iptables-persistent # 後から手動で保存する場合 netfilter-persistent save # ルールは /etc/iptables/rules.v4 に保存され、起動時に自動ロードされる
3. systemdサービスを使う(RHEL/CentOS系)
# iptablesサービスの起動と自動起動設定 systemctl start iptables systemctl enable iptables # 設定を保存(/etc/sysconfig/iptablesに書き込まれる) service iptables save
中小企業でも今日からできること
フルセットのルールを一度に設定するのが難しい場合は、以下の3ステップから始めましょう。
・ステップ1: まずループバックと確立済み接続の許可ルールを追加する(既存サービスへの影響を最小化)
・ステップ2: SSH接続を送信元IPアドレスで制限する(固定IPアドレスが使える場合)
・ステップ3: 必要な許可ルールをすべて確認してからデフォルトポリシーをDROPに変更する
Linuxのファイル権限管理など基礎的なサーバー知識については、姉妹サイトLinuxMaster.JPでも詳しく解説しています。
よくある誤解と注意点
【注意1】デフォルトDROPの設定順序を間違えない
一般的なつまずきとして、iptables -P INPUT DROPを実行した直後にSSH接続が切れるという事態があります。デフォルトポリシーをDROPにする前に、必要な許可ルールをすべて追加してから実行してください。万が一ロックアウトされたときのために、コンソールアクセスを確保しておくか、cronで「一定時間後にルールをリセットする」仕組みを事前に仕込んでおくと安全です。
【注意2】iptablesとfirewalldを同時に使わない
RHEL/CentOS 7以降では、firewalldが標準のファイアウォール管理ツールとして動作しています。iptablesを直接操作しながらfirewalldも稼働させると、ルールが競合することがあります。どちらか一方に統一することが重要です。
# iptablesを直接使う場合はfirewalldを停止する systemctl stop firewalld systemctl disable firewalld # マスクしておくと誤って起動されるのを防げる systemctl mask firewalld
【注意3】ルールの記述順が評価結果を左右する
iptablesは上から順にルールを評価し、最初にマッチした時点で処理を確定します。「すべてDROPする」ルールを先頭に置いてしまうと、後に書いた許可ルールは一切機能しません。ルールの追加には -A(末尾追加)よりも -I <番号>(位置指定挿入)を使い、意図した順番になっているかを iptables -n -v -L で確認する習慣をつけましょう。
【注意4】IPv6にはip6tablesが必要
iptablesはIPv4専用です。IPv6通信を制御するにはip6tablesコマンドで別途ルールを設定する必要があります。IPv6を無効化していない環境では、ip6tablesでも同様にDROPポリシーを設定しておくことを推奨します。

本記事のまとめ
iptablesはLinuxのパケットフィルタリングを直接制御できる強力なツールです。テーブル・チェーン・ルールの3層構造を理解すれば、複雑に見えた設定も整理されて見えてきます。
| 設定項目 | 推奨設定 | 優先度 |
|---|---|---|
| デフォルトポリシー | INPUT/FORWARD: DROP | 高(必須) |
| ループバック許可 | -i lo -j ACCEPT | 高(必須) |
| 確立済み接続許可 | ESTABLISHED,RELATED | 高(必須) |
| SSH接続制限 | 送信元IP制限 + レート制限 | 高 |
| DROPパケットのログ | LOGターゲット | 中 |
| ルールの永続化 | iptables-persistent / systemd | 高 |
iptablesの設定に慣れてきたら、Linuxの不審なプロセス・ネットワーク接続の調査手順も合わせて学んでおくと、インシデント対応の幅が広がります。
PR
iptablesをはじめとするLinuxサーバーのセキュリティ設定を、設定手順から運用まで体系的に解説した実践書。本記事で解説した内容をさらに深く学びたい方に最適の1冊です。
