次のページ 前のページ 目次へ

2. パケットフィルタリングの基礎

2.1 パケットフィルタとは何をするもの?

ネットワークを通る全てのトラフィックは、パケットの形で送り出されます。 例えば、このパッケージ(50Kバイトはあるでしょう)をダウンロードすることで、1460バイトのパケット36個ほどを受信することになるでしょう(実際にはそのときどきによって個数やサイズは異なります)。

(訳注: 現在ではこの文書は100KBを越えています:))

各パケットはそれがどこに向けられたものかを記述する部分から始まり、どこから来たものか、それからパケットの種類と管理上必要な詳細内容を含んでいます。 パケットのこの開始部分は、ヘッダと呼ばれています。また、伝送されている実際のデータを含んだパケットの残りの部分は、通常ボディと呼ばれています。

ウェブ・トラフィック、メールとリモートログインのために使われるいくつかのプロトコル(例えば TCP)は `接続(コネクション)'とよばれる概念を使います。 実際のデータパケットが送り出される前に、`私は、接続したい'、`OK'、そして`ありがとう'といった、(特別なヘッダを伴う)色々なセットアップ・パケットを交換します。

パケット・フィルタは、パケットのヘッダを見て、そのパケット全体をどのように取り扱うかを決定する小さなソフトウェアです。パケットは拒否(deny)(すなわち、受信しなかったかのように、パケットを捨てる)ことに決められるかもしれないし、許可(accept)(すなわち、パケットを通過させる)することになるかもしれないし、パケットを返却(reject)("拒否"と似ているけれど、パケットの発信元にそのことを通知する)するかもしれません。

Linux においては、パケット・フィルタリングはカーネルに組み込まれています。 そして、パケットの取扱いに関して少しばかりトリックを仕掛けることができますが、その基本的な規則はあくまでヘッダを見て、パケットの取り扱いを決定するというものです。

2.2 なぜ?

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

コントロール:

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

セキュリティ:

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

(訳注: "死のping" 異常に長大な ICMP パケットなどをネットワーク接続されたコンピュータに送りつけて、システムクラッシュやサービスの停止を引き起こす攻撃のこと。)

監視:

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

2.3 どうやって?

パケットフィルタリング機能を有効にしたカーネル

新しい IP ファイアウォール・チェーン機能を持つカーネルが必要です。今動作しているカーネルが、この機能を組み込んだものかどうか判断するには、 /proc/net/ip_fwchains を探してみましょう。 これが存在するならば、既に組み込まれています。

(訳注: 2.2.x以降のカーネルをお使いの場合は、大抵既に組み込まれていることでしょう。)

もしそうでなければ、あなたは IP ファイアウォール・チェーンを持つカーネルを作る必要があります。 最初に、あなたが欲しいカーネルのソースをダウンロードしましょう。あなたのカーネルが バージョン 2.1.102 以降のものなら、現在主流のカーネルであるので、改めてパッチを当てる必要はありません。 そうでない時には前出の Web ページからパッチを入手して適用し、そして次に示すような設定でカーネルを構成して下さい。もし、あなたがこれをする方法を知らなくても、慌てないで Kernel-HOWTO を読みましょう。

(訳注: Kernel-HOWTOの邦訳は http://www.linux.or.jp/JF/JFdocs/Kernel-HOWTO.html にあります。)

あなたが2.0-シリーズのカーネルに設定する必要があるコンフィグレーションオプションは、以下の通りです:


        CONFIG_EXPERIMENTAL=y
        CONFIG_FIREWALL=y
        CONFIG_IP_FIREWALL=y
        CONFIG_IP_FIREWALL_CHAINS=y

2.1 か 2.2 のシリーズ・カーネルの場合は次の通りです:


        CONFIG_FIREWALL=y
        CONFIG_IP_FIREWALL=y

ツールである ipchains プログラムは、カーネルに対してどんなパケットをフィルタするべきかについて通知するためのものです。あなたがプログラマであるか、奇特な人間でない限り、これがパケットフィルタリングを制御する方法となります。

ipchains

ipchains ツールは、カーネルのパケット・フィルタリングに関するセクションからルールを挿入したり削除したりします。 これは、あなたがたとえ何を設定しても、それが再起動によって消えてしまうことを意味しています。 次回、 Linux がブートされる際に、それらを確実に戻すする方法については、次の節 フィルタ規則を恒久的にするには を参照して下さい。

ipchains は以前までIPファイアウォールを実現するために使われていた ipfwadm と置き換えられることになります。 役に立つスクリプトのセットが、次の ipchains のアドレスから入手可能です:

http://netfilter.filewatcher.org/ipchains/ipchains-scripts-1.1.2.tar.gz

これには以前行われていたのと同じようなスタイルでパケット・フィルタリングを行わせるための ipfwadm-wrapper と呼ばれているシェルスクリプトを含んでいます。 あなたが ipfwadm (ipchainsと比べ、より遅くて、引数、その他をチェックしない等のもの)を使うシステムをアップグレードする手っ取り早い方法が欲しくない限り、あなたは多分このスクリプトを使うべきではないでしょう。 そういう方にはあまりこの HOWTO も必要とはされないことと思います。

ipfwadm 関連の詳細については、付録: ipchains と ipfwadm との違い や付録: `ipfwadm-wrapper'スクリプトを使う をご覧下さい。

フィルタ規則を恒久的にするには

あなたの現在のファイアウォール設定は、カーネルに格納されて、このように再起動時には失われてしまいます。 あなたのルールを恒久的にするために `ipchains-save' と `ipchains-restore' スクリプトを使うことをお勧めします。 これを使うには、まずあなたのルールを設定して、次のようにコマンドを実行します(root として実行して下さい):

# ipchains-save > /etc/ipchains.rules
#

スクリプトは次のように作っておきます:

#! /bin/sh
# パケットフィルタ制御のためのスクリプト

# ルールがなければ何もしない
[ -f /etc/ipchains.rules ] || exit 0

case "$1" in
    start)
        echo -n "Turning on packet filtering:"
        /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "."
        ;;
    stop)
        echo -n "Turning off packet filtering:"
        echo 0 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -F
        /sbin/ipchains -X
        /sbin/ipchains -P input ACCEPT
        /sbin/ipchains -P output ACCEPT
        /sbin/ipchains -P forward ACCEPT
        echo "."
        ;;
    *)
        echo "Usage: /etc/init.d/packetfilter {start|stop}"
        exit 1
        ;;
esac

exit 0

これが起動時の最初のうちに実行されるようにします。筆者のケース (Debian 2.1) では、 `S39packetfilter' というシンボリックリンクを `/etc/rcS.d' ディレクトリに作ってあります(これは、 S40network の前に実行されます)。

(訳注: 「最初のうち」というのは、起動時、ネットワークに対して通信が可能となる状態以前に行うという意味です。 ネットワークの他のサービスなどが起動したあとにファイアウオールを設定すると、全く設定されていないわずかな瞬間をついて"悪いやつ"が入り込む危険性があります。)


次のページ 前のページ 目次へ