以下の設定をhttpd.confまたは.htaccessに記述することで特定の国からの接続を拒否することが出来ます。この設定は、/etc/httpd/conf.d/mod_geoip.confが正しく設定されているときにのみ動作します。
特定の国からのWebアクセスを拒否する
# 環境変数「BlockCountry」を作成します。 # もし国コードが「CN」だったら、それは「BlockCountry」です。 SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry # もし国コードが「RU」だったら、それは「BlockCountry」です。 SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry # 「BlockCountry」に設定されているものからの接続を拒否する Deny from env=BlockCountry
特定の国からのWebアクセスをリダイレクトする
# リダイレクトを有効にします。 RewriteEngineOn # もし国コードが「US」だったら RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$ # http://english.domain.com/ に転送する RewriteRule ^(.*)$ http://english.domain.com [L]
Webアクセスログに接続元国情報を出す方法
httpd.confでは初期状態で以下のようにアクセスログのフォーマットが定められています。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
この設定を変更し、好きなところに国コードを表示する
%{GEOIP_COUNTRY_CODE}e
を混ぜてあげれば国コードが表示されるようになります。
vi(ぶいあい)コマンドで編集できる方はviで、難しい方は以下sed(せっど)コマンドでの方法です。
1. ログフォーマットが指定されている行数を確認します。
[root@dti-vps-srv31 ~]# grep -n ^LogFormat /etc/httpd/conf/httpd.conf | grep combined 485:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2. 行数が分ったので行数を指定して「sed」コマンドで置換します。
例として出力されるログの行頭に国コードを出力する設定を紹介します。
[root@dti-vps-srv31 ~]# sed -i.ORG -e '485 s/^\(LogFormat\) "\(%h\)/\1 " %{GEOIP_COUNTRY_CODE}e\\ \2/' /etc/httpd/conf/httpd.conf
485行目にて行頭(^)から「LogFormat “%h」というものがあれば、
それを「LogFormat “ %{GEOIP_COUNTRY_CODE}e%h」に置換しろ という意味です。また、同時に対象ファイルのコピー「/etc/httpd/conf/httpd.conf.ORG」の作成を行なっています(-i.ORG)。なお「\1」と「\2」はsedコマンドの置換対象のうち「\(」と「\)」で囲われたものに置き換えられますので、細かく書くと以下のようなコマンドになります。
[root@dti-vps-srv31 ~]# sed -i.ORG -e '485 s/^LogFormat "%h/LogFormat " %{GEOIP_COUNTRY_CODE}e %h/' /etc/httpd/conf/httpd.conf
さて説明はここまでにして、次。
3. 上記記実行したコマンド結果でバックアップファイル「.ORG」が出来ていることを確認します。
[root@dti-vps-srv31 ~]# ls -la /etc/httpd/conf/httpd.conf* -rw-r--r-- 1 root root 33805 Jun 24 20:27 /etc/httpd/conf/httpd.conf -rw-r--r-- 1 root root 33726 Mar 28 2010 /etc/httpd/conf/httpd.conf.1 -rw-r--r-- 1 root root 33778 Jun 24 20:24 /etc/httpd/conf/httpd.conf.ORG
4. 現在の/etc/httpd/conf/httpd.confとの差分を確認します。
[root@dti-vps-srv31 ~]# diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.ORG 485c485 < LogFormat "%{GEOIP_COUNTRY_CODE}e %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined --- > LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined [root@dti-vps-srv31 ~]#
5. Apacheを再起動します。
[root@dti-vps-srv31 ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] [root@dti-vps-srv31 ~]#
以上で設定が完了しました。アクセスログをtail(ている)しながらWebアクセスを試してみてください。
[root@dti-vps-srv31 ~]# tail -f /var/log/httpd/access_log xxx.xxx.xxx.xx - - [24/Jun/2011:20:48:01 +0900] "GET /favicon.ico HTTP/1.1" 404 292 "-" "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" #ここでEnterキーを何度かおして空白を作ってから、Webアクセス JP xxx.xxx.xxx.xx - - [24/Jun/2011:20:57:23 +0900] "GET /favicon.ico HTTP/1.1" 404 292 "-" "Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
海外からの接続を再現したい場合には「WebPageTest」を用いて“Test Location”を変更して世界各地からの接続を試してみてください。
以上!
コメント