各バージョンのMessengerはそれぞれ異なるヘッダを含むネットワークパケットを送信するため、例えばSquidの場合であれば正規表現を使ってURLを基準にアクセス制御を行ない、Linuxマシンを経由するパケットの中にgateway.dllやapplication/x-msn-messengerなどのMSN Messengerの接続と思われるような文字列が含まれていないかどうかを調べて、その種のパケットをブロックするようにSquidに指示する必要がある。
iptablesでは3つのテーブルを使用してファイアウォールを通過するパケットの処理を行なう。3つのテーブルというのはすなわち、パケットを改変するmangle、2つのネットワーク間(LANとインターネットの間など)のアドレス変換を行なうnat、そしてパケットのフィルタリングを行なうfilterだ。各テーブルには、パケットに対してファイアウォールの通過を許可/ブロック/ログ/リダイレクトするためのルールを記述することができるチェーンがある。Oskar Andreasson氏がiptablesチュートリアル1.2.2の中で、ファイアウォールを通過するパケットを最初に処理するのはmangleテーブルの中のPREROUTINGチェーンだと述べているので、ここでパケットのブロックを行なうと良いだろう。
MSN Messengerはサーバの1863ポートに接続する(その他のポートについてはインターネットサービス用のポートを参照のこと)。これを踏まえてiptablesファイアウォールの設定に少しルールを追加すれば良い。
まずファイルを作成して、ブロックしたいIPアドレスを記述する。具体的には一行に一つのアドレスを記述して、コメント行には行頭にシャープ(#)を付ける(IPアドレスだけを羅列してコメントや空行はなくても良いが、それでは分かりにくくなってしまうだろう)。
# MSN MessengerをブロックするIPアドレス # ******************************** # 営業部 第2オフィス 192.168.100.10 # 経理部(全体) 192.168.100.23 192.168.100.24 192.168.100.25 # 製造部A棟 192.168.100.50
このファイルには好きな名前を付けて良い。ここではip_msnとした。次に以下のようなコマンドを実行する。このコマンドはコメントと空行を削除して、iptablesのルールに追加するアドレスを列挙した一時ファイルを作成する。
grep -v "#" /your/path/ip_msn | sed -e '/^$/d' > /tmp/temp
ここで、「grep -v」は#で開始していない行を出力する。sedは空行を削除して出力結果を一時ファイル「/tmp/temp」にリダイレクトしている。
次に短いスクリプトを作成する(なお上記のコマンドもこのスクリプトに含めておくと良いだろう)。このスクリプトは上記の一時ファイルのアドレスをすべて読み取って、iptablesのルールを追加する。
grep -v "#" /your/path/ip_msn | sed -e '/^$/d' > /tmp/temp while read IP ; do /sbin/iptables -t mangle -A PREROUTING -s $IP -p tcp --dport 1863 -j REJECT done < /tmp/temp
iptablesの-tオプションでmangleテーブルを、-AオプションでPREROUTINGチェーンを指定している。また-sオプションで送信元のIPアドレス、-pオプションでTCPパケット、--dportオプションで送信先ポート番号の1863を指定している。 ネットワークパケットがこれらすべての基準を満たす場合には、-jオプションによってパケットはブロックされることになる。これらの行をiptablesの設定ファイルの適切な場所に追加すれば良い。なおルールは上から下へ順に読まれるため、mangleテーブル用のこれらのルールをどの位置に記述するかは重要だ。例えば これらのルールの直前にすべてのパケットを許可するというルールがある場合には、ここで新しく追加した部分のコードはマッチするかどうかも試されない。
