このセクションでは汎用的なマッチ を取り扱う。汎用的なマッチは、扱うプロトコルが何であろうと、どんなマッチ拡張をロードしていようと、常に利用可能なマッチだ。マッチの利用に際して特別なパラメータも一切必要としない。僕は、この仲間に、プロトコルのマッチに関わるやや特別なものではあるが --protocol マッチも含めることにした。理由はこうだ。 TCPマッチ を使おうとする場合には、 --protocol マッチを用い、さらにそのオプションとして TCP を指定しなければならない。だが、 --protocol は、特定のプロトコルをマッチさせるという単独のマッチとしても存在しているのだ。常に利用可能なマッチには、以下のものがある。
Table 10-1. 汎用的なマッチ
マッチ | -p, --protocol |
カーネル | 2.3, 2.4, 2.5, 2.6 |
例 | iptables -A INPUT -p tcp |
説明 | このマッチは、特定のプロトコルを検出するために用いられる。プロトコルとは TCP, UDP, ICMP といったものだが、内部的に定義済みのプロトコルである TCP, UDP, ICMP のみを指す場合もある。 /etc/protocols ファイルで定義されたプロトコルも引数に採れるが、指定したプロトコルがファイルに見つからない場合にはエラーを返す。また、プロトコルは数字で指定することもできる。例えば ICMP プロトコルの値は 1、 TCP は 6、 UDP は 17 だ。更に、ALL を採ることもできる。ALL は TCP, UDP, ICMP の 3つだけをマッチさせることを意味する。コマンド引数にカンマ区切りのプロトコルリストを採ることもでき、例えば udp,tcp は UDP および TCP のすべてパケットにマッチする。引数に数字のゼロ (0) を与えると ALL の意味となり、それはつまり --protocol マッチをはなから使用しなかった時のデフォルトの動作でもある。マッチは ! 記号で否定することも可能で、つまり --protocol ! tcp は UDP と ICMP を見つけることを意味する。 |
マッチ | -s, --src, --source |
カーネル | 2.3, 2.4, 2.5, 2.6 |
例 | iptables -A INPUT -s 192.168.1.1 |
説明 | これはパケットを送信元の IPアドレスに基づいて判定する送信元 (source) マッチだ。基本形は 192.168.1.1 のように IPアドレスをひとつだけ合致させるのに使う。 CIDR のビット形式 (ネットマスクビットにおいて左側に連続する 1 の個数) によって、ネットマスクも指定することもできる。つまり、例えば 255.255.255.0 のネットマスクを使用するには /24 を付け足せばよい。この方法で、ファイヤーウォールの内側のローカルネットワークやネットワークセグメントなどといった IP領域を根こそぎマッチさせることが可能だ。その際の表現は 192.168.0.0/24 のようになり、これは 192.168.0.x で括られるすべてのパケットにマッチする。ネットマスクを指定するもうひとつ方法は、通常の 255.255.255.255 形式 (例えば 192.168.0.0/255.255.255.0) だ。前の TCPマッチと同様に、 ! でマッチを否定することもできる。つまり、 --source ! 192.168.0.0/24 と指定すれば、 192.168.0.x の領域を送信元アドレスとしない すべてのパケットにマッチさせることができる。デフォルトでは、すべての IPアドレスにマッチする。 |
マッチ | -d, --dst, --destination |
カーネル | 2.3, 2.4, 2.5, 2.6 |
例 | iptables -A INPUT -d 192.168.1.1 |
説明 | --destination マッチは、複数または単一の宛先アドレスに基づいてパケットをマッチさせるのに用いる。 --source マッチとほとんど同様の動作を行い、書式も同じで、ただ、評価基準がパケットの行き先である点が異なるだけだ。 IPを範囲でマッチさせるには、ネットマスクを、文字通りのネットマスク方式か、ネットマスクビットの 1 を左側から数えた個数の、いずれかで指定する。例を挙げるとそれぞれ、 192.168.0.0/255.255.255.0 と 192.168.0.0/24 となる。ふたつは同義だ。前のマッチと同じく、マッチ全体を ! で反転させることもできる。つまり、 --destination ! 192.168.0.1 とすれば、 IPアドレス 192.168.0.1 以外 に宛てられたすべてのパケットにマッチする結果となる。 |
マッチ | -i, --in-interface |
カーネル | 2.3, 2.4, 2.5 and 2.6 |
例 | iptables -A INPUT -i eth0 |
説明 | これはパケットの入ってくるインターフェースに基づいてマッチを行う。このマッチは INPUT, FORWARD, PREROUTING チェーンでのみ有効であり、その他で使用するとエラーメッセージが返ってくるという点に注意しよう。どのインターフェースも指定しない時のこのマッチのデフォルト動作は、文字としての値 + を指定したものとして扱われる。 + は、文字または数字から成る任意の文字列を表す。つまり単独の + は、カーネルに対して、どのインターフェースから入って来るかにかかわらず、すべてのパケットを合致させよと指示することになる。 + 記号はインターフェースのタイプに付加して使用することも可能で、例えば eth+ ならすべてのイーサネットデバイスを表す。 ! 記号の助けを借りて、意味を逆転することも可能だ。その場合の記述は -i ! eth0 のような書き方となり、これは eth0 を除いたすべてのインターフェースにマッチする。 |
マッチ | -o, --out-interface |
カーネル | 2.3, 2.4, 2.5, 2.6 |
例 | iptables -A FORWARD -o eth0 |
説明 | --out-interface マッチはパケットが出て行こうとするインターフェイスに基づいてパケットをマッチさせるのに用いる。注意は、 --in-interface とは逆に OUTPUT、FORWARD、POSTROUTING チェーンにしか使えないということだ。この点を除いては、 --in-interface マッチとまったく同様に働く。 + による拡張は、同一タイプのインターフェースすべてに合致すると解釈され、 eth+ ならすべての eth デバイスにマッチするといった具合だ。マッチの意味合いを反転するには、 --in-interface とまったく同様に ! 記号が使用できる。 --out-interface を指定しなかった場合のこのマッチのデフォルト動作は、パケットがどこから出て行くかにかかわらずすべてのデバイスにマッチする。 |
マッチ | -f, --fragment |
カーネル | 2.3, 2.4, 2.5, 2.6 |
例 | iptables -A INPUT -f |
説明 | このマッチは、フラグメンテーションされたパケットの 2番目や 3番目のパケットにマッチさせる時に使用する。これが必要になるのは、パケットがフラグメンテーションされていた場合、後続フラグメントでは、送信元ポートや宛先ポート、 ICMPタイプなど諸々を判定する術がないからだ。フラグメンテーションしたパケットは、非常に希にだが、他のコンピュータへの攻撃に悪用されることもある。しかしパケットフラグメントは他のいかなるルールでも検出不可能。それ故にこのマッチが考案された。このオプションも ! と併用することができる。ただし今回は、 ! -f のように、 ! はマッチの前に付けなければならない。 --fragment マッチが反転された場合には、ヘッダフラグメントか、フラグメンテーションしていないパケットを検出する。つまり、フラグメンテーションしたパケットの先頭パケットにはマッチし、2番目、3番目のパケットなどにはマッチしないということになる。また、搬送経路上でフラグメンテーションされなかったすべてのパケットにもマッチする。ただし、カーネル自体にも、これの代わりに利用可能な非常に優れたフラグメンテーションオプションが用意されていることを覚えておこう。もうひとつの註は、コネクション追跡を使用している場合には、フラグメンテーションはパケットが iptables のテーブルやチェーンに到達する前に処置されるため、フラグメンテーションパケットに出会う可能性は皆無だということだ。 |