|
次のページ
前のページ
目次へ
7. iptables を使う個々の事項についてのもっと詳しい説明が必要なら、iptables にはかなり
詳しいマニュアルページ(
チェイン内のルールを操作するには様々な方法があります:
7.1 コンピュータを起動したとき見るべきことiptables はたぶんモジュールになっています。名前は(`iptable_filter.o')
で、最初に 全く iptables コマンドを実行していない状態では(注意しましょう: 初期化スクリプトで iptables を実行するディストリビューションがあります)、 組み込み済みチェイン(`INPUT', `FORWARD' および `OUTPUT')のどれにも ルールは存在せず、全てのチェインのポリシーは ACCEPT です。 しかし、iptable_filter モジュールのオプションに `forward=0' を与えれば、 FORWARD チェインのポリシーの初期値を(訳注: DROP に)変えることができます。 7.2 ルールの操作ルールを操作すること ― それはパケットフィルタリングの基本です。 ほとんどの場合、普通、あなたは追加 (-A) と削除 (-D) コマンドを使うこと になるでしょう。残りのコマンド(挿入の -I と置換の -R )はこれらの概念を 単純に延長したものです。 各々のルールには、パケットが満たすべき条件のセットと、条件が満たされた ときにすること(‘ターゲット’)を指定します。例えば、IP アドレス 127.0.0.1 からやって来る全ての ICMP パケットを破棄したいとします。その場合の条件は プロトコルが ICMP でソースアドレスが 127.0.0.1 で、ターゲットは `DROP' です。 127.0.0.1 は‘ループバック’インターフェイスで、それはあなたのマシンが 実際のネットワークに繋がっていなくても存在します。`ping' プログラムは そのようなパケットを発生させるのに使います(ping は 単純に ICMP タイプ 8 (エコー要求)を送り、全ての協力的なホストは親切にも ICMP タイプ 0 (エコー応答)のパケットでそれに応えます)。これはテストに役立ちます。
ご覧のとおり最初の ping が成功しています(`-c 1' は ping にパケットを 1個だけ送るように指示しています)。 次にルールを `INPUT' チェインに追加 (-A) します。ルールの指定は、 127.0.0.1 から (`-s 127.0.0.1') でプロトコル ICMP (`-p icmp') のパケットは、DROP へジャンプする (`-j DROP') です。 それから 2番目の ping でルールをテストします。帰って来ない応答を待つのを ping が止めるまで少しの間があるでしょう。 ルールを削除するには 2通りの方法があります。1番目は、例えば、input チェインにはルールが 1個だけしかないのを分っている場合では、番号を 使って以下のように削除できます:
INPUT チェインのルール番号 1 を削除。
2番目の方法は -A コマンドをそっくり写して -A を -D に置き換えたものです。 これはルールが複雑なチェインの場合で、例えば、取り除きたいのがルール 37 だと探し当てるためにルールを数えたくない場合に有効です。この場合、 次のように使います:
-D の書き方は、-A (または -I か -R) コマンドのときと正確に同じ
オプションでなければなりません。もし、同一チェイン中に複数のマッチ
するルールがあったら、最初のだけが削除されます。
7.3 フィルタリングの仕様これまでに、プロトコルを指定する `-p' オプションと、ソースアドレスを 指定する `-s' オプションを見てきましたが、この他にもパケットの特徴を 指定する様々なオプションがあります。これから、その概要をあますところなく お話します。 ソースとあて先 IP アドレスの指定ソース(`-s', `--source' または `--src') および、あて先(`-d', `--destination' または `--dst') IP アドレスは 4通りの指定方法が あります。もっとも一般的な方法は完全に記述された名前(FQDN)を使うことで、 例えば、`localhost' とか `www.linuxhq.com' です。2番目の方法は `127.0.0.1' のような IP アドレスを指定する方法です。 3番目と 4番目の方法は IP アドレスのグループを指定する方法で、 `199.95.207.0/24' とか `199.95.207.0/255.255.255.0' のように書きます。 両方とも 199.95.207.0 から 199.95.207.255 までのどの IP アドレスも 含まれる指定で、数字のあとの `/' は IP アドレスのどの部分まで有効かを 示しています。省略時は `/32' または `/255.255.255.255' (IP アドレスの 完全一致)です。どんな IP アドレスでもよい場合は、以下のように `/0' が 使えます:
上記の効果は `-s' オプションを指定しないのと全く同じなので、 こんな使い方はめったにしません。 否定の指定`-s' (または `--source') や `-d' (`--destination') オプション を含めて多くのオプションは、`!' (否定の宣言)を その引数の前に置くことができます。`-s' や `-d' の場合は与えられた アドレスと等しくないアドレスとマッチします。 例えば、`-s ! localhost' は localhost からでないパケットと マッチします。 プロトコルの指定プロトコルは `-p' (または `--protocol') オプションで指定します。 プロトコルの値は番号(あなたが IP のプロトコルの数値番号を知って いる場合)か `TCP', `UDP' または `ICMP' という特定の名称で指定します。 大文字小文字の区別はしませんから、`tcp' も `TCP' と同じ働きをします。 プロトコル名称はそれを否定するために `!' を前に付けることができます。 例えば、`-p ! TCP' は TCP でないパケットを指定します。 インターフェイスの指定`-i' (または `--in-interface') と `-o' (または `--out-interface') オプションはマッチすべきインターフェイスの名前を指定します。 インターフェイスとは、パケットが入って来る (`-i') または出て行く (`-o') 物理デバイスです。`ifconfig' コマンドを使って `up' である (すなわち、今動いている)インターフェイスをリストアップできます。
現在存在していないインターフェイスを指定することは全く問題がありません
が、指定したインターフェイスが up して来るまでルールがマッチすることは
ありません。これはダイアルアップ PPP リンク(通常インターフェイスは
特別なケースとして、インターフェイス名の後ろに `+' を付けたものはその
文字列から始まる全てのインターフェイス(現在存在してようとなかろうと)
にマッチします。例えば、全ての PPP インターフェイスにマッチするルール
の指定は、 指定したインターフェイスと一致しないパケットにマッチするように
インターフェイス名の前には前後に空白を挟んで `!' を置くことができます。
例えば、 フラグメントの指定ときどきパケットが、一度にケーブルに送り出すには大き過ぎることがあります。 こんなときは、パケットはフラグメントに分割され、複数のパケットで送られ ます。受信点でこれらのフラグメントを再び集めて完全なパケットに再構成 します。 フラグメントの問題点は、先頭のフラグメントには完全な ヘッダーフィールド(IP + TCP, UDP および ICMP)があり検査できますが、 後続のパケットにはヘッダー全てが揃っていません(IP ヘッダーだけで 追加のプロトコルフィールドは無し)。従って後続のフラグメントの プロトコル固有ヘッダー(TCP, UDP および ICMP で拡張された)をのぞき込む ことはできません。 もし、コネクション追跡や NAT を行っているなら、全てのフラグメントは パケットフィルタリングのコードに届く前にマージされて元通りにされる ので、フラグメントについて心配する必要はありません。 そうでなければ、フィルタリングルールがフラグメントをどのように扱うか
を理解することが重要です。情報が無ければどんなフィルタリングルールも
マッチしません。この意味するところは 1番目のフラグメントは
他のパケットと同じように扱われます。2番目以降のフラグメントは異なり
ます。従って とはいえ、`-f' (または `--fragment')オプションを使って 2番目以降の
フラグメントを特定するルールを指定できます。また、` ! ' を `-f' の
前に付けて(訳注: 通常、フィルタリングは 1番目のフラグメントに効力があるので、目的の ホストでのフラグメントの再組み立てを妨げるため、2番目以降のフラグメント を通過させることは安全とみなされています。とはいえ、フラグメントを送る ことにより簡単にマシンをクラッシュさせることができるバグが知られて います。調べてくださいね。 ネットワーク管理者のための注記: 異常なパケット(TCP, UDP および ICMP の パケットで短すぎてファイアーウォールのコードがポート番号または ICMP の コードと種類を読めないもの)はそれらの検査が試みられるとき破棄されます。 それで TCP パケットのフラグメントの位置は最低でも 8 から始まります。 例えば、次のルールは 192.168.1.1 へ行くフラグメントはどれでも破棄します:
iptables への拡張 ― 新しいマッチ
これらの拡張には標準的なものもありますが、もっと風変わりなものも あります。私達以外の人々が拡張を作って特殊な利用者に個別に配布する ことができます。 カーネルの拡張は、通常カーネルモジュールのサブディレクトリ、 例えば /lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter に存在します。 それらはカーネルが CONFIG_KMOD をセットしてコンパイルされていれば要求時にロードされます。 iptables プログラムへの拡張は、共有ライブラリで通常は /usr/local/lib/iptables/ に存在します。ディストリビューションに よっては /lib/iptables または /usr/lib/iptables に置かれます。 拡張には 2種類あります: 新しいターゲット、そして新しいマッチです (新しいターゲットについては、もう少し後でお話します)。いくつかの プロトコルは自動的に新しい検査を提供します: 現在のところ以下に示す TCP, UDP および ICMP があります。 これらは `-p' オプションで拡張がロードされ、その後のコマンドラインで 新しい検査を指定できます。新しい検査を指定するには、`-m' オプションを 使うと拡張がロードされて、拡張されたオプションが有効になります。 拡張のヘルプを見るには、拡張をロード(`-p', `-j' または `-m')した後に `-h' または `--help' オプションを使います。例えば:
TCP 拡張TCP 拡張は `-p tcp' を指定すると自動的にロードされます。 以下のオプションが提供されています(フラグメントは決してマッチしません)。
TCP フラグの説明一方向だけ TCP コネクションを許可し、他方は許可しないようにすることは 往々にして有効です。例えば、あなたが外部の WWW サーバーと接続したいが、 そのサーバーからの接続を許可したくないときです。 そのサーバーから来る TCP パケットをブロックすることは自然な方法です。 残念なことに、TCP コネクションにはとにかく両方向のパケットが行き来する ことが必要です。 その解決方は、接続を要求するパケットだけをブロックすることです。 このようなパケットは SYN パケットと呼ばれています(オーケー、 技術的には SYN フラグがセットされていて、RST と ACK フラグがクリア されているパケットですが、短縮して SYN パケットと呼んでいます)。 これらのパケットだけ許可しないようにすれば、パケットを逆にたどって 接続して来るのを止めることができます。 `--syn' オプションはこのために使われます。このオプションは TCP プロトコルが 指定されているルールにだけ有効です。例えば、192.168.1.1 からの TCP 接続 の試みの指定:
このオプションは `!' を前に付けて(訳注: UDP 拡張この拡張は `-p udp' を指定すると自動的にロードされます。オプションは `--source-port' または `--sport' と `--destination-port' または `--dport' が提供され、詳細は TCP と同様です。 ICMP 拡張この拡張は `-p icmp' を指定すると自動的にロードされます。新しい オプションが 1つだけ提供されます:
その他のマッチの拡張netfilter パッケージのその他の拡張は実証的拡張で、インストール済み なら `-m' オプションで呼び出すことができます。
状態のマッチ最も役に立つマッチ判定基準は `state' 拡張によって提供され、 `ip_conntrack' モジュールのコネクション追跡の分析結果を簡単に利用 できるようにします。これは非常にお勧めです。 `-m state' を指定すると追加して `--state' オプションが指定でき、 そこにマッチすべき状態のリストをカンマで区切って指定します(`!' オプション は指定した状態にマッチしないことを示します)。状態には以下の ものがあります:
この強力なマッチ拡張の使用例は以下のようになります:
7.4 ターゲットの仕様今や、私達はパケットに関してどんな検査ができるか知っています。 次に必要なのは検査にマッチしたパケットに対して何をするか指示する方法です。 これはルールのターゲットと呼ばれています。 とても単純な 2つの組み込み済みターゲット: DROP と ACCEPT があります。 これらについては前に述べました。もし、ルールがパケットにマッチし、 ターゲットがこれら 2つのどちらか一方なら、パケットの運命が決定されて、 これ以上ルールが調べられることはありません。 組み込み済みターゲット以外に 2種類のターゲット: 拡張ターゲット とユーザ定義チェインがあります。 ユーザ定義チェイン
パケットがルールにマッチし、そのターゲットがユーザ定義チェインであれば、 パケットはそのユーザ定義チェインに移り、ルールの検査を始めます。その ユーザ定義チェインでの検査が全て終ってもパケットの運命が決まらなければ、 現在のチェインに戻り、その次のルールから検査を再開します。 ASCII アートの時間です。2つの(おばかさんな)チェイン:
192.168.1.1 から来て 1.2.3.4 へ向かう TCP パケットについて考えましょう。
パケットは それで、パケットの経路は次のようになります:
ユーザ定義チェインは他のユーザ定義チェインへジャンプできます (しかし、ループしてはいけません。ループしていることが判ると パケットは破棄されます)。 iptables への拡張 ― 新しいターゲット拡張のもう 1つの種類はターゲットです。ターゲットの拡張
はカーネルモジュールから成り、
特別な組み込み済みターゲット2つの特別な組み込み済みターゲット:
ユーザ空間で処理するためにキューへパケットを入れる iptables の使い方の 簡単な例を以下に示します:
このルールでは、ローカルに生成された外に出て行く ICMP パケット(例えば、
ping で生成された)は ip_queue モジュールに渡されます。それから、ip_queue
はパケットをユーザ空間のアプリケーションに届けようとします。もし、待機
しているユーザ空間アプリケーションが無ければ、パケットは破棄されます。
ユーザ空間アプリケーションを書くためには、libipq API を使います。 これは iptables と一緒に配布されています。実例のコードは CVS 中の testsuite ツール(例えば、redirect.c)の中で見つけられます。 ip_queue の状態は以下でチェックできます:
キューの最大長(すなわち、ユーザ空間に届けられていて、まだ判定がなされて
いないパケットの数)は以下でコントロールできます:
キューの最大長の初期値は 1024 です。一旦この限界値に達したら、キューの
長さが限界値より低くなるまで新しいパケットは破棄されます。TCP のような
すばらしいプロトコルは、混雑で落ちこぼれたパケットを検出して、キューが
一杯になったとき、再送を試みます。とはいえ、与えられた状況下で初期値は
小さ過ぎるかもしれないので、理想的な最大キュー長を決定するのにいくらか
実験するとよいでしょう。
7.5 チェインの操作
新しいチェインを作る新しいチェインを作りましょう。私はとっても創造力に富んだ野郎なので、
それを
これは簡単です。今や、あなたはこれまで詳細に述べてきたように、これに ルールを入れることができます。 チェインを削除するチェインを削除するのも同様に簡単で、`-X' または `--delete-chain' オプションを使います。なぜ `-X' かって? うーん、よい文字が全て 取られてたんです。
チェインを削除するには 2つの制限があります ― そのチェインは空である必要 があり(下記の チェインを空にするを見てくださ い)、しかも、決してどのルールのターゲットにもなっていないことです。 組み込み済みの 3つのチェインはどれも削除できません。 もし、チェイン名を指定しなければ、全てのユーザ定義チェインが 可能な限り削除されます。 チェインを空にするチェインから全てのルールを取り去り空にするのは簡単で、`-F' (または `--flush') コマンドを使います。
もし、チェイン名を指定しなければ、全てのチェインを空にします。 チェインの内容をリストアップするチェイン中の全てのルールをリストアップするには、`-L' (または `--list') コマンドを使います。 各々のユーザ定義チェインに表示される `refcnt' は、それをターゲットに 指定しているルールの数です。この数が 0 でないと(かつチェインが空である こと)、そのチェインを削除することはできません。 もし、チェイン名を指定しなければ、空のも含めて全てのチェインについて リストアップされます。 `-L' には 3つのオプションがあります。
(たいていの人々は DNS を使っていますが) DNS が適切に設定
されていない場合や DNS の要求をフィルターアウトしている場合は、
`-v' オプションはルールの詳細を全て、例えば、パケットやバイトの カウンター、TOS マスク、そしてインターフェイス、を表示します。 このオプションを指定しなければ、これらの値は省略されます。 注記として、パケットとバイトのカウンターは、1000, 1,000,000 および 1,000,000,000 を、それぞれ `K', `M' および `G' の接尾辞を使って表示 します。`-x' (拡張数値)オプションを使うと、値の大きさにかかわらず完全な数値 を同様に表示します。 カウンターをリセット(ゼロに)するカウンターをリセットできると便利です。これは `-Z' (または `--zero') オプションでできます。 以下について考えてみましょう:
上記の方法では、`-L' から `-Z' コマンドまでの間に いくつかのパケットが通過するかもしれません。そのため、カウンターを 読むと同時にリセットするには、`-L' と `-Z' を同時に使います。 ポリシーを設定する以前にパケットがどのようにチェインを通り抜けるのか論じたとき、パケットが
組み込み済みチェインの終わりに達したとき何が起きるのか大体述べました。
この場合、チェインのポリシーがそのパケットの運命を決定します。
組み込み済みチェイン( ポリシーは
次のページ 前のページ 目次へ |
[ |