(This page is written in Japanese.)

水無川研究所

ipfwとBINDによるNaverRobot対策フィルタ

最終更新: 2003/05/14

NaverRobotについて

NaverRobotは、韓国のWeb巡回ロボット(もどき)で、サーバに存在しない(そしてデットリンクにしてはあまりにでたらめで量が多過ぎる)URLに対して大量のアクセスをかけてくるプログラムです。アクセスログ
(参考: http://okuyama.mt.tama.hosei.ac.jp/etc/virus.html など)

このアクセスがあったIPアドレスをフィルタしようとしても、IPアドレスを変えてくるのでいたちごっこのようです。 また、User-Agent:ではじこうとしても、WWWサーバに負荷がかかるのみならず、過去にUser-Agent:を変えてきたという報告もあります。

対策

現在のところNaverRobotが使用しているIPアドレスは韓国に割り当てられているIPアドレスのみの模様なので、韓国に割り当てられているIPアドレスを一律にアクセス遮断することによって防ぐことができます。また、一律に制限することによる副産物として、韓国からのワームやポートスキャンなどをブロックすることができ、サーバの安定性が向上するというメリットも生まれます。

副作用として、韓国からのWWWの閲覧やメールの受取り(一律に遮断した場合)ができなくなりますが、当面韓国からWWW閲覧してもらう必要もメールを受け取る必要もないので、ここでは特に対応しないこととします。

フィルタ設定

ここでは、ipfwとnamedによってフィルタを行なうこととします。韓国割り当てIPアドレスのルールは数十行になるため、すべてのパケットについて検査するのはスループットの大きな低下につながります。このため、

の順でチェックすることとします。ipfwルールでは

flush
add 65000 allow ip from any to any
add 100 allow tcp from any to any established
add 200 allow ip from any to any via lo0
add 300 allow ip from any to any via sis0
add 1000 allow udp from any domain to any
add 1100 allow udp from any to any domain in recv tun0
add 2000 allow tcp from any to any out xmit tun0
(ここに韓国割り当てIPアドレスのチェックを入れる)
add 4000 allow tcp from any to xxx.xxx.xxx.xxx 20,ftp,ssh,smtp,http,imap,https in recv tun0
add 4100 allow tcp from any 20 to any 1024-65535 in recv tun0
add 4200 reset tcp from any to any 113 in recv tun0 setup
add 4300 allow tcp from yyy.yyy.yyy.yyy to xxx.xxx.xxx.xxx domain in recv tun0
add 4900 deny log tcp from any to any in recv tun0
add 5000 deny udp from any to any 137-139,135,445 in recv tun0
add 5900 allow udp from any to any in recv tun0

のようになります。公開サーバポートへのアクセスには韓国割り当てIPアドレスかどうかのチェックが入ることになりますが、検査されるのはTCP接続確立時だけなのでそれほど深刻ではありません。

ネームサーバを自前で持っている場合、韓国割り当てアドレスからのDNS問い合わせに応答しないように設定すれば、立て続けにWWWサーバに接続を試みられることがなくなるので、さらに効果が上がります。

UDPについては、TCPのように検査を接続確立時のみに限ることができないので、ipfwで検査をするとスループットの低下につながります。このため、UDPの大半を占めるDNS参照のパケットについてはipfwでは検査せず、BINDに拒否させることとします。named.confでは、

include "/etc/namedb/kr.bind";

options {
	directory "/etc/namedb";
	allow-query {!kr; any;};
	allow-transfer {yyy.yyy.yyy.yyy;};
};

のようになります。

ルールの自動生成

アジア太平洋地域でのIPアドレスの割り当てについては、APNIC allocation and assignment reportsから得ることができます。このファイルから手動でルールを生成するのは労力がかかるので、スクリプトによってルールを生成することとします。

作成したkrfilter.plを使用し、

./krfilter.pl 3000 < apnic-200x-xx-xx > krfilter

とすると、krfilterが生成されるので、これをipfwの追加ルールとして読み込むようにします。また、

./krfilter.pl 0 < apnic-200x-xx-xx > kr.bind

とすると、BIND用のaclファイルkr.bindが生成されるので、これをnamed.confからincludeすることにより、krという名前のaclが使用できるようになります。