ServersMan@VPS 接続元国でWebアクセスを制限

スポンサーリンク

 

以下の設定を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”を変更して世界各地からの接続を試してみてください。

 

以上!

 

 

コメント

タイトルとURLをコピーしました