iptablesを使って特定のネットワークアプリケーションをブロックする

 多くの企業や組織が、社員などによるMSN Messengerなどのチャットプログラムの濫用という生産性に関わる問題に直面している。そのためチャットプログラムを濫用するユーザや単にそのようなプログラムが必要ではないユーザに関してはその種のトラフィックをブロックするようにとの指令を受けるIT部門もある。プロキシサーバでMSN Messengerなどのアプリケーションをブロックすることも可能だが、MSN Messengerは数多くのバージョンが使用されているためプロキシサーバでブロックするのは困難であり、すり抜けてしまうクライアントも一部にあるかもしれない。そこでiptablesを使用すればMSN Messengerのトラフィックをより簡単にブロックすることができる。

 各バージョンの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テーブル用のこれらのルールをどの位置に記述するかは重要だ。例えば これらのルールの直前にすべてのパケットを許可するというルールがある場合には、ここで新しく追加した部分のコードはマッチするかどうかも試されない。

 ネットワークアプリケーションは他にも数多く存在するので、同じ一つのファイルの中で様々なポート番号やIPアドレスを扱うようにスクリプトを改良することもできる。設定ファイル(ファイル名はip_ports_blockedとする)は以下のようなものにすることができる。

# 様々なアプリケーションに関してブロックするIPアドレス
# ********************************

# MSN messenger
# 営業部 第2オフィス
192.168.100.10:1863
# 経理部(全体)
192.168.100.23:1863
192.168.100.24:1863
192.168.100.25:1863
# 製造部A棟
192.168.100.50:1863

# mysql
# 営業部 第2、第6オフィス
192.168.100.10:3306
192.168.100.11:3306

 以下に、ip_ports_blockedを処理するように変更したスクリプトを示す。

grep -v "#" /your/path/ip_ports_blocked | sed -e '/^$/d' > /tmp/temp

while read row ; do
    IP=`echo $row | cut -d":" -f1`
    PORT=`echo $row | cut -d":" -f2`
    /sbin/iptables -t mangle -A PREROUTING -s $IP -p tcp --dport $PORT -j DROP
done < /tmp/temp

 ITマネージャはこのテクニックを使うことで、社員が不必要なネットワープアプリケーションで時間を浪費しないようにすることができる。プロキシを使用しなくても、MSN Messengerなどのアプリケーションを一つだけブロックするスクリプトや複数のアプリケーションをブロックするスクリプトを必要に応じて使用すれば良いだろう。

Sergio Gonzalez DuranはLinux管理者、システム開発者、ネットワークセキュリティカウンセラー。Linux教育コースも担当し、スペイン語のLinux/オープンソースウェブサイトlinuxtotal.com.mxを運営している。

Linux.com 原文