パケットフィルタリング

パケットフィルタリングとは、IPヘッダに書き込まれている送信元アドレス・送信元ポート番号・送信先アドレス・送信先ポート番号・ACKビット(TCPの場合)といった情報をもとに、ユーザーが指定したルールに従ってパケットを制御(通過/遮断)する仕組みです。(ACKビット:最初に送信する TCPパケットはACKビットが0であり、コネクションの確立が承認されるとACKビットが1になります。ルーターの established という機能が利用します。)Linux で利用されている ipchains コマンドをもとに説明します。

1. 方針

パケットフィルタリングをする前に、どういった方針でフィルタリングを行うか決定する必要があります。

などなど、実際にどんなサービスを提供するのか、どんなサービスを利用するのかなどを明確にして、フィルタリングに関するポリシーを決定しなくてはなりません。

よく利用するサービスのポートと注意しなければいけないポートの一覧(must ではありません)

  サービス プロトコル ポート
提供する DNS domain 53/UDP (セカンダリを利用する場合 TCP も必要)
メール smtp 25/TCP, 113/TCP(認証)
WWW http 80/TCP
メール pop3 110/TCP
セキュアシェル ssh 22/TCP
ネットニュース nntp 119/TCP
注意が必要 ネットワーク・タイムサーバー ntp 123
ファイル転送 ftp 21/TCP, 20
フィルタリングする ネットワークターミナル telnet 23/TCP
NetBIOS netbios-ns, -dgm, -ssn 137, 138, 139
Windows 2000 ファイル共有/認証 microsoft-ds 445
Apple Talk appletalk 201, 202, 203, 204, 205, 206, 207, 208

2. 仕組み

Linux カーネルは、ルーター機能でパケットを中継する際に、設定条件に従ってパケットを破棄したり通過させたりすることが出来ます。まず、入力パケットのフォーマットや長さ(チェックサム)などが適性かどうか検査し、input chain に設定されている条件を調べます。ここで、設定条件に該当すればパケットは破棄されます。破棄されなかったパケットは、次にあて先の IP Address からルーター機能(ルーティングテーブル)によって転送すべきネットワークインターフェースが決められます。外部宛のパケットは forward chain の条件と照合して遮断するか否か判定されます。IP マスカレード処理対象のパケットは、ルーター機能ではなくアドレス変換機能で処理されます。そして、最後にoutput chain に設定された条件によって再び破棄するか否か判定されます。以上のステップを踏み、破棄されなかったパケットが中継されます。

Packet Filter

3. 基本設定

Linux では、パケットフィルタリング機能は ipchains コマンドで設定できます。このコマンドは、以下のような形式でフィルター条件を設定できます。(代表的なものだけをあげます)

    # /sbin/ipchains -A <chainの指定> <条件> <動作オプション>
基本オプション

-A:指定した chain に条件を登録 (Add)
-D:条件を削除 (Delete)
-I:条件を挿入 (Insert)
-L:登録されている条件を表示 (List)
-P:chain のポリシ(デフォルト動作)を設定 (Policy)
-F:条件全てを消去 (Flash)

chain の指定 input, forward, output のいずれか。自分で chain を定義することもできる。
条件 -s <address>/<mask> <port>:<port>
発信元の条件設定。<port>:<port> で、ポート番号の範囲を指定可能。単一の場合は <port>

-d <address>/<mask> <port>:<port>
宛て先の条件設定。

-p <protcol>
プロトコルの条件設定。tcp, udp, icmp, all のいずれかか /etc/protocols ファイルの登録されたプロトコル。

-i <interface>
インターフェースの条件設定。ifconfig コマンドで表示されるインターフェース名を指定。

-y
TCP 接続を表す SYN フラグがセットされているパケットを対象とする。

-b
-s, -d のいずれか一方が設定されている条件に対して、発信元と宛て先を入れ替え -s, -d 両方が設定されている状態にする。送受信両方のパケットを対象にする。
動作オプション -j DENY
パケットを破棄する。

-j ACCEPT
パケットを通過させる。

-j MASQ
パケットを IP マスカレードの処理の対象とする。応答パケットも自動的にIP マスカレードの処理対象となる。

-j REDIRECT
宛て先の IP Address にかかわらず、パケットを中継するマシン宛にパケットを送る。

4. 設定例

3.1. 特定のアプリケーションのパケットだけを通す

アプリケーションによって使用するポート番号が異なるので、特定のポート番号だけ通過するように設定することで、そのアプリケーションだけがネットワークにアクセスできるようになります。(FTP のように、クライアントが利用するポート番号が1024 以降を利用するものは注意が必要。PASVモードの場合は別)

    # /sbin/ipchains -P input DENY
    # /sbin/ipchains -A input -p tcp -s 0.0.0.0/0 80 -j ACCEPT
    # /sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j ACCEPT
    # /sbin/ipchains -A input -p tcp -b -d 0.0.0.0/0 smtp -j ACCEPT

はじめの行で、全てのパケットを通過させないように設定し、次に、http(80)の発信元の条件、宛て先の条件共に通過させるように設定、最後に smtp(25)の通過を双方の条件共に通過させるように設定しています。

3.2. インターネットから社内ネットワークへの接続を禁止

社内ネットワークに 192.168.0.0/255.255.255.0 が割り当てられているものとして想定し、そこへの接続を禁止する。これは -y オプションを利用して、TCPの接続動作の制御パケットを遮断することで実現できます。

    # /sbin/ipchains -A input -p tcp -d 192.168.0.0/255.255.255.0 -y -j DENY

3.3. アプリケーションと接続の方向性を組み合わせた例

社内からインターネット上の Web サーバーにアクセスするのを許可し、インターネットから社内の Web サーバーにアクセスするのは禁止する。

    # /sbin/ipchains -P input DENY
    # /sbin/ipchains -A input -p tcp -d 192.168.0.0/255.255.255.0 80 -y -j DENY
    # /sbin/ipchains -A input -p tcp -s 192.168.0.0/255.255.255.0 80 -y -j ACCEPT
    # /sbin/ipchains -A input -p tcp -b -d 0.0.0.0/0 80 -j ACCEPT

1行目で、全てのパケットを通過させないように設定する。2行目で、インターネットから社内ネットワークの Web サーバーに接続する時の制御パケットを遮断する。3行目で、社内からインターネット上の Web サーバーに接続する時の制御パケットを通過させる。実際には、4行目で社内からインターネット上の Web サーバーに接続する時の制御パケットを通過するので3行目は必要無い(条件を順序だてて説明するために書いてあります)。