5.2. カーネルのセットアップ

iptables の根幹部分を機能させるには、カーネルの make config あるいはそれに類するコマンドの中で、下記のオプションを設定する必要がある:

CONFIG_PACKET -- このオプションによって、様々なネットワークデバイスと直接やりとりしながら働くようなアプリケーションやユーティリティが、動作可能となる。そうしたユーティリティには tcpdumpsnort などがある。

Note

厳密に言えば、CONFIG_PACKETiptables を動作させるのに必須ではないのだが、実に様々な使い方ができるので、ここに含めることにした。入れたくないなら入れなくてもいい。

CONFIG_NETFILTER -- コンピュータをインターネットへのファイヤーウォールかゲイトウェイとして使うつもりなら、このオプションが必要。言い換えれば、そもそもこのチュートリアルに出てくる何かひとつでも働かせたいなら、何はなくとも必ず要る。このドキュメントを読んでいるということは、必要なはずだ。

それにもちろん、インターフェースをきちんと動作させるための適切なドライバも加えなくてはいけない。イーサネットアダプタPPPSLIP インターフェースなどだ。上記は iptables の根幹の一部を加えてくれるだけ。正直言って建設的なことは何もしていないわけで、ただカーネルに骨組みを与えているだけだ。 iptables でより高度なオプションを使うには、適切なカーネル設定オプションを加えなければならない。これから、ベーシックな 2.4.9 カーネルで指定できるオプションの紹介と、その簡単な説明をしていこう:

CONFIG_IP_NF_CONNTRACK -- このモジュールはコネクション追跡 (Connection tracking) を行うのに必要。コネクション追跡はいろいろな用途に利用されるが、特に NATマスカレード (Masquerading) で重要となる。 LAN のマシンをファイヤーウォールで守りたいのなら、絶対にマークを付けなくてはならない。例えば rc.firewall.txt を動かすためにも必須条件となる。

CONFIG_IP_NF_FTP -- FTP 接続のコネクション追跡を行いたいならこのモジュールが必要。FTP 接続は、通常の状態では追跡が非常に困難なため、conntrack だけでなく、ヘルパー と呼ばれる追加モジュールが必要となる。このオプションがそのヘルパーのコンパイル指定だ。このモジュールを加えないと、ファイヤーウォールやゲイトウェイを越えて FTP することはできない。

CONFIG_IP_NF_IPTABLES -- 何かしらのフィルタやマスカレードNAT を行いたいなら、このオプションが必要。これはまさに iptables の識別構造の一切合切をカーネルに与える。 iptables で何かやるなら、これがなくては始まらない。

CONFIG_IP_NF_MATCH_LIMIT -- 厳密には必須でないが、rc.firewall.txt で使っている。このオプションは LIMIT マッチを可能にする。つまり、しかるべきルールを書くことで、1 分あたりにいくつのパケットがマッチするかを制御することができる。例を挙げると、-m limit --limit 3/minute には、1 分あたり 3 個のパケットがマッチする。このモジュールはまた、ある種の DoS 攻撃を避けるのにも利用できる。

CONFIG_IP_NF_MATCH_MAC -- これは MAC アドレスによるパケットマッチを可能にする。イーサネットアダプタ は必ず MAC アドレスを持っている。MAC アドレスは滅多に変わらないため、例えば、どういった MAC アドレスを使用しているかによってパケットを遮断すれば、特定のコンピュータを非常に効果的にブロックすることができる。 rc.firewall.txt をはじめ、どの例でも、このオプションは使っていない。

CONFIG_IP_NF_MATCH_MARK -- MARK マッチを可能にする。 MARK ターゲットを使えば、パケットにマークを付けておき、マークがセットされているかどうか調べることで、マークを評価基準としたマッチが行える。実のところ、このオプションは MARK マッチに関するものだが、MARK ターゲット に関するオプションも後で出てくる。

CONFIG_IP_NF_MATCH_MULTIPORT -- 宛先または送信元ポートを複数指定してパケットをマッチさせることができる。こうしたことは通常は不可能だが、これを使えば可能になる。

CONFIG_IP_NF_MATCH_TOS -- この評価を使えば、パケットの TOS フィールドに基づいてパケットをマッチさせられる。 TOS とは Type Of Service のこと。TOSmangle テーブルのしかるべきルールや ip/tc のコマンドを使用して書き換える こともできる。

CONFIG_IP_NF_MATCH_TCPMSS -- MSS フィールドに基づいて TCP パケットのマッチを行う機能を追加する。

CONFIG_IP_NF_MATCH_STATE -- これは、ipchains との違いの中で最も大きな話題のひとつだ。このモジュールのおかげで、パケットのステートフルマッチが行える。例えば、ある TCP コネクションで既に双方向のトラフィックを検出している時、このパケットは ESTABLISHED と判定される。 rc.firewall.txt の中でも駆使している。

CONFIG_IP_NF_MATCH_UNCLEAN -- このモジュールは、タイプの規定に従わない IPTCPUDPICMP パケットや、無効なパケットを選別する機能を追加する。例えば、パケットの正当性に無頓着に、これらのパケットを捨て去ることができる。留意すべきは、このマッチはまだ実験段階にあり、たいていの場合完全には機能しないという点だ。

CONFIG_IP_NF_MATCH_OWNER -- このオプションはソケット のオーナーに基づいたマッチ機能を追加する。例えば、root にだけインターネットアクセスを許すといったことができる。このモジュールは元々、新しい iptables の機能を示す例として書かれたもの。このマッチは実験段階にあり、必ずうまく動くとは限らない点に注意。

