IP Sniffer に対抗する
                     -- ファイウォール構築入門 --


                                黒揚羽




あ る掲示板 1 で IP Sniffer についてホットな話題を見かけました。そこで
IP Sniffer について、正統的な技術で対抗する方法を書こうと思って筆を 取
りました。 IP アドレスを暴かれて困っている人の一助となれば幸いです。

さ て、 IP Sniffer というのは、俗に言う『IP 抜き』のことです。英語の辞
典をひいて見ると、 Sniff というのは犬などがくんくんと臭いをかぎまわ る
様を表す言葉として説明されています。

特定の URL にアクセスするといきなり telnet などが起動してその瞬間に IP
アドレスを記録されてしまいます。これが典型的な IP Sniffer です。プライ
バシーの観点からもそうですが、このいきなりだましうちにして人の IP アド
レスを記録すると言う行為には不快なものしか感じません。

そこでこのコラムではそれを阻止する方法の一つを紹介したいと思います。現
在知られている IP Sniffer に対処する方法は他にもありますが、このコラム
で扱っている方法はいわゆるファイアウォール構築の基礎なので、ある意味正
統的な方法でもあります。ダイアルアップルータなどを購入された方にとって
もある程度参考になるものだと言えますし、また、FreeBSD や Linux など で
iij-ppp を使ってネットワークに接続されている方ならすぐにこのコラムの内
容を現実の問題に応用できるかと思います。

1.  IP Sniffer の原理

IP Sniffer の原理は、何等かの方法で telnet や ftp などのクライアントプ
ログラムを起動させて特定のポートでそのプログラムの接続を待ち受けると言
う方法で実装されています。従って、原理的にはあらゆるクライアントプログ
ラムが対象になりますが、概ね、ブラウザから起動できるようなものに限られ
ているようです。また起動のトリガは img タグや frame タグなどに対してブ
ラウザが無条件に反応することを利用しています。

さらに特徴的なことは、sniffer を仕掛けた人間がサーバの管理権限を手にし
ている場合には別ですが、 CGI プログラムの設置可能なサーバにおいて一 般
ユ ー ザの権限で仕掛けられることが多いので、アクセス先ポートは基本的に
1024 番より大きなエフェメラルポートに限定されます。


____________________
   1 http://gestell.virtualave.net/cgi-bin/zis.cgi




IP Sniffer に対抗する                                                1







IP Sniffer に対抗する                                                2


ポイントはここにあります。通常、ネットサーフする場合にはエフェメラルポ
ートにアクセスする必要はありません。せいぜい、ファイアウォールの関係上
proxy サーバの動いている 3128 番だとか、 IRC するために 6667 番にア ク
セスするとかいった状況以外には考えられないはずです。

基本的な考え方としては、使わないポートへはアクセスしないということにつ
きます。自分のマシンの使わないポートへアクセスさせないというのは場合に
よっ ては tcp wrapper 等で実現できますが、クライアントプログラムのネッ
トワーク接続自体を阻止する必要があります。更に、起動したとしてもパケッ
ト が sniffer の仕掛けてあるマシンに到達しなければ問題がないので、結局
は、パケットそのものの流れを遮断してしまえば良いことになります。これを
行うのがパケットフィルタリングで、あらゆる通信がパケットで行われている
限りパケットそのものの流れを遮断することは大変な効果があります。

ただしここで一つの決断が必要になります。あらゆるパケットを遮断するのな
ら、最初からコンピュータをネットワークから切り離せば良いので、遮断する
ものと遮断しないものとを選ぶ必要があると言うことです。ここ に  all  or
nothing ですむ場合とは違った難しさがあります。それを主に考えていくこと
します。

2.  サービスの取捨選択

これは要するにどんなサービスが必要でどんなサービスが不要かの取捨選択を
行 う と言うことにつきます。これさえ、はっきりさせれば難しくはありませ
ん。逆に、パケットフィルタリングの難しい部分がこの決断です。

以下は典型的と思われるネットワークの利用形態です。

 (1)   電子メールの送信(25)

 (2)   電子メールの受信(110)

 (3)   www ブラウズ(80)

 (4)   ダウンロードおよびアップロード(20,21)

さらに anonymizer を利用する場合だと proxy サーバの利用がこれに入る と
思います。

自分が普段は何をしているのかと言うことを踏まえればあとは簡単です。ただ
し、表向きにはあまり意識されていない通信で不可欠なものもあります。例え
ば、DNS(53/udp) はホスト名と IP アドレスの対応を知るために絶対に必要で
す。もしも、DNS の通信にかかわる部分を遮断すればすべてを IP アドレスで
指定する必要が生じます。当然こういったことは現実的とは思われないので、
DNS 関係は通す必要があります。更に、エラー通知のために ICPM は全部通す
必要があります。

