ここでは、実際にパケットフィルタリングでファイアウォールを構築するために必要な基礎的な事項について解説します。項21.2 で解説した iptabels の基本的なコマンド書式を理解されていることが前提です。
通常、ファイアウォールを構築するには、デフォルトポリシーを DROP に設定し、通過を許可するパケットのみを ACCEPT するアプローチでネットワークを保護します。Turbolinux 10 Server の初期設定では全てのチェインのポリシーが ACCEPT(許可) に設定されていますのでポリシーの変更が必要です。現在設定されているデフォルトポリシーを確認するには、-L オプションを指定します。
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
ポリシーの変更は -P オプションを使用します。例えば、全てのチェインのデフォルトポリシーを DROP(破棄)にするには以下のコマンドを実行します。
# iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT DROP |
![]() | Turbolinux 10 Server に ssh などでリモートログインしている場合に、対象サービスのパケットを DROP(破棄)してしまうと、以降、オペレーション不能となりますので注意してください。 |
変更を確認してみます。
# iptables -L Chain INPUT (policy DROP) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination |
各チェインに設定したルールの順序は重要な意味を持ちます。チェインに入ってきたパケットは、そのチェインに設定されたルールと一致するかどうかが順番通りに調査され、ルールとマッチしたパケットは、それ以降のルールを調査しません。つまり、パケットがルールとマッチした時点で調査は終了します。したがって、ルールの順序を誤ると本来、破棄すべきパケットが通過してしまう可能性があります。必ず破棄したいパケットのルールは、チェインの先頭に記述しておき、その後に通過を許可するパケットを指定するように意識するとよいでしょう。

デフォルトポリシーを DROP に設定すると、ループバックインターフェイス(lo)の通信も途絶えてしまいます。ループバックアドレス(127.0.0.1)での通信を許可するには、以下のルールを設定します。
# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT |
Deny all のポリシーに基づきファイアウォールを構築するには、チェインのデフォルトポリシーを DROP に設定します。したがって、サービスを提供するには、チェインに許可するルールを追加しなければなりません。例えば、以下のような環境で Web サーバーを公開する場合を考えてみます。

この図の Web サーバーを公開するには、ホスト gateway にパケットの中継を許可するルールを追加しなければなりません。ここで重要なことは、クライアントから Web サーバーへのパケットと、そのリクエストに対する応答パケットが双方向にやり取りされていることです。これを理解するには、TCP コネクションの基本的な手続きを知らなければなりません。TCP のセッションは以下の図のように、3 つの段階を経て確立されます。これは、一般的に 3 Way HandShake と呼ばれています。

接続元のホストから接続先のホストへ SYN フラグをセットしたパケットを送信する
SYN パケットを受け取った接続先のホストは、SYN/ACK フラグをセットしたパケットを接続元のホストへ送信し、接続元から送信される ACK パケットを待ち受ける
接続元のホストから送信される ACK パケットを接続先のホストが受け取る
iptables では、接続元のホストから接続先のホストへ送信されるパケットと接続先のホストから接続元のホストへ送信されるパケットを別々のルールで指定します。したがって、ホスト gateway には、以下のようなルールが必要です。
# iptables -A FORWARD -i eth0 -p tcp -d 192.168.0.10 --dport 80 -j ACCEPT # iptables -A FORWARD -i eth1 -p tcp -m state --state ESTABLISHED --sport 80 -s 192.168.0.10 -j ACCEPT |
1 行目のルールでは、クライアントから Web サーバーへのリクエスト(TCP/80)を許可しています。2 行目のルールでは、Web サーバーからクライアントへの応答パケットを許可していますが、継続パケット以外の通過は拒否しています。これは、仮にクラッカーがホストに侵入したとしても、他のホストへの踏み台として利用されることを阻止できるメリットがあります。
上記は、Web サーバーを公開するための簡単な設定例ですが、他のサービスを公開する場合も同じようなルールが必要になります。このように、ある特定のパケットを許可するルールを設定するには、iptables コマンドの知識だけでなく、TCP/IP ネットワーク の統合的な知識が必要です。iptables でファイアウォールを構築するシステム管理者は、前提条件として、これらの技術を習得していなければなりません。
ユーザー定義チェインとは、ユーザーが新しいチェインを作成できる機能です。この機能は、複数のチェインで同じルールを設定するときに活用すると便利です。ユーザー定義チェインを作成するには、-N オプションを使用します。ここでは、チェイン名を userchain としています。
# iptables -N userchain |
作成した userchain チェインには、他のチェインと同じようにルールを設定していくことができます。ターゲットにユーザー定義チェインを指定すれば(この例では -j userchain)、パケットは作成したユーザー定義チェインへ入り、そこで設定されたルールに従い処理されます。マッチするルールが存在しなければ、もとのチェインに戻り、引き続き次のルールで調査されます。

