変更要約: 初版(主題2.12・副主題2.12.1〜2.12.4に対応)
6.1iptables/firewalldによるパケットフィルタリング
iptables/ip6tables によるパケットフィルタリングの仕組みと、より抽象化されたfirewalld(firewall-cmd)・ufw を学びます。/proc/sys/net/ipv4/・/proc/sys/net/ipv6/ によるカーネルパラメータ、ルーティングテーブル、ポートリダイレクト、/etc/services、設定の永続化(iptables-save/iptables-restore)を押さえます。
サーバーを外部に晒す以上、「どの通信を通し、どれを遮断するか」を明確にするのがファイアウォールの役目です。Linux ではiptablesがカーネルのパケットフィルタ機能を直接操作する伝統的な手段で、firewalldやufwはそれをゾーン・サービス単位で扱いやすくした上位レイヤーです。
6.1.1iptables/ip6tablesの基本
- iptables=IPv4 パケットフィルタ設定コマンド。ip6tables=IPv6 版で別コマンド・別ルールセット(IPv4 のルールは IPv6 通信に効かない)。
- カーネルのパケット転送や応答挙動は/proc/sys/net/ipv4/・/proc/sys/net/ipv6/以下の仮想ファイルで制御(例
net.ipv4.ip_forwardを1にするとルータとして転送)。 - パケットの行き先判断はルーティングテーブルが決め、ファイアウォールはその前後で許可/拒否を判定する。ポートリダイレクト(宛先ポート変換)は NAT テーブルの
PREROUTINGで行い、待受ポート番号と名前の対応は/etc/servicesで確認できる。
6.1.2firewalld・ufuw・永続化
- firewalld=firewall-cmd で操作する動的ファイアウォール管理サービス。ネットワークインターフェースをゾーン(public/internal/trusted 等)に割り当て、ゾーンごとにサービス・ポートの許可を設定する。
- ufw(Uncomplicated Firewall)=iptables をよりシンプルなコマンド体系で扱うフロントエンド。
ufw allow 22/tcpのように直感的にルールを追加できる。 - iptables のルールはメモリ上のみで再起動すると消えるため、iptables-saveでファイルへ書き出し、iptables-restoreで読み戻して永続化する(ディストリのサービス経由で起動時に自動適用させるのが定石)。
「IPv6 通信を守るには ip6tables が別途必要(iptables だけでは効かない)」「firewalld はゾーン単位、ufw はシンプルなコマンド体系」「ルールの永続化は iptables-save/iptables-restore」 が最頻出です。ポート番号とサービス名の対応先=/etc/services、転送の有効化=/proc/sys/net/ipv4/ip_forward、という組み合わせも問われます。
運用でよくある要件「社内向けWebサーバーへの外部からのSSHは遮断しつつ、社内セグメントからは許可したい」を考えると、各ツールの立ち位置が見えてきます。素のiptablesなら filter テーブルの INPUT チェーンに、送信元ネットワークで絞った ACCEPT ルールを先に置き、末尾のデフォルト DROP/REJECT で残りを遮断します。同じことをfirewalldでやるなら、社内セグメントのインターフェースを internal ゾーンへ、外部向けインターフェースを public ゾーンへ割り当て、internal ゾーンだけ ssh サービスを許可します(firewall-cmd --zone=internal --add-service=ssh --permanent の後 firewall-cmd --reload)。ポートフォワード(例:外部の8080番を内部のWebサーバーの80番へ)は NAT テーブルの PREROUTING チェーンで宛先変換(DNAT)を行う操作で、firewalld でも --add-forward-port として同等の機能があります。IPv6 も同時に運用しているなら、iptables のルールは ip6tables には引き継がれないため、ICMPv6 の近隣探索などIPv6特有のトラフィックも含めて ip6tables 側に個別にルールを書く必要がある点は見落としがちです。設定を検証したら、再起動後も同じ状態を保てるようにiptables-save > /etc/sysconfig/iptablesのようにファイル化し、起動時にiptables-restoreで読み込む仕組みを組み込みます。
| ツール | 操作単位 | 永続化 |
|---|---|---|
| iptables/ip6tables | チェーン・ルール(低レベル) | iptables-save/iptables-restore |
| firewalld | ゾーン・サービス(firewall-cmd) | --permanent+--reload |
| ufw | シンプルなallow/denyルール | デフォルトで永続化 |
ひっかけ: 「iptables で IPv4 のフィルタルールを設定すれば IPv6 通信も遮断される」は誤りです。IPv6 には別コマンド・別ルールセットの ip6tables が必要です。また「firewalld の設定は firewall-cmd を実行した瞬間から再起動後も有効」も誤り=--permanent を付けずに追加した設定は実行中の設定のみに反映され、--permanent を付けたルールも --reload するか再起動しないと即時反映されません。
6.1.3この節のまとめ
- iptables=IPv4/ip6tables=IPv6(別ルールセット)。永続化はiptables-save/iptables-restore
- firewalld=ゾーン単位(firewall-cmd・--permanent+--reload)/ufw=簡易コマンド。ポート対応は/etc/services
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. サーバーで IPv4 と IPv6 の両方を運用しており、両方のプロトコルで同じ遮断ポリシーを適用したい。適切な対応は?
Q2. firewalld で internal ゾーンにのみ SSH サービスを恒久的に許可し、即座に反映させたい。適切な手順は?
Q3. 再起動後も iptables のフィルタルールを維持したい。適切な運用は?