そ うすると、例えば www ブラウズをするには 80 番ポートの出入りを許可す
れば良いことになりますが、実はこれでは不正確です。正確には、サー バ の
80  番ポートへ向かうパケットとサーバの 80 番ポートから来たポートのみを
許可することになります。すなわち、自分のマシンの 80 番ポートへ向かうパ




$Id: ipsniffer.me,v 1.1 2000/08/01 22:18:48 ageha Exp ageha $        2







IP Sniffer に対抗する                                                3


ケットは遮断する対象になります。2

つまりまとめるとこういうことになります。

 (1)   メールサーバの 25 番ポートへ向かうパケット

 (2)   メールサーバの 25 番ポートからやって来たパケット

 (3)   POP サーバの 110 番ポートへ向かうパケット

 (4)   POP サーバの 110 番ポートからやって来たパケット

 (5)   80 番ポートへ向かうパケット

 (6)   80 番ポートからやって来たパケット

 (7)   21 番ポートへ向かうパケット

 (8)   21 番ポートからやって来たパケット

 (9)   20 番ポートへ向かうパケット

 (10)  20 番ポートからやって来たパケット

最 後の 20 番ポートと言うのは ftp のデータ転送用のポートです。これを指
定しないとコネクションが張れても何も出来ません。さらにメールサー バ や
POP サーバはプロバイダから割り当てられたものを使うしかないので、 IP ア
ドレスは固定で構わないはずです。

さらに、表にはあまり出ることはありませんが、次のようなパケットも通す必
要があります。

 (1)   53 番ポートからやって来た UDP パケット

 (2)   53 番ポートへ向かう UDP パケット

 (3)   すべての ICMP パケット

3.  FreeBSD の ppp の場合

さ て、 以上のプランをもとに実際に設定して見ましょう。ここでは一例とし
て、 FreeBSD の標準コマンドの ppp コマンドの設定を例にとして取り上げま
す。 これは iij-ppp をベースに独自に改良を加えたものです。恐らく最近の
Linux のディストリビューションであれば多かれ少なかれ、同じようなパケッ
トフィルタリング機能のついたものが利用できると思うので、設定はさほど変
わりないと思います。


____________________
   2  web サーバを公開前提で動作させていた場合には話は別ですが、通常の
ダイアルアップ環境でネットサーフするというユーザのみをこのコラムでは対
象にしているので、こういうのは以下考えません。



$Id: ipsniffer.me,v 1.1 2000/08/01 22:18:48 ageha Exp ageha $        3







IP Sniffer に対抗する                                                4


ダイアルアップルータなどの場合でも具体的な設定コマンド自体は参考にはな
りませんが、設定の基本姿勢は同じだろうと思います。

ちょっと説明しましょう。 ppp の場合には例えば次のように設定します。

    set filter in  0 permit tcp src eq 21
    set filter out 0 permit tcp dst eq 21

最 初の条件は自機に入って来る tcp パケットで発信元が 21 番ポートである
ものを許可しています。二番目の条件は、自機から出て行く tcp パケット で
21 番ポートへ向かうものを許可しています。これらのルール番号を 0 として
います。

そういった感じで私の現在の設定は次のようになっています。

    set filter in  0 permit tcp src eq 21 estab
    set filter out 0 permit tcp dst eq 21
    set filter in  1 permit tcp src eq 20 dst gt 1023
    set filter out 1 permit tcp dst eq 20
    set filter in  2 permit tcp src eq 80 estab
    set filter out 2 permit tcp dst eq 80
    set filter in  3 permit tcp src eq 1080 estab
    set filter out 3 permit tcp dst eq 1080
    set filter in  4 permit tcp src eq 8080 estab
    set filter out 4 permit tcp dst eq 8080
    set filter in  5 permit tcp src eq 3128 estab
    set filter out 5 permit tcp dst eq 3128
    set filter in  6 permit udp src eq 53
    set filter out 6 permit udp dst eq 53
    set filter in  7 permit icmp
    set filter out 7 permit icmp


一般的な設定は上の通りです。この場合には、www ブラウズと ftp  に よ る
アップロードとダウンロードそれから socks サーバも含めた各種 proxy サー
バへのアクセスを前提とした設定です。実際には、例えば利用する proxy  サ
ー バが 80 番と決まっているのなら、8080 とか 3128 のは削ってしまった方
が安心です。更に、proxy サーバも決まったサーバということであれば IP ア
ドレスを固定してしまった方が良いです。私の場合にはプロバイダのメールア
カウントは使わず web メールのみなので、 25 番と 110 番関係の設定はいれ
ていません。