CONFIG_IP_NF_FILTER -- このモジュールは基本的な filter テーブルを加え、これによって初めて IP フィルタリングが可能となる。 filter テーブル内には INPUT チェーン、FORWARD チェーン、OUTPUT チェーンがあるということは、後々分かるだろう。送受信パケットについて何にせよフィルタリングを行うつもりなら、このモジュールは必要だ。

CONFIG_IP_NF_TARGET_REJECT -- このターゲットを用いれば、入ってくるパケットに対して、黙殺して床に投げ捨てるのではなく ICMP エラーメッセージを返すことができる。 ICMPUDP とは異なり、 TCP では TCP RST パケットによって接続のリセットや拒否ができるということも記憶に留めておこう。

CONFIG_IP_NF_TARGET_MIRROR -- パケットをその送り主に跳ね返すことが可能となる。例えば、 INPUT チェーンで宛先ポート HTTP に対して MIRROR ターゲットを設定しておく。ある人がこのポートにアクセスしようとすると、パケットは跳ね返されるので、結果として彼には自分のホームページが見えるはずだ。

Warning

MIRROR ターゲットは、軽々しく使っていい類のターゲットではない。 MIRROR ターゲットは元々テスト向けの用例モジュールとして作られたものであり、得てして、設定を行った側に重大な危険をもたらす (例えば極度の DDoS に陥る等)。

CONFIG_IP_NF_NAT -- このモジュールは様々な形でのネットワークアドレス変換 つまり NAT を可能とする。テーブル群のうちの nat テーブルへアクセスできるようになる。ポートフォワードやマスカレードなどを行うには、このオプションが必要だ。LAN のファイヤーウォール構築やマスカレードには必須ではないが、ユニークな [訳者補足:インターネットで有効な] IP アドレスをホスト全部に与えられる場合を除き、これは備えておかなくてはならない。そういうわけで、 rc.firewall.txt スクリプトを動作させるのに必要だし、そもそも、上記のような IP アドレスを自由に追加できないネットワークでは、なくてはならないモジュールだ。

CONFIG_IP_NF_TARGET_MASQUERADE -- このモジュールは MASQUERADE ダーゲットを加える。例えば、どんな IP でインターネットにつながっているか分からない時に、 IP を獲得するための手段として、 DNATSNAT の代わりに用いることが多い。言い換えると、DHCPPPPSLIP などによって IP をもらっているなら、 SNAT でなくこちらを使う必要がある。マスカレードはコンピュータへの負荷が NAT よりも多少大きいが、 IP アドレスをあらかじめ調べておかなくても機能してくれるのが強みだ。

CONFIG_IP_NF_TARGET_REDIRECT -- このターゲットはアプリケーションプロキシを使う場合などに便利。パケットを直に遣り取りする代わりに、パケットをリマップしてローカルマシンに送ることができる。つまり、この手段によって透過プロキシの構築が可能となる。

CONFIG_IP_NF_TARGET_LOG -- LOG ターゲットを加え、 iptables にそれを利用する能力を与える。このモジュールを使えば、特定のパケットを syslogd に記録させることができ、ひいては、パケットに何が起きているのか調べることができる。セキュリティ監査とスクリプトのデバグにはもってこいの機能。

CONFIG_IP_NF_TARGET_TCPMSS -- このオプションは、 ICMPFragmentation Needed パケットをブロックしてしまうインターネットサービスプロバイダと対峙するのに使う。 WEBページが通らない、小さなメールはいいが大きなメールが通らない、ssh はいいが scp がだんまりになる、などといった症状だ。その場合、 TCPMSS ターゲットを使用し、 MSS (Maximum Segment Size) を PMTU (Path Maximum Transmit Unit) へ強制的に書き換えることによって障害を乗り越えることができる。カーネルの設定ヘルプで Netfilter の制作者たちがいうところの 「犯罪的にトロいISPやサーバ」 に、これでもって立ち向かえるのだ。

CONFIG_IP_NF_COMPAT_IPCHAINS -- 旧式 ipchains との互換モードを加える。 Linux 2.2 カーネルから Linux 2.4 カーネルへ移行する際の、根本的永続的な解決策だと思ってはいけない。カーネル 2.6 ではうまく面倒を見てくれるだろうから。

CONFIG_IP_NF_COMPAT_IPFWADM -- 旧式 ipfwadm との互換モード。根本的永続的な解決策だと思ってはいけない。

ご覧の通り、オプションは山のようにある。各モジュールでどんな付加機能が得られるのか、ざっと説明してきたわけだが、これらは、無垢な Linux 2.4.9 カーネルで利用できるオプションのみに過ぎない。もっとたくさんのオプションが知りたければ、 Netfilter のユーザ空間にある patch-o-matic (POM) 機構を覗いてみるといいだろう。そうすれば、カーネルに追加できるオプションはまだまだ出てくる。 POM パッチは、行く行くカーネルに加わる予定だがまだカーネルに盛り込まれていない追加オプションたちだ。入り込めていないのにはいろいろと理由がある。パッチの安定性が充分でない、 Linus Tovalds 氏が把握しきれていない、カーネルのメインストリームに乗せるにはまだ実験的すぎる、などなどの理由だ。

rc.firewall.txt スクリプトを動作させるには、下記のオプションがカーネルにコンパイルされている必要がある。他のスクリプトに必要なオプションが知りたい時は、スクリプト例のセクションを見てほしい。

rc.firewall.txt スクリプトには、最低でも上記のものが必要だ。各スクリプトが必要とするものは、そのセクションで随時説明する。さしあたり、今精査すべきメインスクリプトに集中することにしよう。