前回まで3回にわたって,Linuxカーネルのネットワーク機能を解説しました。取り上げたのは,現在主流のネットワーク・プロトコルである TCP/IPの基本機能です。TCP/IPは標準的なプロトコルですから,Linuxだけでなく他の多くのOSでも利用できます。基本機能については,他のOSの実装も大体似通ったものとなっています。

 Linuxは,TCP/IPの基本機能のほかに,さまざまな拡張機能を備えています。この記事の読者の方なら,一度はLinuxカーネルを再構築したことがあると思います。再構築の際にはカーネルの諸機能を設定するのですが,ネットワーク関連機能については実にさまざまなオプションが存在します。これらのオプションのほとんどは,「Networking options」という項目に収まっていますので,ぜひご覧下さい。今回は,良く利用される拡張機能について紹介します。

パケット・フィルタリング

 拡張機能の中で最も利用されるのが,パケット・フィルタリング機能です。これは特定のパケットの受信や送信を制御する機能で,ファイアウオールなどを作成する際に利用されます。カーネル設定では「Network packet filtering」という項目に当たります。

 現在多くのディストリビューションが,カーネルのパケット・フィルタリング機能を使ったファイアウオールを装備しています。例えば,Red Hat Linuxなどをインストールする際にファイアウオール設定をしますが,そこではこのパケット・フィルタリング機能を設定しています。

 カーネルのパケット・フィルタリング機能は,1994年後半には開発されており,1996年にリリースされたカーネル2.0では既に実装されています。現在のカーネル2.6に比べると十分な実装とは言えませんが,送信元ごとにパケットを送受信を許可,不許可,拒絶するといった基本的なパケット制御を備え,さらにNAT(Network Address Translation)というアドレス変換機能にも対応していました。外部IPアドレスと内部IPアドレスを単純に1対1変換するだけでなく,1対多変換できる「NAPT」(Network Address Port Translation)機能*1もサポートしていたことから,ルーター構築用のOSとして重宝されていました。そのころのパケット・フィルタリング機能は,管理コマンドの名前から「ipfwadm」と呼ばれています。

 その後,同機能はカーネル2.2で書き直されました。新実装は,複数のフィルタリング・ルールを「チェーン」のように連結できることから「ipchains」と名付けられました。

 カーネル2.4では,これがさらに機能拡張され,送受信のどちらでもルーティング処理の前後にチェーン設定を施せるようになりました(図1)。この新実装は「Netfilter」と呼ばれています。

図1●Netfilterの仕組み
図1●Netfilterの仕組み
Netfilterでは,ルーティング処理を挟んで5つのチェーンが定義されています。それぞれのチェーン設定を組み合わせることで柔軟な処理ができます。
[画像のクリックで拡大表示]

 Netfilterは,前回までに解説してきたカーネルのネットワーク処理レイヤーから呼び出されて機能します。例えば,送出時にパケットを特定のルールで処理するようにNetFilter設定をしておくと,実際にパケットが送られる際にNetFilterが呼び出されて,ルールに従った処理をします。

 Netfilterが呼び出されるのは,図1の(1)~(5)の部分からです。このそれぞれを「チェーン」と呼びます。Netfilterではチェーンごとに処理内容を設定します。設定にはiptablesコマンドを使います。例えば,iptablesコマンドを使って図2のように設定すると, INPUTチェーンにおいてパケットが検査されます。そして,「192.168.1.21」というIPアドレスを持つホストからポート22番あてに送られたパケットであれば,これを破棄(DROP)します。

図2●Netfilterの設定例
図2●Netfilterの設定例
iptablesコマンドを使って設定します。例は,192.168.1.21というIPアドレスを持つホストからTCPポート22番あてに送られたパケットを破棄する設定です。
[画像のクリックで拡大表示]

 なお,「-j DROP」の代わりに「-j REJECT」とすると,パケットを破棄するかわりに接続を拒否するICMPパケットを返送します。DROPで破棄してしまうと,接続元はタイムアウトするまで待つことになりますから,攻撃をブロックする目的ではなく,ただ接続を拒否したい場合はREJECTを指定した方が相手に優しいと言えます。

 現在チェーンに設定中のルールを調べるには,「-L チェーン」というオプションを付けてiptablesコマンドを実行します。チェーンを指定しない場合は,すべてのチェーンの設定情報を表示します。実行例を図3に挙げました。

図3●現在のNetfilter設定を表示
図3●現在のNetfilter設定を表示
iptablesコマンドを「-L」オプション付きで実行すると,現在のNetfilter設定を表示できます。
[画像のクリックで拡大表示]

 Netfilterは,こういった基本的なフィルタリングに加え,もっと複雑なルールも指定できます。前回解説した通り,TCPでは「3ウェイ・ハンドシェイク」という手続きで通信路を確立します。Netfilterでは例えば,外部ネットワークからLAN内部のホストに,この手続きを開始するパケットを送信できないように設定しつつ,確立した通信路についてはパケットを送信できるように設定できます。つまり,TCPの状態に合わせたフィルタリングなどが可能になるのです。