クラッカーがファイアウォールを突破する手法として、送信元 IP アドレスを相手の IP アドレスに偽装したパケットを利用することがあります。このような偽装パケットによる攻撃は IP Spoofing と呼ばれます。したがって、明らかに送信元 IP アドレスが偽装された以下のようなパケットは、最低限、破棄しておきたい代表的なパケットと言えます。
送信元 IP アドレスが 127.0.0.0/8 で外部インターフェースから入ってきたパケット
送信元 IP アドレスがプライベート IP アドレスで外部インターフェースから入ってきたパケット
送信元 IP アドレスが内部ネットワークアドレスで外部インターフェースから入ってきたパケット
これらの偽装パケットを DROP する iptables の設定例は以下のようになります。ここでは外部ネットワークインターフェースに eth0、内部ネットワークアドレスに 192.168.0.0/24 を使用しているものとしています。
# iptables -A INPUT -i eth0 -s 127.0.0.1.8 -j DROP # iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP # iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP # iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP # iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j DROP |
通常、デフォルトポリシーは DROP に設定しますので、許可するパケットだけを適切に設定すれば、破棄するパケットをわざわざ設定する必要はありません。しかし、許可する設定を誤ると、本来破棄したいパケットが通過してしまう可能性もあります。チェインの先頭に確実に破棄したいパケットのルールを追加しておくことで、このようなトラブルを避けることができます。
なお、パケット転送を有効にしている場合は、FORWORD チェインにも同じルールを設定すべきです。そのようなときに、項21.3.5 で解説したユーザー定義チェインを利用するとメンテナンスが容易となるだけでなく、ルール自体も見通しのよいものになります。以下は、ユーザー定義チェイン userchain を作成し、INPUT チェインと FORWORD チェインのルールの先頭に挿入した例です。
# iptables -N userchain # iptables -A userchain -i eth0 -s 127.0.0.1.8 -j DROP # iptables -A userchain -i eth0 -s 10.0.0.0/8 -j DROP # iptables -A userchain -i eth0 -s 172.16.0.0/12 -j DROP # iptables -A userchain -i eth0 -s 192.168.0.0/16 -j DROP # iptables -A userchain -i eth0 -s 192.168.0.0/24 -j DROP # iptables -I INPUT 1 -j userchain # iptables -I FORWARD 1 -j userchain |
システムのログを監視し、ネットワークの安全性を保つことは、システム管理者にとって重要なタスクのうちの 1 つです。LOG ターゲットを使用するとルールにマッチしたパケット情報をシスログに出力することができます。標準の設定では、ファッシリティに kern、プライオリティに warn が設定されており、ログは /var/log/messages に出力されます。シスログのプライオリティやログにプレフィックスを指定したい場合は、以下のログオプションを使用できます。これらのログオプションは以下のように LOG ターゲットのあとに指定します。
iptables COMMANDS chain rule-specification -j LOG log_option |
表 21-9. log_option
| --log-level level | シスログのプライオリティを level に指定します。 |
| --log-prefix prefix | ログに出力するプレフィックスを指定します。 |
例えば、以下のように指定すると、ping コマンドによる ICMP Echo Request のログが /var/log/messages に出力されます。
# iptables -A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix iptables: |
/var/log/messages には以下のようなログが出力されます。
Jun 10 16:23:47 turbolinux kernel: iptables:IN=eth0 OUT=MAC=00:50:da:92:76:22:00:90:cc:10:6e:ad:08:00 SRC= 192.168.0.10 DST=192.168.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=51475 SEQ=0 |