パケットフィルタリング
パケットフィルタリングとは、IPヘッダに書き込まれている送信元アドレス・送信元ポート番号・送信先アドレス・送信先ポート番号・ACKビット(TCPの場合)といった情報をもとに、ユーザーが指定したルールに従ってパケットを制御(通過/遮断)する仕組みです。(ACKビット:最初に送信する TCPパケットはACKビットが0であり、コネクションの確立が承認されるとACKビットが1になります。ルーターの established という機能が利用します。)Linux で利用されている ipchains コマンドをもとに説明します。
1. 方針
パケットフィルタリングをする前に、どういった方針でフィルタリングを行うか決定する必要があります。
Well-known ポートの扱い方
特定ポートの扱い方
特定 IP アドレスの扱い方
外部(インターネット)から内部サーバ(公開サーバーなど)へのアクセス
内部(社内)から外部(インターネット)へのアクセス
公開するサービス
などなど、実際にどんなサービスを提供するのか、どんなサービスを利用するのかなどを明確にして、フィルタリングに関するポリシーを決定しなくてはなりません。
よく利用するサービスのポートと注意しなければいけないポートの一覧(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 に設定された条件によって再び破棄するか否か判定されます。以上のステップを踏み、破棄されなかったパケットが中継されます。
3. 基本設定
Linux では、パケットフィルタリング機能は ipchains コマンドで設定できます。このコマンドは、以下のような形式でフィルター条件を設定できます。(代表的なものだけをあげます)
# /sbin/ipchains -A <chainの指定> <条件> <動作オプション>
基本オプション |
|
chain の指定 | input, forward, output のいずれか。自分で chain を定義することもできる。 |
条件 | -s <address>/<mask> <port>:<port>
-d <address>/<mask> <port>:<port>
-p <protcol>
-i <interface>
-y
-b
|
動作オプション | -j DENY
-j ACCEPT
-j MASQ
-j REDIRECT
|
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行目は必要無い(条件を順序だてて説明するために書いてあります)。