サーバ管理 - Apache:海外はじき
作業メモ。
はじめに
中国のサイトに蓮が晒されてるようなので、海外からのアクセスをはじくことにする。初稿は2006年くらい。
日本だけ許可する
とりあえず日本以外からのアクセスをすべて拒否することにした。こんな感じのシェルスクリプトを組んでやる。
#!/bin/sh
directory='/var/www/html/'
file=$directory".htaccess"
wget http://www.blackholes.us/zones/countries/jp.txt
## Original Setting Start ##
echo "Options ExecCGI" > $file
echo "DirectoryIndex index.html index.php index.cgi" >> $file
echo "AddHandler application/x-httpd-php .html .php" >> $file
echo "ErrorDocument 401 /msg/401.html" >> $file
echo "ErrorDocument 403 /msg/403.html" >> $file
echo "ErrorDocument 404 /msg/404.html" >> $file
echo "ErrorDocument 500 /msg/500.html" >> $file
## Original Setting End ##
echo "order deny,allow" >> $file
echo "deny from all" >> $file
cut -f 2 jp.txt | awk '{print "allow from " $1 }' >> $file
rm -f jp.txt
cronでぶんまわす前提なので最初のリダイレクトは上書きの>、残りは>>で追記。
実行する。
$ sh reject.sh
吐き出しは成功。拒否ってることを自分で確認できないことが難点か。アクセスログでチェックしてみるしかなさそう。setEnvifか何かで、海外からの訪問者をGoooooogle大先生あたりにリダイレクトさせる手もあるにはあるか。
なお国内の串経由でアクセスされた場合には当然allowとなる。だからといって串経由のアクセスをすべて拒否するのはいくらなんでも乱暴。串経由のアクセスに関して串越しのリモホを検出し国内ならおk、海外もしくは未判定だったら拒否るような流れが理想だけどそれはApacheでやることじゃないよ、たぶん。現実的な方法としては踏み台にされてそうなホストを見つけたら上記シェルスクリプトに追記しる、ってところか。
2011-02-24追記:blackholes.usはいつの間にか消えていたので上記スクリプトはそのままでは使えなくなってしまった。んまあ俺は特定アジアだけ有効な結界があればそれでいいので、国内専用にこだわりたい人はpcmgxxx氏の備忘録あたりを参考にしてみては(もっとも、IPv4アドレスブロックはついに枯渇したので更新する必要は今後なくなるかもしれない・・・というかそう遠くない将来、IPv6でのブロックが必須になるのかもね)。
中国だけ拒否する
考え方は同じで、allowとdenyを逆にするだけでよい。問題は該当国のアドレスブロックのリストを入手できるかどうかなのだが、krfilter - deny accesses from .krで公開されていたのでこちらを使うことにする(.htaccessで使うのは「おまけ」のほうのファイルだからな!)。
#!/bin/sh
directory='/var/www/html/'
file=$directory".htaccess"
wget http://www.hakusan.tsg.ne.jp/tjkawa/lib/krfilter/uCN.txt
echo "Options ExecCGI Includes" > $file
echo "DirectoryIndex index.html index.php index.cgi" >> $file
echo "AddHandler application/x-httpd-php .html .php" >> $file
echo "ErrorDocument 401 /msg/401.html" >> $file
echo "ErrorDocument 403 /msg/403.html" >> $file
echo "ErrorDocument 404 /msg/404.html" >> $file
echo "ErrorDocument 500 /msg/500.html" >> $file
echo "#update " `date +"%Y/%m/%d %H:%M:%S"` >> $file
echo "order allow,deny" >> $file
echo "allow from all" >> $file
cut -f 2 uCN.txt | awk '{print "deny from " $1 }' >> $file
echo done.
rm -f uCN.txt
MP3に多重セッション張るのはたいてい中国なので、根こそぎ死にやがれ。
より確実に仕留める
krfilter - deny accesses from .krで実施しているように、iptablesのチェインに該当アドレスをぶち込んでやる。バーチャルホスト単位で制御したいような場合には.htaccessを使えばよいだろう。
別の方法 追記:2011-02-24
連載当初とはサイトの状況が変わったり鯖移転したりでブロック解除していたのだけれども、また懲りずに多重セッション張りまくるようになってきたので復活させた。今度は中国+半島。なお相乗りしてる会社のサイトがアジア関係の商材も扱ってる関係で、iptablesにぶちこむわけにはいかないのだ。
ホゲホゲロックにてIPアドレスから国名を割り出すapacheモジュールで海外からのアクセスを遮断する方法が紹介されていた。ただ、どうも判別用テーブルと思われるファイルを手動更新しないといけないようで、有料であればこのへんの煩わしさをどうにかできなかったのかなあ、と(無償ならシェルスクリプトくらい自分で組めって話だが)。モジュール形式のほうが負荷は軽そうなので残念。