|
次のページ
前のページ
目次へ
4. IP ファイアウォーリングチェインこの章は、あなたの必要に叶うパケットフィルタを構築するために、実際に知っておかなければならないことを全て説明します。 4.1 どのようにパケットがフィルタを通過するのかカーネルは起動時に 3つのルールリストを保持しています。
これらのリストはファイアウォールチェイン、または単にチェインと呼ばれます。
3つのチェインは、 input, output そして forward と呼ばれます。
パケットが (例えば、イーサネットカードを通じて) 入って来ると、カーネルはそのパケットの「運命」を決定するために 1つのチェインは複数のルールのチェックリストから構成されています。 各々のルールは「もし、パケットのヘッダーがこんなだったら、パケットをこのようにしなさい」と指示します。 もし、あるルールがパケットとマッチしなければ、チェイン内の次のルールが調べられます。 最終的に、調べるルールが無くなったら、カーネルはそのチェインのポリシー(方針)を見て何をするか決めます。 セキュリティ意識の強いシステムでは、このポリシーは普通、パケットを DROP するようにカーネルに指示します。 ASCII アートファンのために、マシンに入来するパケットの完全な通り道をここに記します。 (訳注: この文書では日本語文字コードを用いた "JIS アート" を作成しております。
┌──────────────────────────────────┐ │ lo インターフェース│ │ ACCEPT/ │ ↓ REDIRECT ┏━━━━━┓ ┌────┐ ACCEPT│ →チ→正→┌────┐→マ→┃ルーティン┃→│forward │──→┌────┐→ ェ 当 │ input │ ス ┃グの決定 ┃ │チェイン│┌─→│ output │ ッ 性 │チェイン│ カ ┗━━━━━┛ └────┘│┌→│チェイン│ ク │ └────┘ レ │ │ ││ └────┘ サ │ │ ー ↓ │ ││ │ ム │ │ ド ローカルプロセス ↓ ││ ↓ │ ↓ ↓ 外 │ DENY/ ││ DENY/ │ DENY DENY/ し │ REJECT ││ REJECT ↓ REJECT │ │ ││ DENY │ └──────────┘│ └────────────────┘以下に各々の段階での説明を逐一記します。
ipchains を使う先ず、この文書にて扱うお手持ちの ipchains のバージョンを、以下のように参照しましょう:
注記として、1.3.4 (`--sport' のような長いオプションがありません) か、 1.3.8 以降をお薦めします; これらは大変安定しています。 個々の事項についてのもっと詳しい説明が必要なら、ipchains にはかなり詳しいマニュアルページ ( ソースパッケージには Scott Bronson による素晴らしいクィックリファレンスカードもあります。 A4判または US レターサイズの PostScript(TM) の両方があります。
チェイン内のルールを操作するには様々な方法があります:
マスカレーディングに関する操作が少ないながらあります。
それらを配置するに相応しい場所の要望の為に
最後の (そして恐らく最も便利な) 機能は、指定したパケットが指定したチェインを通過するなら、そのパケットがどうなるのかを試しにチェックできることです。 あなたのコンピュータが起動する時に見るものipchains コマンドが起動される前 (注意: 幾つかのディストリビューションでは初期化スクリプト内で ipchains を起動しています) は、組み込み済みのルール (`input', `forward' と `output') 以外には何もありません。 そして各々のチェインは ACCEPT (許可) のポリシーに設定されています。 これは全てを受け入れることと等価です。 単一のルールでの操作ルールを操作すること ― それは ipchains の基本です。 ほとんどの場合、普通、あなたは追加 (-A) と削除 (-D) コマンドを使うことになるでしょう。 残りのコマンド(挿入の -I と置換の -R )は、これらの概念を単純に(機能)拡張したものです。 各々のルールには、パケットが満たすべき条件のセットと、条件が満たされたときにすること(‘ターゲット’)を指定します。 例えば、IP アドレス 127.0.0.1 からやって来る全ての ICMP パケットを破棄したいとします。 その場合の条件はプロトコルが ICMP で、ソースアドレスが 127.0.0.1 で、ターゲットは `DENY'(否定) です。 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') のパケットは、DENY へジャンプする (`-j DENY') です。 それから 2番目の ping でルールをテストします。 帰って来ない応答を待つのを ping が止めるまで少しの間があるでしょう。 ルールを削除するには 2通りの方法があります。 1番目は、例えば、 input チェインにはルールが 1個だけしかないのを分っている場合では、番号を使って以下のように削除できます:
INPUT チェインのルール番号 1 を削除。
2番目の方法は -A コマンドをそっくり写して -A を -D に置き換えたものです。 これはルールが複雑なチェインの場合で、例えば、取り除きたいのがルール 37 だと探し当てるためにルールを数えたくない場合に有効です。 この場合、次のように使います:
-D の書き方は、 -A (または -I か -R) コマンドの時と正確に同じオプションでなければなりません。
もし、同一チェイン中に複数のマッチするルールがあったら、最初のものだけが削除されます。
フィルタリングの仕様これまでに、プロトコルを指定する `-p' オプションと、ソースアドレスを指定する `-s' オプションを見てきましたが、この他にもパケットの特徴を指定する様々なオプションがあります。 これから、その概要をあますところなくお話します。 ソースと宛先 IP アドレスの指定ソース (-s) 及び宛先 (-d) 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' と `-d' を含む多くのフラグは、`!' (否定の宣言) をその引数の前に 置くことができます。 `-s' や `-d' の場合は与えられたアドレスと等しくないアドレスとマッチ します。 例えば、 `-s ! localhost' はローカルホストからでない全てのパケットと マッチします。 `!' の前後にスペースを入れるのを忘れないで下さい。本当に必要なのです。 プロトコルの指定プロトコルは `-p' フラグで指定します。 プロトコルの値は番号(あなたが IP のプロトコルの数値番号を知って いる場合)か `TCP', `UDP' または `ICMP' という特定の名称で指定します。 大文字小文字の区別はしませんから、`tcp' も `TCP' と同じ働きをします。 プロトコル名称はそれを否定するために `!' を前に付けることができます。 例えば、`-p ! TCP' は TCP でないパケットを指定します。 UDP と TCP ポートの指定特別な場合である TCP 或は UDP のプロトコルが指定された時には、 TCP 或は UDP のポート、或は含まれるポートの範囲 (しかし、後述の フラグメントの処理を参照して下さい) を指し示す拡張引数が存在し得ます。 範囲は文字 `:' で表現します。例えば `6000:6010' は 6000 から 6010 迄の 範囲に含まれる11個のポート番号を示します。 もし下限値が省略されれば、デフォルトの 0 を意味します。 上限値が省略されれば、デフォルトの 65535 を意味します。 ですから、1024番以下のポートの TCP 接続を指定するには、書き方は `-p TCP -s 0.0.0.0/0 :1023' とします。 ポート番号は `www' のように、名前でも指定できます。 注記として、ポート指定の前には否定を意味する `!' を置くことができます。 ですから、 WWW パケット以外の全ての TCP パケットを指定するには、以下の ように指定します。 -p TCP -d 0.0.0.0/0 ! www 以下の指定と、
-p TCP -d ! 192.168.1.1 www 以下の指定は全く違うことをしっかり認識して下さい。 -p TCP -d 192.168.1.1 ! www 最初の例は、 192.168.1.1 以外の全てのマシンの WWW ポートへの TCP パケット を指定します。 次の例は、 WWW ポートを除く全てのポートにおける 192.168.1.1 への TCP 接続を指定します。 最後に、このケースは WWW ポートでなく、 192.168.1.1 でもないことを 意味します: -p TCP -d ! 192.168.1.1 ! www ICMP タイプとコードの指定ICMP にもまたオプション引数がありますが、 ICMP はポートを持ち得ません。 (ICMP にはタイプとコードがあります) それらには異なる意味があります。 `-s' オプションの後に ICMP ネームを用いる ( ICMP ネームはかなり長いです: 他とはっきり区別できる分だけの長い文字列 であれば十分です。 最も一般的な ICMP パケットの小さな一覧を以下に示します:
ICMP ネームは `!' を置けないことに注意して下さい。 絶対に絶対に絶対に、 ICMP タイプ3 メッセージの全部をブロックしないで!! (後述の ICMP パケットを参照して下さい) インターフェイスの指定`-i' オプションはマッチすべきインターフェイスの名前を指定します。
インターフェイスとは、パケットが入って来るか、または出て行く
物理デバイスです。 入来するパケット (すなわち、 (訳注: ここで著者は forward チェインのインターフェースを出力インター フェースにしたことに抗議しているように思えます。 たぶん著者は入力と出力の両方指定できたほうがよいと思っていて、でも、 ipchains にはインターフェイスを指定するオプションが -i の1つしかない ので、どちらかにせざるおえなかった。と言う話だと思います。 ipchains の後継である iptables では、 FORWARD チェインで、入力と出力 の両方のインターフェイスを指定できるようになってます。) 現在存在していないインターフェイスを指定することは全く問題がありません
が、指定したインターフェイスが up して来るまでルールがマッチすることは
ありません。これはダイアルアップ PPP リンク(通常インターフェイスは
特別なケースとして、インターフェース名の最後が `+' で終わるものは、
(現在存在していようとなかろうと) その文字列から始まる全てのインター
フェースにマッチします。
例えば、全ての PPP インターフェースにマッチするルールを指定するには、
指定したインターフェイスと一致しないパケットにマッチするように インターフェイス名の前には `!' を置くことができます。 TCP SYN パケットのみを指定する一方向だけ TCP コネクションを許可し、他方は許可しないようにすることは 往々にして有効です。例えば、あなたが外部の WWW サーバーと接続したいが、 そのサーバーからの接続を許可したくないときです。 そのサーバーから来る TCP パケットをブロックすることは自然な方法です。 残念なことに、TCP コネクションにはとにかく両方向のパケットが行き来する ことが必要です。 その解決方法は、コネクション要求に用いられるパケットのみをブロックす ることです。 このようなパケットは SYN パケットと呼ばれます。 (技術的には、SYN フラグが設定されていて、 FIN と ACK フラグがクリア されているパケットを指しますが、我々はこれを SYN パケットと呼びます。) それらのパケットだけを許可しないことで、その場の接続要求を止められま す。 `-y' フラグはこのために使われます: これは TCP プロトコルを指定されて いる場合においてのみ有効です。 例えば、 192.168.1.1 から要求される TCP コネクションを指定するには: -p TCP -s 192.168.1.1 -y もう一度、このフラグはその前に `!' を置くことによって (訳注: ! -y として) 否定することができ、それは接続開始のパケットを除く全てのパケットを 意味します。 フラグメントの処理時に、一度にケーブルに送り出すにはパケットが大き過ぎることがあります。 こんなときは、パケットはフラグメントに分割され、複数のパケットで送られ ます。受信点でこれらのフラグメントを再び集めて完全なパケットに再構成 します。 フラグメントの問題点は、先程リストアップした仕様の幾つか (特に、ソースポート、宛先ポート、 ICMP タイプ、 ICMP コード、 或は TCP SYN フラグ) は、カーネルに、最初のフラグメントにだけ含まれている パケットの始めの部分を覗くように要求している点にあります。 あなたのマシンが外部ネットワークにのみ接続されるなら、カーネルの "IP: 常にデフラグメントする" を Y に設定してコンパイルすることにより、 通過する全てのフラグメントを再構築するように Linux カーネルに命ずる ことができます。 これは問題をうまく回避します。 そうでなければ、フィルタリングルールがフラグメントをどのように扱うか
を理解することが重要です。
情報が無ければどんなフィルタリングルールもマッチしません。
この意味するところは 1番目のフラグメントは他のパケットと同じように扱
われます。
2番目以降のフラグメントは異なります。
従って、 とはいえ、`-f' フラグを用いて、 2番目及びそれ以降のフラグメントに 合致するルールを指定できます。 明らかに、このようなフラグメントルールには TCP や UDP ポート、 ICMP タイプ、 ICMP コード或は TCP SYN フラグを指定するのは間違いで す。 また、`!' を `-f' の前に付けて、 2番目以降のフラグメントと適合しな いルールの指定もできます。 通常、フィルタリングは 1番目のフラグメントに効力があるので、目的の ホストでのフラグメントの再組み立てを妨げるため、2番目以降のフラグメント を通過させることは安全とみなされています。とはいえ、フラグメントを送る ことにより簡単にマシンをクラッシュさせることができるバグが知られて います。調べて下さいね。 ネットワーク管理者のための注記: 異常なパケット(TCP, UDP および ICMP の パケットで短すぎてファイアーウォールのコードがポート番号または ICMP の コードと種類を読めないもの)は、フラグメントと同様に取り扱われます。 フラグメントの位置が 8 から始まるTCP パケットだけが明白にファイアウォー ルコードによって破棄されます。(これが発生すると syslog にメッセージが 現れます。) 例えば、次のルールは 192.168.1.1 へ行くフラグメントはどれでも破棄します:
フィルタリングの副次的効果さて、今我々はルールを用いてパケットにマッチさせる方法の全てを知り ました。 パケットがルールにマッチすると、以下に記すことが起こります:
これら以外の種類については、重要度に応じて手を付けたいと思います。 ターゲットの指定ターゲットはルールにマッチするパケットに対し何をすべきかをカーネルに 指示します。 ipchains はターゲットの指定に `-j' を用います。(`ジャンプする'と考え て下さい) ターゲット名は 8文字以下でなければならず、また大小文字を区別します: "RETURN" と "return" は全く別物です。 最も単純なケースは指定されるターゲットが全くない場合です。 このルールのタイプ (しばしば `計数' ルールと呼ばれます) は単純に一定のパケットのタイプをカウントするのに便利です。 このルールにマッチするか否かにかかわらず、カーネルは単純にチェイン 内の次のルールを検査します。 例えば、 192.168.1.1 からのパケットの数を数えるには、以下のように できます:
(`ipchains -L -v' を用いて、各々のルールに関連付けられたバイト及び パケットカウンタを見れます。) 6つの特別なターゲットがあります。
最初の 3つの 次の一つ、 他の主要な特別なターゲットは、カーネルに対して、何処から発生したかを
問わずにパケットをローカルポートへ送る、 最後の特別なターゲットは 他のターゲットはユーザー指定のチェインを示します。 (後述の チェインの操作で説明しています。) パケットはそのチェイン内のルールを通過し始めます。 そのユーザ定義チェインでの検査が全て終ってもパケットの運命が 決まらなければ、現在のチェインに戻り、その次のルールから検査 を再開します。 ASCII アートの時間です。2つの(おばかさんな)チェイン:
`input' `test' ┌──────────────┐ ┌─────────────┐ │ルール 1: -p ICMP -j REJECT │ │ルール 1: -s 192.168.1.1 │ ├──────────────┤ ├─────────────┤ │ルール 2: -p TCP -j Test │ │ルール 2: -d 192.168.1.1 │ ├──────────────┤ └─────────────┘ │ルール 3: -p UDP -j DENY │ └──────────────┘ 192.168.1.1 から来て 1.2.3.4 へ向かう TCP パケットについて考えましょう。
パケットは それで、パケットの経路は次のようになります: v __________________________ `input' | / `Test' v ┌───────────|─/ ┌──────────|─┐ │ルール 1 | /│ │ルール 1 | │ ├───────────|/-┤ ├──────────|─┤ │ルール 2 / │ │ルール 2 | │ ├───────────-─┤ └──────────v─┘ │ルール 3 /─┼─\_______________________/ └───────────|─┘ v ユーザ定義チェインを効果的に使う方法は、 ファイアウォールルールをどのように構築するかの章を参照して下さい。 パケットのログ記録これはルールにマッチすることの副次的効果です; マッチしたパケットを `-l' フラグを用いてログに記録することができま す。 普通、通常のパケットにおいてログを記録したくはないでしょうけど、例 外的なイベントを見たい時に便利な特徴です。 この情報のカーネルのログは以下のような感じです:
このログメッセージは簡潔に設計されており、ネットワークの権威者の為 だけに便利な技術情報を含んでいますが、あとの我々にも有用です。 簡単に説明すると以下のようになります:
標準的な Linux システムでは、カーネルの出力は klogd (カーネルロギング デーモン) にて捕捉され、 syslogd (システムロギングデーモン) に渡され ます。 `/etc/syslog.conf' は、各々の `facility' (我々の場合は、facility は "カーネル"です) の宛先と、 `level' (ipchains の為に、使われる level は "info" です)を指定することによって、 syslogd の振る舞いを制御しま す。 例えば、私の (Debian) /etc/syslog.conf は `kern.info' にマッチする 2行を含んでいます:
これらはメッセージが `/var/log/kern.log' と `/var/log/messages' に 複製されることを示しています。 詳細は `man syslog.conf' を見て下さい。 サービスの型を操作するIP ヘッダには滅多に使われない 4つのビットがあり、「サービスの型」 (TOS) ビットと呼ばれています。 それらはパケットが取り扱われる用途に影響します; 4つのビットは "Minimum Delay"(最小遅延), "Maximum Throughput" (最大処理能力), "Maximum Reliability"(最大信頼値) そして "Minimum Cost" (最小コスト) です。 それらのビットの一つだけが設定を許されます。 TOS 操作コードの作者の Rob van Nieuwkerk は以下のように述べています:
特に "Minimum Delay"(最小遅延) が私にとって重要です。 私は上流の (Linux) ルータで"対話型"パケットの為にこのスイッチをオン しています。 私のマシンは 33.6k モデムで外部と接続されています。 Linux はパケットに 3つのキューで優先順位を付けています。 この方法で私は大量のダウンロードと同時に許容できる対話的なパフォー マンスを得ています。 (これはシリアルドライバにそのような巨大なキューがなければ良いのです が、待ち時間は1.5秒に落されます。) 注意: 明らかに、あなたは入って来るパケットに対して制御はできません。 あなたは自身の Linux box を去っていくパケットの優先順位だけを制御 できます。 他の方法で優先順位をやりくりするなら、 RSVP のようなプロトコルが 必要です。(これに関しては私は何も知らないので、私には聞かないで下 さい。) 最も一般的な使用方法は telnet と ftp のコントロールコネクションに "Minimum Delay" を設定し、 FTP データに "Maximum Throughput" を設 定するものです。 以下のようになります:
`-t' フラグは 2つの特別なパラメータを持ち、それらは16進で指定します。 それらはTOS ビットを複雑にいじくり回します: 最初のマスクはパケットの現在の TOS に AND (論理積)されます。 2番目のマスクはそれに対して XOR (排他的論理和)されます。 これで激しく混乱するのでしたら、以下の一覧を使って下さい:
Andi Kleen は以下のように指摘しています。 (後々に残すために表現を 軟らかくしています。) 多分、TOS ビットの議論については、 ifconfig の txqueuelen パラメータの参照を追加するのに便利でしょう。 デバイスのキュー長の初期値はイーサネットカードの為に調整され、モデムにおいてはそれは長すぎて、 (TOSに則ったキューの) 3バンドのスケジューラを作成し、それらの働きは微々たるものです。 モデムやシングル b チャネルの ISDN 接続において、この値を 4-10 の間に設定するのは良いと思います; 太いデバイスならより長いキューが必要です。 これはカーネルバージョン 2.0 と 2.1 の問題でしたが、 2.1 においてそれは (最新の nettools を用いて) ifconfig フラグで可能になり、 2.0 においてはデバイスドライバのソースにパッチを適用して可能になります。 ですので、モデムでの PPP 接続における TOS 操作の最大の恩恵を得るには、 あなたのマシンの /etc/ppp/ip-up スクリプト内で `ifconfig $1 txqueuelen' を実行することです。 これを使う際の値はモデムの速度とモデム内のバッファの総量に依存します; 以下に Andi の私への返答をそのまま再度掲載します:
与えられたコンフィギュレーションの最適値は経験が必要です。 もしルータ上のキューが短すぎると、パケットを取りこぼしてしまいます。 そして勿論 TOS の書き換えもなく効果を得ることになり、単に TOS の書き 換えは非協力的なプログラムに効果をもたらします。 (しかし全ての標準的な Linux システムプログラムは協力的です。) パケットのマーキングこれは Alexey Kuznetsov による新たな"高品質通信"の実装によって、複雑 で強力な相互作用を有効にします。 2.1 シリーズカーネル以降のmarkベースのフォワーディングと同様に良好で す。 更なるニュースとしてはこれが使えるようになったことです。 このオプションは 2.0 カーネルシリーズでは全く無視されます。 (訳注: Quality of Service は、 QoS と略され、ネットワーク流量制限を 指します。これはカーネルのコンフィギュレーションスイッチに CONFIG_NET_QOS として存在します。) チェインの操作ipchains のとても有効な特徴は、チェイン中の関連するルールをグループ
化できることです。
お望みのチェインは何でも呼び出せますが、組み込み済みチェイン ( 新しいチェインを作る新しいチェインを作りましょう。私はとっても創造力に富んだ野郎なので、
それを
これは簡単です。 さて、あなたはこれまで詳細に述べてきたように、これにルールを入れる ことができます。 チェインを削除するチェインを削除するのも同様に簡単です。
なぜ `-X' かって? うーん、よい文字が全て取られてしまったのです。 チェインを削除するには 2つの制限があります: そのチェインは空である必要があり(後述の チェインを空にするを見て下さい)、しかも、決してどのルールのターゲットにもなっていないことです。 組み込み済みの 3つのチェインはどれも削除できません。 チェインを空にするチェインから全てのルールを取り去り空にするのは簡単で、`-F' コマンド を使います。
もし、チェイン名を指定しなければ、全てのチェインを空にします。 チェインの内容をリストアップするチェイン中の全てのルールをリストアップするには、`-L' コマンドを使い ます。
もし、チェイン名を指定しなければ、空のも含めて全てのチェインについて リストアップされます。 `-L' には 3つのオプションがあります。
(大抵の人々は DNS を使っていますが) DNS が適切に設定
されていない場合や DNS の要求をフィルターアウトしている場合は、
`-v' オプションはルールの詳細を全て、例えば、パケットやバイトの カウンター、TOS マスク、インターフェイス、そしてパケットマークを 表示します。 このオプションを指定しなければ、これらの値は省略されます。
注記として、パケットとバイトのカウンターは、1000, 1,000,000 および 1,000,000,000 を、それぞれ `K', `M' および `G' の接尾辞を使って表示 します。 `-x' (拡張数値)オプションを使うと、値の大きさにかかわらず完全な数値 を同様に表示します。 カウンターを(ゼロに)リセットするカウンターをリセットできると便利です。これは `-Z' (カウンタをゼロにする) オプションでできます。例えば:
このやり方では、リセットする直前のカウンタ値を知る必要があるときに 問題になります。 上記の方法では、`-L' から `-Z' コマンドまでの間にいくつかのパケット が通過するかもしれません。 そのため、カウンターを読むと同時にリセットするには、`-L' と `-Z' を 同時に使います。 残念ながら、あなたがこれを使うと、単一のチェインを操作できません: 一旦全てのチェインをリストアップしてゼロにする必要があります。
ポリシーを設定する以前にパケットがどのようにチェインを通り抜けるのかを、前述の
ターゲットの指定にて論じたとき、パケット
が組み込み済みチェインの終わりに達した時に何が起きるのかを大体述べまし
た。
この場合、チェインのポリシーがそのパケットの運命を決定します。
組み込み済みチェイン( ポリシーは最初から 4つまでの特別なターゲットのいずれかです:
また、重要な注意点として、組み込み済みチェイン中のルールにおける マスカレーディングの操作IP マスカレーディングを微調整する幾つかのパラメータがあります。
それらは IP マスカレーディングのコマンドは `-M' で、今マスカレードされている コネクションをリストアップするために `-L' と組み合わせられ、マスカ レーディングの値を調整するために `-S' と組み合わせられます。 `-L' コマンドは `-n' (ホスト名やポート名ではなく、数値を表示します。) か、または `-v' (まさにあなたが注意する、マスカレードコネクションの シーケンス番号の詳細を表示します。)を伴います。 `-S' コマンドは以下の 3つのタイムアウト値を設定します、それらは 秒単位です: TCP セッション、 FIN パケット後の TCP セッションと、 UDP パケット です。 もしそれらの値の一つを変更したくないならば、単純に `0' が与えられ ます。 既定値は `/usr/src/linux/include/net/ip_masq.h' にリストアップさ れており、 現在はそれぞれ 15 秒、 2秒 そして 5秒です。 変更される最も一般的な値は、 ftp の為に変更する最初の値です。 (後述の FTP の悪夢を参照して下さい。) マスカレーディングのタイムアウト値を設定できません!に列挙したタイムアウトの設定に関する問題に注意して下さい。 パケットをチェックする時にあなたのマシンに一定のパケットが入り込む際に何が起こるのかを
見たいと思うことでしょう。
あなたのファイアウォールチェインをデバッグする時など。
パケットをテストするチェインは、引数 `-C' の後にパケットのテストを
するチェインの名前を指定します。
カーネルは常に `packet' の詳細は、ファイアウォールルールを指定する為に用いられる のと同じ書き方を用いて指定します。 特に、プロトコル (`-p') 、ソースアドレス (`-s') 、宛先アドレス (`-d') とインターフェース (`-i')は必須です。 もしプロトコルが TCP 又は UDP なら、単一のソースと単一の宛先ポート が指定されなければなりませんし、 ICMP プロトコルにおいては ICMP タ イプが指定されなければなりません。 (フラグメントを示す `-f' フラグを指定していなければ。指定している場合は これらのオプションは不正です。) プロトコルが TCP ならば (そして `-f' フラグがしていされていなけ れば) 、テストパケットに SYN ビットをセットするのに `-y' フラグを指定 してもよいでしょう。 以下は 192.168.1.1 の60000 ポートから 192.168.1.2 の www ポートへ、 eth0 インターフェースに入り、 `input' チェインに到達する TCP SYN パケットをテストする例です。 (これは典型的な WWW の接続開始の入来です)
一度に複数のルールと何が起こるのかを見る時に単一のコマンドラインが複数のルールに影響させることができます。
これには二つの方法があります。
最初に、(DNS を用いて)複数の IP アドレスに解決するホスト名を指定
すると、 ですから、もしホスト名 `www.foo.com' が 3つの IP アドレスに解決
し、ホスト名 `www.bar.com' が 2つの IP アドレスに解決する場合、
コマンド `ipchains -A input -j reject -s www.bar.com -d www.foo.com'
は、
個人的には、 `-b' オプションは好きでないです; もっと便利にしたいなら、後述の ipchains-save を使うを見て下さい。 -b オプションは 挿入 (`-I') 、 削除 (`-D') (でもルールナンバーの 拡張ではありません。) 、追加 (`-A') とチェック (`-C') コマンドと 共に使えます。 もう一つの便利なフラグに `-v' (冗長な) があります。
これは
4.2 実例集私の PC はインターネットへダイヤルアップ PPP 接続されます。 ( 私は PC がオンラインの際に誰かが私の PC に対して ftp を試みる
ことに関しては気にしません。 ( このセットアップはとても単純で、何故なら今私の内部ネットワーク上 には他にマシンがないからです。 私はあらゆるローカルプロセス(すなわち、ネットスケープ、 lynx 等) を doubleclick.net に接続させたくありません。
さて、私は外へ出て行く様々なパケットに優先順位を設定したいです。
(入って来るパケットに対してこれを行う多くのメリットはありません。)
これらのルールが多数あるので、
web のトラフィックと telnet へ最小遅延を設定します。
ftp データ, nntp, pop-3 に低コストを設定します:
ppp0 インターフェースに入って来るパケットには幾つかの制限があります: `ppp-in' というチェインを作りましょう:
さて、
私は DNS の UDP パケット (私は全ての要求を 203.29.16.1 へ転送する キャッシュネームサーバを動かしているので、それらの要求からその DNS だけが返答することを予測します。) と 入って来る ftp と帰って来る ftp-data (これらは1023番以上のポートのみが使われ、且つ6000番近辺の X11 ポー トを使いません。) の TCP パケットのみを許可します。
帰ってくる TCP の返答パケットを許可します。
最後に、ローカルとローカル同士のパケットは OK です:
さて、私の
注意: 私はこの順番でチェインをセットアップしませんでした。 セットアップの最中にパケットが入り込んで来るからです。 最も安全なのは最初に DENY のポリシーを設定することです。 勿論、あなたのルールがホスト名を解決する為に DNS の参照を 要求するなら、問題が発生することでしょう。 ipchains-save を使うまさにあなたのお望み通りのファイアウォールチェインをセットアップし、 そして次回にやったことを思い出そうとするのは辛いことです。 そこで、今セットアップしたあなたのチェインを読み、ファイルに保存す
る、
ipchains-restore を使う
もし、 input チェイン内にユーザー定義チェインがあれば、 例:
次のページ 前のページ 目次へ |
[ |