7.9. 複雑なプロトコルとコネクション追跡

プロトコルの中にはかなり複雑なものもある。つまり、コネクション追跡の面で、こういったプロトコルは正しく追跡するのが難しい。その典型が ICQIRCFTP だ。これらはいずれも、データのペイロード自体で情報をやりとりするので、追跡が正しく機能するためにはコネクション追跡にヘルパー が必要となる。

下表に、Linux カーネルでサポートされている「複雑なプロトコル」のリストと、サポートの始まったカーネルバージョンを示す。

Table 7-3. サポートされている複雑なプロトコル

プロトコル名カーネルバージョン
FTP2.3
IRC2.3
TFTP2.5
Amanda2.5

最初に、 FTP を例として取り上げよう。 FTP プロトコルは、まず最初に FTPコントロール セッションと呼ばれる 1 本のコネクションを張る。このセッション上でこちらからコマンド送ると、他に幾つかのポートが開き、コマンドに応じた後続データをそこに乗せて輸送する。こうした接続を行うにはふたつの方式がある。アクティブパッシブ だ。 アクティブコネクションでは、 FTP クライアントが、接続に使用するポートと IPアドレスをサーバに伝える。それが終わると、 FTP クライアントが解放したポートに向かって、サーバが特権ポート以外 (>1024) で接続を張り、そこにデータを乗せて送ってくる。

問題は、こうしたネゴシエーションがプロトコルデータのペイロードそのものの中で行われるため、ファイヤーウォールにとっては前記の追加コネクションを知る術がないという点だ。その結果、ファイヤーウォールには、それら特定のポートを通じてサーバからクライアントへ行われる接続を許可すべきだということが分からないのだ。

問題を解決するには、コネクション追跡モジュールに特別なヘルパー を付加して、コントロールコネクション内のデータから特有の書式と情報をスキャンできるようにする。正しい情報に行き当たったら、モジュールはその特別な情報を RELATED として加える。この RELATED エントリを利用すれば、サーバはコネクションを追跡することが可能となるのだ。 FTP サーバがクライアントへコネクションを張り返した時に、ステートがどのようになるか、下の図をとくとご覧いただきたい。

パッシブFTP は、これとちょうど逆の動作をする。 FTP クライアントが特定のデータをサーバに要求する。するとサーバは、これこれの IPアドレス及びポートで接続せよと回答する。このデータを受け取ると、クライアントは自分の 20 番 (FTP-data) ポートで、サーバから言われたポートへ接続を行い、求めていたデータを実際に受け取る。つまり、もしファイヤーウォールの内側に FTP サーバを置いているのなら、インターネット上のクライアントからこのサーバへ正常に接続させるためには、標準の iptables モジュールに加えて、このモジュールが必要となる。また、ローカルネットワーク上のユーザをきつく縛り、インターネット上の HTTP サーバと FTP サーバへだけ接続を許し、その他のポートは塞いでおきたい場合にも、やはり必要だ。下の図で、パッシブFTP における動作を検証してみよう。

conntrack ヘルパーの幾つかは、カーネルの一部として初めから利用可能になっている。中でも FTPIRC プロトコル用の conntrack ヘルパーは、このドキュメントを執筆している時点で、もうカーネルに備わっている。見つからない場合は、 iptables ユーザ空間の patch-o-matic ツリーを覗いてみるといいだろう。 patch-o-matic ツリーには、 ntalkH.323 プロトコル用の conntrack ヘルパーをはじめとして、たくさんのものが見つかるはずだ。必要なヘルパーが patch-o-matic でも見つからない時には、いくつかの選択肢がある。ひとつは、 iptables の CVS ソースツリーに最近仲間入りしていないか調べてみること。もうひとつは、求めるようなモジュールがないか、Netfilter-devel メーリングリストで尋ねてみることだ。まだ存在せず、追加される予定もないと判明したら、残るはただひとつ、自分でそうしたデバイスを書くしかない。その際には、付録 その他の資料とリンク から辿れる Rusty Russell's Unreliable Netfilter Hacking HOW-TO が参考になること請け合いだ。

conntrack ヘルパーは、コンパイル時にカーネルへスタティックに組み込むこともできるし、モジュールとしてコンパイルすることもできる。モジュールとしてコンパイルしてある場合には、下記のコマンドでロードできる。

modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ip_conntrack_tftp
modprobe ip_conntrack_amanda
   

注意してほしいのは、 NATコネクション追跡がまったくの別物だという点だ。よって、コネクションの NAT も同時に行いたいのなら、他にもモジュールが必要となる。例えば、NAT と、 FTP コネクションの追跡がしたいなら、 NAT モジュールも要る。 NAT ヘルパーはすべて、 ip_nat_ で始まる一定の命名法を採っている。例えば、FTP NAT ヘルパーは ip_nat_ftp となるし、 IRC モジュールなら ip_nat_irc だ。 conntrack ヘルパーも同様の命名法に則っているので、 IRC conntrack ヘルパーなら ip_conntrack_ircFTP conntrack ヘルパーなら ip_conntrack_ftp で御明算だ。