レンタルサーバ + Webシステム開発 = E-business

■レンタルサーバご利用参考資料
サーバご利用の参考にJF Project によるJF (Japanese FAQ)を掲載しています。

Linux JF(Japanese FAQ)Project.
JF は, Linux に関する解説文書・FAQ などを作成・収集・配布するプロジェクトです.

グリーンネット・トップページへ戻る


一覧に戻る
  Linux 2.4 Packet Filtering HOWTO
  Rusty Russell, mailing list netfilter@lists.samba.org
  $Revision: 1.24 $ $Date: 2002/01/14 09:35:13 $
  日本語訳: 山森 浩幸 (h-yamamo@db3.so-net.ne.jp)
  v1.24j  Jan. 20, 2002

  この文書は、2.4系 Linux カーネルにおける、不当なパケットをフィルターア
  ウトする iptables の使い方について述べています。
  ______________________________________________________________________

  目次

  1. はじめに
  2. 公式ウェブサイトはどこにありますか? メーリングリストはありますか?
  3. それで、パケットフィルターって何ですか?
     3.1 なぜ、パケットフィルターが必要なのでしょう?
     3.2 Linux でパケットフィルターはどのようにやるの?
        3.2.1 iptables
        3.2.2 ルールを永続させる

  4. いったいおまえは誰なんだ、そしてなぜ私のカーネルで遊んでるんだ?
  5. Rusty のパケットフィルタリング、本当にクイックガイド
  6. どのようにパケットはフィルターを通り抜けるか
  7. iptables を使う
     7.1 コンピュータを起動したとき見るべきこと
     7.2 ルールの操作
     7.3 フィルタリングの仕様
        7.3.1 ソースとあて先 IP アドレスの指定
        7.3.2 否定の指定
        7.3.3 プロトコルの指定
        7.3.4 インターフェイスの指定
        7.3.5 フラグメントの指定
        7.3.6 iptables への拡張 新しいマッチ
           7.3.6.1 TCP 拡張
              7.3.6.1.1 TCP フラグの説明
           7.3.6.2 UDP 拡張
           7.3.6.3 ICMP 拡張
           7.3.6.4 その他のマッチの拡張
           7.3.6.5 状態のマッチ
     7.4 ターゲットの仕様
        7.4.1 ユーザ定義チェイン
        7.4.2 iptables への拡張 新しいターゲット
        7.4.3 特別な組み込み済みターゲット
     7.5 チェインの操作
        7.5.1 新しいチェインを作る
        7.5.2 チェインを削除する
        7.5.3 チェインを空にする
        7.5.4 チェインの内容をリストアップする
        7.5.5 カウンターをリセット(ゼロに)する
        7.5.6 ポリシーを設定する

  8. ipchains と ipfwadm を使う
  9. NAT とパケットフィルタリングの混合
  10. iptables と ipchains の違い
  11. パケットフィルター設定のアドバイス
  12. 日本語訳について

  ______________________________________________________________________

  1.  はじめに

  ようこそ、読者のみなさん。

  ここでは、IP アドレス、ネットワークアドレス、ネットマスク、ルーティン
  グそして DNS が何であるか知っていることを前提にしています。もし、分か
  らないのであれば、Network Concepts HOWTO (訳注: この文書の原文が公開さ
  れている場所にある Linux Networking-concepts HOWTO) を読むことをお勧め
  します。

  この HOWTO は 2つの顔を持っています。やさしい入門書風の箇所では、読者
  を何となく安心させますが、現実世界の厳しさには気付かないままです。しか
  し、細部までむき出しにして隠さずに伝えようとする箇所では、徹底理解に勤
  めない読者を混乱させ、不安にし、徹底武装させてしまうことでしょう。

  あなたのネットワークは決して安全ではありません。高速で便利な通信を確保
  して、それを善良な利用者にだけ提供し、しかも悪意のある者を締め出そうと
  言うのは、数ある手に負えない問題の 1つです。例えば、言論の自由を保証し
  ながらも満員の映画館で「火事だー!」などと叫び出す危険な言動を禁じよう
  とするのと同じことです。この HOWTO では、そうした問題の解決方法につい
  てまで解説するスペースはありません。

  ですから、どこで妥協するかを決められるのは、あなた自身だけなのです。以
  下では、有効ないくつかのツールを紹介し、知っておくべき弱点などを注意し
  ていきます。これらを悪用することなく、正しい目的のために使ってくださ
  い。このような話をすること自体も、悪用の可能性が残ってしまう問題の一例
  ですね。

  (C) 2000 Paul `Rusty' Russell.  Licenced under the GNU GPL.

  2.  公式ウェブサイトはどこにありますか? メーリングリストはありますか?

  3つの公式サイトがあります:

  o  Filewatcher  に感謝します。

  o  Samba チームと SGI  に感謝します。

  o  Harald Welte  に感謝します。

  上記全ては 
  から、ラウンドロビン DNS を参照して到達できます。

  公式 netfilter メーリングリストはこちら: netfilter リスト
   を見てください。

  3.  それで、パケットフィルターって何ですか?

  パケットフィルターというのは、流れて行くパケットのヘッダーを読んで、そ
  のパケットの運命を決めるソフトウェアです。パケットを DROP(まるで受け
  取っていないかのように破棄)したり、 ACCEPT (パケットを通過させる)した
  り、設定によってはもっと複雑な処理をしたりします。

  Linux において、パケットフィルタリングはカーネルに組み込まれて (カーネ
  ルモジュールとして、または直に組み込まれて)います。パケットに対して多
  少の曲芸的なこともできますが、パケットのヘッダーを見てその運命を決定す
  ると言う一般原則が常にあります。

  3.1.  なぜ、パケットフィルターが必要なのでしょう?

  コントロール。セキュリティ。監視。

     コントロール:
        あなたが Linux ボックスを内部のネットワークと別のネットワーク(例
        えば、インターネット)を繋ぐために使っているなら、あなたには、特
        定のトラフィックだけ許可して、他のものを許さないようにするチャン
        スがあります。例えば、パケットのヘッダーにはあて先アドレスが含ま
        れていて、外部ネットワークのとある所へ向かうパケットを拒否するこ
        とができます。別の例として、Netscape を使って Dilbert のアーカイ
        ブ (訳注: Dilbert というエンジニアが主人公の風刺漫画のサイト、ち
        なみに dilbert の意味はばか) にアクセスする場合です。ページには
        doubleclick.net の広告があり、 Netscape はそれをいそいそとダウン
        ロードするために私の時間を浪費します。パケットフィルターに
        doubleclick.net 所有のアドレスからのどんなパケットも許可しないよ
        うに指示すれば問題は解決します(もっといい方法がありますけれど:
        Junkbuster(訳注: http://internet.junkbuster.com) を見てくださ
        い)。

     セキュリティ:
        あなたの Linux ボックスがインターネットの混沌と、ナイスで秩序正
        しいあなたのネットワークの間にある唯一の物なら、すばらしいこと
        に、あなたは殴りにやって来る者をドアのところで制限することができ
        ます。例えば、あなたのネットワークから出て行くものは何でも許すよ
        うにして、悪意のある外部からのよく知られた `Ping of Death' 攻撃
        を気に掛けるようにできます。別の例として、あなたの Linux ボック
        スに、たとえ全てのアカウントにパスワードが付いているとしても、外
        部の者が telnet してくることを望まないかもしれません。たぶん、あ
        なたは (たいていの人々のように)インターネットをただ眺めていたい
        だけで、サーバーに(好むと好まずにかかわらず)なりたくないのです。
        単純に、パケットフィルターで接続を開始するパケットの流入を拒否し
        て、だれにも接続されないようにしてください。

     監視:
        ときどきローカルネットワーク中に環境設定の悪いマシンがあり、外の
        世界にパケットが漏れ出るようになっていることがあります。すばらし
        いことに、パケットフィルターは何か異常なことが起こったときにあな
        たに知らせてくれます。たぶんあなたは何らかの対処ができるでしょう
        し、あるいはあなたの性質上、単に興味を持つだけかもしれません。

  3.2.  Linux でパケットフィルターはどのようにやるの?

  Linux カーネルには 1.1系からパケットフィルタリングがありました。第1世
  代は、1994年後期に Alan Cox により、BSD の ipfw を基礎にして移植されま
  した。Linux 2.0 では、Jos Vos を初めとする人達により拡張され、カーネル
  のフィルタリングルールをコントロールするユーザ空間ツール `ipfwadm' が
  生まれました。1998年中期、Linux 2.2 では、私は Michael Neuling の援助
  を得てカーネルを全くどっさりと作り直し、ユーザ空間ツール `ipchains' を
  導入しました。最終的に、1999年中期、 Linux 2.4 では、第4世代ツール
  `iptables' とカーネルの別の部分を書き換えました。この HOWTO が集中して
  述べているのはこの iptables についてです。

  netfilter という基盤を持ったカーネルが必要です  Linux カーネルには追加
  機能(例えば iptables モジュール)を差し込むことができますが、 netfilter
  はこの一般的な枠組みの中に含まれています。これは、カーネル 2.3.15 かそ
  れ以降が必要で、カーネルコンフィギュレーションの CONFIG_NETFILTER に
  `Y' と答える必要があります。

  iptables というツールは、カーネルに話かけて、カーネルがどのパケットを
  フィルターすべきかを伝えるものです。プログラマーや特に好奇心旺盛な人は
  別ですが、普通はこれを使ってパケットフィルターをコントロールします。

  3.2.1.  iptables

  iptables はカーネルのパケットフィルタリングテーブルにルールを挿入した
  り削除したりします。これは、あなたが設定したものはリブートすると失われ
  ることを意味しています。次回、Linux がブートしたとき設定を回復させる確
  かな方法は ``ルールを永続させる'' を見てください。

  iptables は ipfwadm と ipchains の置き換えです。もし、あなたが現在これ
  らのどちらか一方のツールを使っていて、苦労を避けるため iptables を使わ
  ずに済ます方法は ``ipchains と ipfwadm を使う'' を見てください。

  3.2.2.  ルールを永続させる

  あなたの現在のファイアーウォールの設定はカーネル中にあるだけなので、リ
  ブートすると失われてしまいます。iptables-save と iptables-restore スク
  リプトを使えば、設定をファイルに保存しておき、その後、そのファイルから
  回復することができます。

  別の方法は、ルールを設定するために必要なコマンドを初期化スクリプト中に
  書くことです。万一コマンドの内の 1つが失敗したなら、頭を絞ってやろうと
  していることを確かめてください(普通、`/sbin/sulogin' を実行してシング
  ルユーザモードで作業します)。

  4.  いったいおまえは誰なんだ、そしてなぜ私のカーネルで遊んでるんだ?

  私は Rusty Russell。Linux の IP ファイアーウォールのメインテナーと、ほ
  んのもう 1つ、別の箇所のコーディングを担当していますが、それはたまたま
  適切な時期に適切な場所にいたからにすぎません。私は ipchains を書きまし
  た (実際に作業した人々に称賛をはらい、``Linux でパケットフィルターはど
  のようにやるの?'' を見てください)。そしてこのときパケットフィルタリン
  グの正しいあり方を十分に学びました。そうあることを望んでいます。

  WatchGuard 、本当にナイスなプラグインの
  Firebox (訳注: Linux 内蔵のファイアーウォール製品)を売っているすばらし
  いファイアーウォールの会社で、何もしない私に給料を払ってくれて、それで
  私は全ての時間をこのしろものを書くことに、そして以前のもののメンテナン
  スに費やすことができました。私は 6か月と予測して、12か月かかりました
  が、それを適切なものにすると言う目的を果たせたと感じました。多くの書き
  直し、ハードディスクのクラッシュ、ラップトップの盗難、ファイルシステム
  不正に続けてスクリーンの故障、がありました。

  私がここにいる間に、何人かの人々の誤解を解いておきたいです  私はカーネ
  ルの神様ではありません。と言うのは、私はカーネルの仕事をするのに彼ら:
  David S. Miller, Alexey Kuznetsov, Andi Kleen, Alan Cox の何人かと接触
  することになったからです。とは言え、彼らは皆底深いマジックをするのに忙
  しくて、私はかまってもらえず安全な浅い川の縁を苦労して進んでいます。

  5.  Rusty のパケットフィルタリング、本当にクイックガイド

  ほとんどの人はインターネットにただ 1つの PPP コネクションで繋いでいま
  すが、そこから自分のネットワークに誰かが入ってくることを望む人は誰もい
  ません。すなわちファイアーウォールの出番です。

       ## コネクション追跡モジュールの挿入(カーネル直組み込みの場合は不要)
       # insmod ip_conntrack
       # insmod ip_conntrack_ftp

       ## 内部からのもの以外の新しいコネクションをブロックするチェインの作成
       # iptables -N block
       # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
       # iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
       # iptables -A block -j DROP

       ## INPUT および FORWARD チェインから上記のチェインへジャンプする
       # iptables -A INPUT -j block
       # iptables -A FORWARD -j block

  6.  どのようにパケットはフィルターを通り抜けるか

  カーネルは起動時に `filter' テーブルという所に 3つのルールリストを保持
  しています。これらのリストはファイアーウォールチェイン、または単にチェ
  インと呼ばれます。3つのチェインは INPUT, OUTPUT そして FORWARD と呼ば
  れています。

  ASCII アートファンのために、チェインはこのように配置されています (これ
  は、2.0 および 2.2 カーネルの配置と大変異なっています!) :

  入って来る/ ̄ ̄ ̄\        出て行く
        ルーティング|FORWARD |
            の決定      \___/

                     / ̄ ̄\
                  / ̄ ̄\                    |OUTPUT|
                 |INPUT |                    \__/
                  \__/

                     ローカル プロセス

  (訳注: この他に NAT 用のチェインとして、ルーティングの決定の手前に
  `PREROUTING' チェインが、出て行くの手前に `POSTROUTING' チェインがあり
  ます。)

  3つの円は、上で述べた 3つのチェインを表わしています。パケットが図上の
  1つの円に達したら、そのチェインが検査されてパケットの運命を決めます。
  もし、チェインがパケットを DROP(破棄)すると言ったら、パケットはそこで
  抹殺されますが、もし、チェインがパケットを ACCEPT(受け入れ)すると言っ
  たら、パケットは図上を移って行きます。

  1つのチェインは複数のルールのチェックリストから構成されています。各々
  のルールは「もし、パケットのヘッダーがこんなだったら、パケットをこのよ
  うにしなさい」と指示します。もし、あるルールがパケットとマッチしなけれ
  ば、チェイン内の次のルールが調べられます。最終的に、調べるルールが無く
  なったら、カーネルはそのチェインのポリシー (方針)を見て何をするか決め
  ます。セキュリティ意識の強いシステムでは、このポリシーは普通、パケット
  を DROP するようにカーネルに指示します。

  1. パケットが入って来たとき(例えば、イーサネットカードから)、カーネル
     は最初にパケットの行き先を見ます。これはルーティングと呼ばれます。

  2. もし、行き先が自分の Linux ボックスなら、パケットは図では下に降りて
     INPUT チェインに入ります。もし、そこを通過すれば、パケットはそれを
     待っているプロセスに受け取られます。

  3. そうでないなら、カーネルのフォワード(転送)機能が有効になっていない
     場合、あるいはカーネルがそのパケットのフォワードの方法を知らない場
     合、パケットは破棄されます。フォワード機能が有効になっていて、パ
     ケットの行き先が別のネットワークインターフェイス(もう 1つあるなら)
     であれば、図ではパケットは右の方へ進み FORWARD チェインに入ります。
     もし、ACCEPT されれば、パケットは送り出されます。

  4. 最後になりますが、この箱で動いているプログラムはネットワークへパ
     ケットを送ることができます。これらのパケットは直接 OUTPUT チェイン
     に入ります。もし、そこで ACCEPT と言われれば、パケットはその行き先
     に従ったインターフェイスから出て行きます。

  7.  iptables を使う

  個々の事項についてのもっと詳しい説明が必要なら、iptables にはかなり詳
  しいマニュアルページ(man iptables)があります。 ipchains に精通している
  人はすぐにでも``iptables と ipchains の違い''を見たいにちがいありませ
  ん。実際、 2つはとても似ています。

  iptables を使って色々なことができます。まず、3つの組み込み済みチェイン
  INPUT, OUTPUT そして FORWARD (これらは削除できません)から始めます。で
  は、チェインを扱う操作を見てみましょう:

  1. 新しいチェインを作る (-N)

  2. 空のチェインを削除する (-X)

  3. 組み込み済みチェインのポリシーを変更する (-P)

  4. チェイン内のルールをリストアップする (-L)

  5. チェインからルールを全て消し去る (-F)

  6. チェイン内の全てのルールのパケットとバイトのカウンターをゼロにする
     (-Z)

  チェイン内のルールを操作するには様々な方法があります:

  1. チェインに新しいルールを追加する (-A)

  2. チェイン内のある位置に新しいルールを挿入する (-I)

  3. チェイン内のある位置のルールを置き換える (-R)

  4. チェイン内のある位置の、または記述と一致した最初のルールを削除する
     (-D)

  7.1.  コンピュータを起動したとき見るべきこと

  iptables はたぶんモジュールになっています。名前は(`iptable_filter.o')
  で、最初に iptables を実行したときに自動的にロードされるはずです。ま
  た、カーネルに恒常的に組み込むこともできます。

  全く 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 127.0.0.1
       PING 127.0.0.1 (127.0.0.1): 56 data bytes
       64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

       --- 127.0.0.1 ping statistics ---
       1 packets transmitted, 1 packets received, 0% packet loss
       round-trip min/avg/max = 0.2/0.2/0.2 ms
       # iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
       # ping -c 1 127.0.0.1
       PING 127.0.0.1 (127.0.0.1): 56 data bytes

       --- 127.0.0.1 ping statistics ---
       1 packets transmitted, 0 packets received, 100% packet loss
       #

  ご覧のとおり最初の 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個だけしかないのを分っている場合では、番号を使っ
  て以下のように削除できます:

               # iptables -D INPUT 1
               #

  INPUT チェインのルール番号 1 を削除。

  2番目の方法は -A コマンドをそっくり写して -A を -D に置き換えたもので
  す。これはルールが複雑なチェインの場合で、例えば、取り除きたいのがルー
  ル 37 だと探し当てるためにルールを数えたくない場合に有効です。この場
  合、次のように使います:

               # iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
               #

  -D の書き方は、-A (または -I か -R) コマンドのときと正確に同じオプショ
  ンでなければなりません。もし、同一チェイン中に複数のマッチするルールが
  あったら、最初のだけが削除されます。

  7.3.  フィルタリングの仕様

  これまでに、プロトコルを指定する `-p' オプションと、ソースアドレスを指
  定する `-s' オプションを見てきましたが、この他にもパケットの特徴を指定
  する様々なオプションがあります。これから、その概要をあますところなくお
  話します。

  7.3.1.  ソースとあて先 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 0/0' はここでは冗長です。]
               # iptables -A INPUT -s 0/0 -j DROP
               #

  上記の効果は `-s' オプションを指定しないのと全く同じなので、こんな使い
  方はめったにしません。

  7.3.2.  否定の指定

  `-s' (または `--source') や `-d' (`--destination') オプションを含めて
  多くのオプションは、`!' (否定の宣言)をその引数の前に置くことができま
  す。`-s' や `-d' の場合は与えられたアドレスと等しくないアドレスとマッ
  チします。例えば、`-s ! localhost' は localhost からでないパケットと
  マッチします。

  7.3.3.  プロトコルの指定

  プロトコルは `-p' (または `--protocol') オプションで指定します。プロト
  コルの値は番号(あなたが IP のプロトコルの数値番号を知っている場合)か
  `TCP', `UDP' または `ICMP' という特定の名称で指定します。大文字小文字
  の区別はしませんから、`tcp' も `TCP' と同じ働きをします。

  プロトコル名称はそれを否定するために `!' を前に付けることができます。
  例えば、`-p ! TCP' は TCP でないパケットを指定します。

  7.3.4.  インターフェイスの指定

  `-i' (または `--in-interface') と `-o' (または `--out-interface') オプ
  ションはマッチすべきインターフェイスの名前を指定します。インターフェイ
  スとは、パケットが入って来る (`-i') または出て行く (`-o') 物理デバイス
  です。`ifconfig' コマンドを使って `up' である (すなわち、今動いている)
  インターフェイスをリストアップできます。

  INPUT チェインに入って来るパケットには output インターフェイスが無いの
  で、このチェインで `-o' を使ったルールは決してマッチしません。同様
  に、OUTPUT チェインに入って来るパケットには input インターフェイスが無
  いので、このチェインで `-i' を使ったルールは決してマッチしません。

  FORWARD チェインに入って来るパケットだけが、input と output の両方のイ
  ンターフェイスを持っています。

  現在存在していないインターフェイスを指定することは全く問題がありません
  が、指定したインターフェイスが up して来るまでルールがマッチすることは
  ありません。これはダイアルアップ PPP リンク(通常インターフェイスは
  ppp0 )や同様のものについて非常に有効です。

  特別なケースとして、インターフェイス名の後ろに `+' を付けたものはその
  文字列から始まる全てのインターフェイス(現在存在してようとなかろうと)
  にマッチします。例えば、全ての PPP インターフェイスにマッチするルール
  の指定は、-i ppp+ オプションを使います。

  指定したインターフェイスと一致しないパケットにマッチするようにインター
  フェイス名の前には前後に空白を挟んで `!' を置くことができます。例え
  ば、-i ! ppp+ とします。

  7.3.5.  フラグメントの指定

  ときどきパケットが、一度にケーブルに送り出すには大き過ぎることがありま
  す。こんなときは、パケットはフラグメントに分割され、複数のパケットで送
  られます。受信点でこれらのフラグメントを再び集めて完全なパケットに再構
  成します。

  フラグメントの問題点は、先頭のフラグメントには完全なヘッダーフィール
  ド(IP + TCP, UDP および ICMP)があり検査できますが、後続のパケットには
  ヘッダー全てが揃っていません(IP ヘッダーだけで追加のプロトコルフィール
  ドは無し)。従って後続のフラグメントのプロトコル固有ヘッダー(TCP, UDP
  および ICMP で拡張された)をのぞき込むことはできません。

  もし、コネクション追跡や NAT を行っているなら、全てのフラグメントはパ
  ケットフィルタリングのコードに届く前にマージされて元通りにされるので、
  フラグメントについて心配する必要はありません。

  そうでなければ、フィルタリングルールがフラグメントをどのように扱うかを
  理解することが重要です。情報が無ければどんなフィルタリングルールもマッ
  チしません。この意味するところは 1番目のフラグメントは他のパケットと同
  じように扱われます。2番目以降のフラグメントは異なります。従って -p TCP
  --sport www というルール(ソースポートが `www' の指定)はフラグメント(1
  番目のフラグメント以外)と決してマッチしません。同様に否定のルール -p
  TCP --sport ! www もマッチしません。

  とはいえ、`-f' (または `--fragment')オプションを使って 2番目以降のフラ
  グメントを特定するルールを指定できます。また、` ! ' を `-f' の前に付け
  て(訳注: ! -f として) 2番目以降のフラグメントと適合しないルールの指定
  もできます。

  通常、フィルタリングは 1番目のフラグメントに効力があるので、目的のホス
  トでのフラグメントの再組み立てを妨げるため、2番目以降のフラグメントを
  通過させることは安全とみなされています。とはいえ、フラグメントを送るこ
  とにより簡単にマシンをクラッシュさせることができるバグが知られていま
  す。調べてくださいね。

  ネットワーク管理者のための注記: 異常なパケット(TCP, UDP および ICMP の
  パケットで短すぎてファイアーウォールのコードがポート番号または ICMP の
  コードと種類を読めないもの)はそれらの検査が試みられるとき破棄されま
  す。それで TCP パケットのフラグメントの位置は最低でも 8 から始まりま
  す。

  例えば、次のルールは 192.168.1.1 へ行くフラグメントはどれでも破棄しま
  す:

       # iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
       #

  7.3.6.  iptables への拡張  新しいマッチ

  iptables は拡張性に富んでいます、その意味するところは、カーネルと
  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' オプションを使います。例えば:

       # iptables -p tcp --help
       #

  7.3.6.1.  TCP 拡張

  TCP 拡張は `-p tcp' を指定すると自動的にロードされます。以下のオプショ
  ンが提供されています(フラグメントは決してマッチしません)。

     --tcp-flags
        後に `!' オプション指定可で、2つのフラグ文字列をとり、指定した
        TCP フラグでフィルターできます。1番目の文字列はマスクするフラグ
        で、検査したいフラグを書き並べます。2番目の文字列は(訳注: 1番目
        の文字列のうちで)セットされているべきフラグを指定します。例え
        ば、

          # iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

     これは全てのフラグを検査し(`ALL' は `SYN,ACK,FIN,RST,URG,PSH' と同
     じ意味)、SYN と ACK だけがセットされているべきことを示しています。
     また `NONE' はどのフラグもセットされていないことを意味します (訳注:
     `NONE' を使うのは普通、2番目の文字列で、1番目で指定したフラグが全て
     オフであることを検査します)。

     --syn
        前に `!' オプション指定可で、これは `--tcp-flags SYN,RST,ACK
        SYN' の省略表現です。

     --source-port
        後に `!' オプション指定可で、1つの TCP ポート、またはポートの範
        囲のどちらでも指定できます。ポートは /etc/services に一覧されて
        いる名前でも、番号でも指定できます。範囲の指定は 2つのポートを
        `:' で区切るか、後ろに `:' を付ける (指定したポート番号以上を示
        す)か、前に `:' を付ける (指定したポート番号以下を示す)かのいず
        れかです。

     --sport
        は `--source-port' と同じ意味です。

     --destination-port
        と

     --dport
        は上記と同様で、ソースの代わりに、単にあて先のポートとマッチする
        かの指定です。

     --tcp-option
        後に `!' オプション指定可で、数値を指定し、パケットの TCP オプ
        ション(訳注: オプションフィールドの 1バイト目の種別) が指定値と
        等しいときマッチします。TCP オプションの検査をしようとするとき、
        パケットに TCP ヘッダーが完全に含まれていなければパケットは自動
        的に破棄されます。

  7.3.6.1.1.  TCP フラグの説明

  一方向だけ TCP コネクションを許可し、他方は許可しないようにすることは
  往々にして有効です。例えば、あなたが外部の WWW サーバーと接続したい
  が、そのサーバーからの接続を許可したくないときです。

  そのサーバーから来る TCP パケットをブロックすることは自然な方法です。
  残念なことに、TCP コネクションにはとにかく両方向のパケットが行き来する
  ことが必要です。

  その解決方は、接続を要求するパケットだけをブロックすることです。このよ
  うなパケットは SYN パケットと呼ばれています(オーケー、技術的には SYN
  フラグがセットされていて、RST と ACK フラグがクリアされているパケット
  ですが、短縮して SYN パケットと呼んでいます)。これらのパケットだけ許可
  しないようにすれば、パケットを逆にたどって接続して来るのを止めることが
  できます。

  `--syn' オプションはこのために使われます。このオプションは TCP プロト
  コルが指定されているルールにだけ有効です。例えば、192.168.1.1 からの
  TCP 接続の試みの指定:

       -p TCP -s 192.168.1.1 --syn

  このオプションは `!' を前に付けて(訳注: ! --syn として)否定することが
  でき、その意味は接続開始のパケットを除く全てのパケットです。

  7.3.6.2.  UDP 拡張

  この拡張は `-p udp' を指定すると自動的にロードされます。オプションは
  `--source-port' または `--sport' と `--destination-port' または
  `--dport' が提供され、詳細は TCP と同様です。

  7.3.6.3.  ICMP 拡張

  この拡張は `-p icmp' を指定すると自動的にロードされます。新しいオプ
  ションが 1つだけ提供されます:

     --icmp-type
        後に `!' オプション指定可で、ICMP の種類を名前で (例えば
        `host-unreachable')、または種類を数値で(例えば `3')、または種類
        とコードを `/' で区切ったもの(例えば `3/3')を指定します。 ICMP
        の種類で指定できる名前のリストは `-p icmp --help' で得られます。

  7.3.6.4.  その他のマッチの拡張

  netfilter パッケージのその他の拡張は実証的拡張で、インストール済みなら
  `-m' オプションで呼び出すことができます。

     mac
        このモジュールは明示的に `-m mac' または `--match mac' で指定さ
        れなければなりません。これは入って来るパケットの発信元イーサネッ
        ト(MAC)アドレスとのマッチングに使い、そのため、PREROUTING と
        INPUT チェインに入って来るパケットにだけ有効です。このモジュール
        はオプションを 1つだけ提供します:

        --mac-source
           後に `!' オプション指定可で、イーサネットアドレスをコロンで区
           切った 16進表記で指定します。例えば、 `--mac-source
           00:60:08:91:CC:B7'

     limit
        このモジュールは明示的に `-m limit' または `--match limit' で指
        定されなければなりません。これはマッチするレート (頻度)を制限す
        るために使われ、例えば、ログメッセージを抑止するために使います。
        このオプションは単位時間あたりに指定された回数分だけマッチしま
        す(初期値は 1時間あたり 3回のマッチで、バーストは 5 です)。これ
        は 2つのオプション引数をとります:

        --limit
           後に数値を指定します。単位時間あたりに許される平均マッチ回数
           の最大値を指定します。指定値は、`/second', `/minute', `/hour'
           または `/day' を使って、あるいはその一部(それで `5/second' は
           `5/s' と同じ)で単位を明示することができます。

        --limit-burst
           後に数値を指定します。これは上記の limit が作動し始める手前の
           最大バースト値(訳注: 許容できる突発的な増大係数で、平均レート
           の倍数)を指定します。

        このマッチは、しばしばログのレート(頻度)制限をするために LOG
        ターゲットと共に使われます。どのように働くのか理解するために、初
        期値の limit パラメータでパケットをログする次のルールを見てみま
        しょう:
          # iptables -A FORWARD -m limit -j LOG

     最初にこのルールに達したとき、パケットはログされます。実際、初期値
     のバーストは 5 なので、最初の 5パケットがログされます。このあと、何
     個のパケットが届くかには関係なく、20分間はこのルールによりログされ
     ることはありません。そして、20分経過する毎にマッチするパケットがな
     ければ、バーストは 1 づつ回復します。もし、100分間にルールにヒット
     するパケットがなければ、バーストは完全に回復し、始めと同じに戻りま
     す。

     注記: 現在のところ約 59時間を超える回復時間のルールは作れないので、
     もし、平均レートを 1日 1回に設定した場合、バーストレートは 3 未満で
     なくてはなりません。

     このモジュールは、また、速いレートの感応性を高めることで、各種の
     サービス拒否攻撃(DoS)を防ぐことができます。

     SYN パケット溢れへの防御:

          # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

     こっそり覗きのポートスキャナー:

          # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

     Ping of death:

          # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

     このモジュールは、下のグラフに示すように、ヒステリシスドアのように
     働きます。

            レート(パケット数/秒)
                       ^         .---.
                       |        / DoS \
                       |       /       \
          DoSの始まり -|......:.........\.......................
           = (limit *  |     /:          \
          limit-burst) |    / :           \         .-.
                       |   /  :            \       /   \
                       |  /   :             \     /     \
          DoSの終わり -|./....:..............:.../.......\..../.
           = limit     |/     :              :`-'         `--'
          -------------+------+--------------+------------------> 時間 (秒)
              論理  マッチ| マッチしない |  マッチ

     例えば、1秒あたり 1パケットでバーストが 5パケットのマッチを指定して
     いるところに、1秒あたり 4パケットがやって来て 3秒間続き、それか
     ら、3秒間で再びパケットがやって来るとします。

                  溢れ 1溢れ 2

          トータル^                         _ ̄    YNNN
          パケット|               ライン_YNNN
            数    |           レート_YNNN
               10 |        最大 _Y
                  |         _Y
                  |     _Y
                  | _YNNN
                  |-    YNNN
                5 |    Y
                  |   Y                             キー: Y ルールにマッチする
                  |  Y                                    N ルールにマッチしない
                  | Y
                  |Y
                0 +--------------------------------------------------> 時間 (秒)
                   0   1   2   3   4   5   6   7   8   9  10  11  12

     最初の 5パケットは 1秒に 1パケットを超えるのに許可されていますが、
     その後、制限が働いていることが分かります。もし、少し途絶えていれ
     ば、ルールに設定された最大レートの範囲内で、またバーストが許されま
     す (バースト作動後は 1秒 1パケット)。

     owner
        このモジュールは、ローカルに生成されたパケットの作成者の各種の特
        質とマッチを試みます。これは OUTPUT チェインでのみ有効ですが、い
        くつかのパケット(例えば、ICMP ping の応答)には所有者がないので、
        それゆえ決してマッチしません。

        --uid-owner userid
           パケットを生成したプロセスの実行ユーザ id (数値)にマッチしま
           す。

        --uid-owner groupid
           パケットを生成したプロセスの実行グループ id (数値) にマッチし
           ます。

        --pid-owner processid
           パケットを生成したプロセスのプロセス id にマッチします。

        --sid-owner sessionid
           パケットを生成したプロセスのセッショングループにマッチしま
           す。

     unclean
        この実験的モジュールは `-m unclean または `--match unclean' を明
        示的に指定する必要があります。これはパケットについて手当たりしだ
        い様々の正当性をチェックします。このモジュールは検査されていない
        ので、セキュリティ装置として使うべきではありません (バグがよくあ
        るので、ことによると事態が悪化します)。オプションはありません。

  7.3.6.5.  状態のマッチ

  最も役に立つマッチ判定基準は `state' 拡張によって提供され、
  `ip_conntrack' モジュールのコネクション追跡の分析結果を簡単に利用でき
  るようにします。これは非常にお勧めです。

  `-m state' を指定すると追加して `--state' オプションが指定でき、そこに
  マッチすべき状態のリストをカンマで区切って指定します(`!' オプションは
  指定した状態にマッチしないことを示します)。状態には以下のものがありま
  す:

     NEW
        新しいコネクションを作るパケットです。

     ESTABLISHED
        既存のコネクションに属するパケットです (すなわち、応答パケット、
        あるいはコネクション確立中の応答のため出て行くパケット)。

     RELATED
        既存のコネクションの一部ではなくて関係するパケット、例えば、ICMP
        エラーとか、または(FTP モジュールが挿入済みなら)、ftp データコネ
        クションの確立パケットです。

     INVALID
        いくつかの理由から  これにはメモリ不足、どのコネクションにも対応
        するものがない ICMP エラー を含みますが、身元不明のパケットがあ
        ります。一般的にこれらのパケットは破棄すべきです。

  この強力なマッチ拡張の使用例は以下のようになります:

       # iptables -A FORWARD -i ppp0 -m state ! --state NEW -j DROP

  7.4.  ターゲットの仕様

  今や、私達はパケットに関してどんな検査ができるか知っています。次に必要
  なのは検査にマッチしたパケットに対して何をするか指示する方法です。これ
  はルールのターゲットと呼ばれています。

  とても単純な 2つの組み込み済みターゲット: DROP と ACCEPT があります。
  これらについては前に述べました。もし、ルールがパケットにマッチし、ター
  ゲットがこれら 2つのどちらか一方なら、パケットの運命が決定されて、これ
  以上ルールが調べられることはありません。

  組み込み済みターゲット以外に 2種類のターゲット: 拡張ターゲットとユーザ
  定義チェインがあります。

  7.4.1.  ユーザ定義チェイン

  ipchains から継承した iptables の強力な特徴の 1つは、3つの組み込み済み
  チェイン(INPUT, FORWARD そして OUTPUT)に加えて、ユーザが新しいチェイン
  を作ることができるということです。慣例で、ユーザ定義チェインは組み込み
  済みチェインと区別するために小文字にします(新しいユーザ定義チェインの
  作り方は、以下の``チェインの操作''で説明します)。
  パケットがルールにマッチし、そのターゲットがユーザ定義チェインであれ
  ば、パケットはそのユーザ定義チェインに移り、ルールの検査を始めます。そ
  のユーザ定義チェインでの検査が全て終ってもパケットの運命が決まらなけれ
  ば、現在のチェインに戻り、その次のルールから検査を再開します。

  ASCII アートの時間です。2つの(おばかさんな)チェイン: INPUT (組み込み済
  みチェイン)と test (ユーザ定義チェイン)で考えましょう。

                `INPUT'                          `test'

               ルール 1: -p ICMP -j DROP ルール 1: -s 192.168.1.1

               ルール 2: -p TCP -j test  ルール 2: -d 192.168.1.1

               ルール 3: -p UDP -j DROP

  192.168.1.1 から来て 1.2.3.4 へ向かう TCP パケットについて考えましょ
  う。パケットは INPUT チェインに入り、まず、ルール 1 が検査されます
  マッチしません。ルール 2 がマッチして、そのターゲットは test なので、
  次に検査されるルールは test の先頭です。test のルール 1 はマッチします
  が、ターゲットを指定していないので、次のルールであるルール 2 が検査さ
  れます。これはマッチしないので、チェインの終わりに達しました。先程検査
  したルール 2 のある INPUT チェインに戻り、それで今度はルール 3 が検査
  されますが、これもまたマッチしません。

  それで、パケットの経路は次のようになります:

                                       v    __________________________
                `INPUT'                |   /     `test'               v
               |/     |
               ルール 1              | /ルール 1            |
               |/-|
               ルール 2              /  ルール 2            |
               -v
               ルール 3              /\_______________________/
               |
                                       v

  ユーザ定義チェインは他のユーザ定義チェインへジャンプできます (しかし、
  ループしてはいけません。ループしていることが判るとパケットは破棄されま
  す)。

  7.4.2.  iptables への拡張  新しいターゲット

  拡張のもう 1つの種類はターゲットです。ターゲットの拡張はカーネルモ
  ジュールから成り、iptables へのオプションの拡張は新しいコマンドライン
  オプションによって提供されます。netfilter の配布物には始めから数々の拡
  張があります:

     LOG
        このモジュールはマッチしたパケットのカーネルロギングを提供しま
        す。以下の追加オプションを提供します:

        --log-level
           後にレベル番号か名前を続けます。有効な名前は(大文字小文字を問
           わず) `debug', `info', `notice', `warning', `err', `crit',
           `alert' および `emerg' で、それぞれ番号の 7 から 0 に該当しま
           す。これらのレベルの説明は syslog.conf の man ページを見てく
           ださい。初期値は `warning' です。

        --log-prefix
           後に最大 29文字までの文字列を続けます。このメッセージはログ
           メッセージの開始時に送られるので、それを識別できます。

        このモジュールは limit マッチの後で最も有効で、それはログがあふ
        れるのを防ぎます。

     REJECT
        このモジュールは `DROP' と同じ効果がありますが、送信者に ICMP の
        `ポート未到達' エラーメッセージを送り返すところが違います。注記
        として、以下の場合(RFC 1122 を見てください) ICMP エラーメッセー
        ジは送られません:

        o  フィルターしようとしているパケットが最初から ICMP エラーメッ
           セージであるか、または ICMP の種類が不明なものである。

        o  フィルターしようとしているパケットが先頭以外のフラグメントで
           ある。

        o  直前に、そのあて先にあまりに多くの ICMP エラーメッセージを
           送った (/proc/sys/net/ipv4/icmp_ratelimit を見てください)。

        REJECT はまた、使われる応答パケットを変更するのに `--reject-
        with' オプション引数をとります: マニュアルページを見てください。

  7.4.3.  特別な組み込み済みターゲット

  2つの特別な組み込み済みターゲット: RETURN と QUEUE があります。

  RETURN はチェインの末尾まで落っこちるのと同じ効果があります 組み込み済
  みチェイン内のルールの場合は、そのチェインのポリシーが実行されます。
  ユーザ定義チェイン内のルールの場合は、そのチェインを呼び出したチェイン
  に戻り、呼び出し元のルールの直後から検査が続行されます。

  QUEUE はパケットをユーザ空間で処理するためにキューに入れるという特別な
  ターゲットです。これを有効にするには、さらに 2つの構成物が必要です:

  o  キューハンドラーはパケットをカーネルからユーザ空間に渡す実際の機構
     を扱います。そして、

  o  ユーザ空間アプリケーションはパケットを受け取り、場合によっては操作
     し、そしてパケットに判定を下します。

     IPv4 iptables の標準キューハンドラーは ip_queue モジュールで、カー
     ネルと一緒に配布され、開発中(experimental)としてマークされていま
     す。

  ユーザ空間で処理するためにキューへパケットを入れる iptables の使い方の
  簡単な例を以下に示します:

       # modprobe iptable_filter
       # modprobe ip_queue
       # iptables -A OUTPUT -p icmp -j QUEUE

  このルールでは、ローカルに生成された外に出て行く ICMP パケット(例え
  ば、 ping で生成された)は ip_queue モジュールに渡されます。それか
  ら、ip_queue はパケットをユーザ空間のアプリケーションに届けようとしま
  す。もし、待機しているユーザ空間アプリケーションが無ければ、パケットは
  破棄されます。

  ユーザ空間アプリケーションを書くためには、libipq API を使います。これ
  は iptables と一緒に配布されています。実例のコードは CVS 中の
  testsuite ツール(例えば、redirect.c)の中で見つけられます。

  ip_queue の状態は以下でチェックできます:

       /proc/net/ip_queue

  キューの最大長(すなわち、ユーザ空間に届けられていて、まだ判定がなされ
  ていないパケットの数)は以下でコントロールできます:

       /proc/sys/net/ipv4/ip_queue_maxlen

  キューの最大長の初期値は 1024 です。一旦この限界値に達したら、キューの
  長さが限界値より低くなるまで新しいパケットは破棄されます。TCP のような
  すばらしいプロトコルは、混雑で落ちこぼれたパケットを検出して、キューが
  一杯になったとき、再送を試みます。とはいえ、与えられた状況下で初期値は
  小さ過ぎるかもしれないので、理想的な最大キュー長を決定するのにいくらか
  実験するとよいでしょう。

  7.5.  チェインの操作

  iptables のとても有効な特徴は、チェイン中の関連するルールをグループ化
  できることです。お望みのチェインは何でも呼び出せますが、組み込み済み
  チェインやターゲットと混同を避けるため小文字を使うことをお勧めします。
  チェインの名前は最大 31文字まで使えます。

  7.5.1.  新しいチェインを作る

  新しいチェインを作りましょう。私はとっても創造力に富んだ野郎なので、そ
  れを test と名付けます。`-N' または `--new-chain' オプションを使いま
  す:

  # iptables -N test
  #

  これは簡単です。今や、あなたはこれまで詳細に述べてきたように、これに
  ルールを入れることができます。

  7.5.2.  チェインを削除する

  チェインを削除するのも同様に簡単で、`-X' または `--delete-chain' オプ
  ションを使います。なぜ `-X' かって?  うーん、よい文字が全て取られてた
  んです。

       # iptables -X test
       #

  チェインを削除するには 2つの制限があります  そのチェインは空である必要
  があり(下記の``チェインを空にする''を見てください)、しかも、決してどの
  ルールのターゲットにもなっていないことです。組み込み済みの 3つのチェイ
  ンはどれも削除できません。

  もし、チェイン名を指定しなければ、全てのユーザ定義チェインが可能な限り
  削除されます。

  7.5.3.  チェインを空にする

  チェインから全てのルールを取り去り空にするのは簡単で、`-F' (または
  `--flush') コマンドを使います。

       # iptables -F FORWARD
       #

  もし、チェイン名を指定しなければ、全てのチェインを空にします。

  7.5.4.  チェインの内容をリストアップする

  チェイン中の全てのルールをリストアップするには、`-L' (または `--list')
  コマンドを使います。

  各々のユーザ定義チェインに表示される `refcnt' は、それをターゲットに指
  定しているルールの数です。この数が 0 でないと(かつチェインが空であるこ
  と)、そのチェインを削除することはできません。

  もし、チェイン名を指定しなければ、空のも含めて全てのチェインについてリ
  ストアップされます。
  `-L' には 3つのオプションがあります。 (たいていの人々は DNS を使ってい
  ますが) DNS が適切に設定されていない場合や DNS の要求をフィルターアウ
  トしている場合は、 iptables が IP アドレスを調べようとするときに長く待
  たされます。それを防ぐのに `-n' (数値)オプションはとても有効です。この
  オプションはまた、TCP や UDP ポートを名前ではなく番号で表示します。

  `-v' オプションはルールの詳細を全て、例えば、パケットやバイトのカウン
  ター、TOS マスク、そしてインターフェイス、を表示します。このオプション
  を指定しなければ、これらの値は省略されます。

  注記として、パケットとバイトのカウンターは、1000, 1,000,000 および
  1,000,000,000 を、それぞれ `K', `M' および `G' の接尾辞を使って表示し
  ます。`-x' (拡張数値)オプションを使うと、値の大きさにかかわらず完全な
  数値を同様に表示します。

  7.5.5.  カウンターをリセット(ゼロに)する

  カウンターをリセットできると便利です。これは `-Z' (または `--zero') オ
  プションでできます。

  以下について考えてみましょう:

       # iptables -L FORWARD
       # iptables -Z FORWARD
       #

  上記の方法では、`-L' から `-Z' コマンドまでの間にいくつかのパケットが
  通過するかもしれません。そのため、カウンターを読むと同時にリセットする
  には、`-L' と `-Z' を同時に使います。

  7.5.6.  ポリシーを設定する

  以前にパケットがどのようにチェインを通り抜けるのか論じたとき、パケット
  が組み込み済みチェインの終わりに達したとき何が起きるのか大体述べまし
  た。この場合、チェインのポリシーがそのパケットの運命を決定します。組み
  込み済みチェイン(INPUT, OUTPUT および FORWARD)だけがポリシーを持ってい
  ます。なぜなら、パケットがユーザ定義チェインの終わりまで下り落ちると、
  前のチェインに戻って行くからです。

  ポリシーは ACCEPT か DROP のどちらかです。例えば:

       # iptables -P FORWARD DROP
       #

  8.  ipchains と ipfwadm を使う

  netfilter の配布物の中に、ipchains.o と ipfwadm.o という名前のモジュー
  ルがあります。カーネルに、このうちの一方を挿入してください (注記: これ
  らは、ip_tables.o と同時に使えません!)。そうすれば、古き良き時代のよう
  に ipchains または ipfwadm が使えます。

  これらは、いつまでもサポートされるわけではありません。私が考える合理的
  な公式は、代わりの安定版が利用できるようになった日から 2 *[交代通告 -
  安定版初リリース]の間です。これは、たぶん、Linux 2.6 か 2.8 でサポー
  トが打ち切られることを意味します。

  9.  NAT とパケットフィルタリングの混合

  ネットワークアドレス変換(NAT HOWTO を見てください(訳注: 日本語訳があり
  ます))とパケットフィルタリングを同時にやりたいときがよくあります。よい
  お知らせです  2つは実によく調和します。

  あなたは NAT のことは完全に忘れて、パケットフィルタリングの設計をして
  ください。パケットフィルターにとってのソースとあて先は実際のソースとあ
  て先です。例えば、IP アドレス 1.2.3.4 ポート番号 80 に接続してくるもの
  は何でも IP アドレス 10.1.1.1 ポート番号 8080 へ転送する DNAT(訳注: あ
  て先 NAT、一般的な NAT のこと)をするなら、パケットフィルターに
  は、1.2.3.4 の 80 ではなくて、10.1.1.1 の 8080 (実際のあて先)へ、パ
  ケットが行くように見えます。同様に、IP マスカレードのことも忘れること
  ができます  パケットが実際の内部 IP アドレス(例えば 10.1.1.1)から来
  て、応答パケットもそこへ戻って行くように見えます。

  NAT には、とにかくコネクション追跡が必要なので、パケットフィルターに余
  分な仕事をさせずに `state' マッチを使うことができます。NAT HOWTO の簡
  単なマスカレードの例を増強して ppp0 インターフェイスから入って来るどん
  な新しいコネクションも禁止するためには、このようにします:

       # ppp0 から出て行くものをマスカレードする
       iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

       # ppp0 から入って来るパケットで新規と無効のものを入力とフォワードで禁止する
       iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP
       iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP

       # IP フォワーディングを ON にする
       echo 1 > /proc/sys/net/ipv4/ip_forward

  10.  iptables と ipchains の違い

  o  まず初めに、組み込み済みチェインの名前を小文字から大文字に変更しま
     した。その理由は、INPUT と OUTPUT チェインが扱うのは、今では各々、
     行き先がローカルのパケットとローカルで生成されたパケット、だけに
     なったからです。この 2つのチェインは、全ての入力および全ての出力パ
     ケットをそれぞれ見るために使われます。

  o  `-i' オプションは今では入力インターフェイスを意味し、しかも INPUT
     と FORWARD チェインでのみ有効です。FORWARD か OUTPUT チェインで
     `-i' を使用しているルールは `-o' に変更してください。

  o  TCP および UDP のポートは今では、--source-port または --sport (また
     は --destination-port/--dport) というスペルでオプションを書く必要が
     あり、TCP または UDP の拡張をそれぞれロードするために、`-p tcp' ま
     たは `-p udp' オプションの後に置く必要があります。
  o  TCP の -y オプションは今では --syn になり、`-p tcp' の後に置く必要
     があります。

  o  DENY ターゲットは、結局のところ今では DROP になりました。

  o  一度にチェインの内容のリストアップとリセットができるようになりまし
     た。

  o  組み込み済みチェインをリセットするとポリシーカウンター(訳注: ポリ
     シーが適用されたパケットの個数とバイト数)もクリアーされます。

  o  チェインの内容のリストアップは、その瞬間のカウンターを表示します。

  o  REJECT と LOG は今では拡張ターゲットになり、個々にカーネルモジュー
     ルになりました。

  o  チェイン名は 31文字まで使えるようになりました。

  o  MASQ は今では MASQUERADE で、違う書式になりました。REDIRECT は名前
     は変わりませんが、これもまた書式が変わりました。両方とも、設定方法
     についてのより多くの情報が必要なら、NAT HOWTO を見てください。

  o  -o オプションはもはや、ユーザ空間デバイスにパケットを向ける目的に使
     われていません(上記の -i を見てください)。今では、パケットは QUEUE
     ターゲットによりユーザ空間に送られます。

  o  おそらく、この他に私が忘れていることがたくさんあるでしょう。

  11.  パケットフィルター設定のアドバイス

  コンピュータのセキュリティ分野での常識は、全てをブロックし、その後に必
  要とする穴を空けることです。これは通常「明白でなきもの許すべからず」
  と、慣用句で言われます。セキュリティがあなたの最大の関心事なら、このア
  プローチをお勧めします。

  必要でないサービスは動かしてはいけません  たとえ、あなたがそれらへのア
  クセスをブロックしているから大丈夫と思っていても。

  あなたがファイアーウォール専用機を作っているなら、何も動かさず、全ての
  パケットをブロックするところから始めてください。それからサービスを追加
  し必要なパケットを通過させるようにしてください。

  次のものを組み合わせてセキュリティをより深めることをお勧めします: TCP
  Wrappers (パケットフィルター自身への接続に対して)、プロキシー(パケット
  フィルターを通り抜ける接続に対して) (訳注: このパケットフィルターとは
  広義に Linux ボックスと解釈するほうがよいでしょう)、ルート(経路)検証、
  そして、パケットフィルタリング。ルート検証とは予期しないインターフェイ
  スから来るパケットを破棄することです(訳注: カーネルコンフィギュレー
  ションの CONFIG_IP_ADVANCED_ROUTER 参照)。例えば、内部ネットワークアド
  レスが 10.1.1.0/24 であるとして、外部インターフェイスから入って来るパ
  ケットでソースアドレスが内部ネットワークアドレスになっていれば、それは
  破棄されます。これをあるインターフェイス(ppp0)で有効にするためには以下
  のようにします:

       # echo 1 > /proc/sys/net/ipv4/conf/ppp0/rp_filter
       #

  あるいは、全ての存在するそして将来のインターフェイスのためには、このよ
  うにします:

       # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
       #     echo 1 > $f
       # done
       #

  Debian では、可能ならデフォルトで上記のように設定します。もし、あなた
  が非対称ルーティングを行っているなら(すなわち、変わった方向からパケッ
  トが来るのを期待している)、それらのインターフェイスではこのフィルタリ
  ングを無効にしたいでしょう。

  ファイアーウォールの作成時ばかりではなく、どこか動かないところがあって
  ファイアーウォールの設定を調整しているとき、ログを取ることは役に立ちま
  す。どこかのログがあふれるのを防ぐために、必ず `limit' マッチと組み合
  わせましょう。

  安全性が求められるシステムではコネクション追跡が非常にお勧めです。それ
  は若干のオーバーヘッドがありますが、全ての接続が追跡されるので、あなた
  のネットワークへのアクセス制御にとても有効です。もし、カーネルがモ
  ジュールを自動的にロードしない場合や、それをカーネルに直に組み込んでい
  ない場合、`ip_conntrack.o' モジュールをロードする必要があるかもしれま
  せん。あなたが実際に複雑なプロトコルを追跡したいなら、しかるべきヘル
  パーモジュール(例えば `ip_conntrack_ftp.o')をロードする必要がありま
  す。

       # iptables -N no-conns-from-ppp0
       # iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
       # iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT
       # iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix "Bad packet from ppp0:"
       # iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix "Bad packet not from ppp0:"
       # iptables -A no-conns-from-ppp0 -j DROP

       # iptables -A INPUT -j no-conns-from-ppp0
       # iptables -A FORWARD -j no-conns-from-ppp0

  よいファイアーウォールを構築することは、この HOWTO の範囲を越えていま
  すが、私からの助言は「いつも最小限主義者であれ」です。あなたの箱をテス
  トし抜け穴がないか探るためのより多くの情報が必要なら、 Security HOWTO
  を見てください。

  12.  日本語訳について

  この文書の原文および関連の HOWTO は、Netfilter Project の``公式ウェブ
  サイト''にあります。
  具体的な原文の場所の 1つは、  です。
  また、これらの文書は CVS で管理されており、最新版や更新履歴を
   以下から参照で
  きます。

  この文書を翻訳するにあたり、以下の方々からアドバイスをいただきました。
  本当にありがとうございました。

  o  千旦裕司さん 

  o  山崎@Ox さん 

  o  四亭さん 

  o  Konkiti さん 

  o  加藤大典さん 

  o  武井伸光さん 

  日本語訳 初版: 2000年 9月 20日 山森 浩幸 
     第 2 版: 2001年 8月 13日
     第 3 版: 2001年 8月 16日
     第 4 版: 2002年 1月 20日

一覧に戻る
グリーンネット・トップページへ戻る

http://www.green.ne.jp/