もしも、シェルを開放したアカウントにアクセスするのなら 23 番関係を追加
するとか、IRC を使うのなら 6667 番を追加するなどの設定をいれます。

FreeBSD の ppp ですと、上の条件は許可する条件になりますので、上の条 件
に該当しないパケットは一切遮断されます。

4.  若干の補足

上の設定例について若干の補足をしておきます。例えば、上の 21 番ポートの
パケットの許可ルールですが、



$Id: ipsniffer.me,v 1.1 2000/08/01 22:18:48 ageha Exp ageha $        4







IP Sniffer に対抗する                                                5


    set filter in  0 permit tcp src eq 21 estab
    set filter out 0 permit tcp dst eq 21


などとなっています。問題は 1 行目で、疑問に思った方も少なくは な い で
しょう。最後についている、estab というのは TH_ACK フラグの立ったパケッ
トのみを通すと言うことです。つまり、上のルールの意味はコネクションが確
立 されてなおかつ、21 番ポートからやって来たパケットは通すと言う条件に
なっています。

正確に説明するためには 3 way handshake について説明しなければならな い
ので略しますが、通常クライアントがサーバに接続する場合にサーバからクラ
イアントに送られて来るパケットにはすべてこの TH_ACK フラグが立っていま
す。とりあえず、ここではこれだけを押えておけば良いでしょう。つまり、可
能性としては、いきなりサーバとして信頼しているマシンから不審なパケット
が送られて来る可能性もあるわけで、それを排除するわけです。実際問題とし
ては、サーバだと思っていたマシンが何等かの攻撃で落されて、その落された
隙に別のマシンがサーバを騙るということが出来ますので、そういうパケット
を受信するのを最小限にするための措置です。

さらにパケットの偽造という観点から言うと真っ先に電話回線から入って来る
192.168.xxx.yyy  とか 127.0.0.1 なんていうパケットを阻止する必要もあり
ます。大抵の場合にはローカルネットワークのマシンや localhost なんて い
うのは無条件で信頼する設定になっている場合がほとんどですから。

5.  まとめ

こ の他にも、80 番ポートで指定するルールを特定の IP アドレスにしておく
ことで、 Java による IP Sniffer も阻止できます。 Java を使った場合の原
理は、直接投稿させるようなアプレットをダウンロードさせて、それで proxy
サーバを経由せずに投稿させると言うものです。したがって、指定 の  proxy
サーバを経由しないようなパケットを全部遮断してしまえば、こういった性質
の IP Sniffer にも対抗できます。

設定の一例として、proxy サーバを 12.34.56.78:80 としましょう。これを経
由せずにアクセスさせることを禁じるには

    set filter in  xx permit 12.34.56.78 0/0 tcp src eq 80 estab
    set filter out xx permit 0/0 12.34.56.78 tcp dst eq 80

な どとすれば 80 番ポート経由でのパケットはすべてホスト 12.34.56.78 と
の間だけに限定されます。3

以 上、FreeBSD の ppp などのパケットフィルタリング機能を使って、ダイア
ルアップでネットサーフしている方々のプライバシが脅かされないように、簡
単なファイアウォールもどきの設定について述べました。今回は特別な環境で
の設定のみ書きましたが、恐らく、多くの市販のダイアルアップルータでもこ

____________________
   3 この例は試していないので、ちょっと動作は怪しいかも知れ ま せ ん。
man ppp して見て下さい。




$Id: ipsniffer.me,v 1.1 2000/08/01 22:18:48 ageha Exp ageha $        5







IP Sniffer に対抗する                                                6


こで紹介した機能はついていると思われます。4

更に、IP Sniffer のみならず、簡単でもファイアウォールもどきを構築す れ
ば、ポートスキャンに対する抵抗力もあるていど確保できます。夏休みに入っ
て、軽い気持でポートスキャンするという人も多くなりましたので、小さなダ
イアルアップルータなどを持っている方はパケットフィルタリングに挑戦され
てはいかがでしょうか?

通常クライアント機のパケットフィルタリングと言うのは外へ出て行くパケッ
トは無制限で入って来るパケットを制限すると言ったものが多いようですが、
この場合には出て行くパケットもフィルタリングしています。さ も な け れ
ば、IP  Sniffer の対抗策とはなり得ません。更に、あなたのマシンが踏台に
使われるかも知れないという可能性を考えるなら、出て行くパケットを制限す
るのはある意味ネットにマシンを接続する者の義務と言えます。したがって、
このように設定することはあらゆる点で意味のあることなのではないでしょう
か。

































____________________
   4  というか、この程度の機能がついていないのでは商品として成立し得な
い。



$Id: ipsniffer.me,v 1.1 2000/08/01 22:18:48 ageha Exp ageha $        6