目次

mod_geoip 接続元国でWebアクセスを制限

yumレポジトリ追加

「mod_geoip」モジュールをインストールできるようにyumレポジトリ「epel」を追加します。

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

md_geoip インストール

# yum -y install mod_geoip

geoipのデータベースを更新するよう設定

vi /etc/cron.monthly/geoip
chmod 755 /etc/cron.monthly/geoip

/etc/cron.monthly/GeoIP.sh

#! /bin/sh

TMPDIR=/tmp
GEODIR=/usr/local/share/GeoIP
DAT=GeoIP.dat

cd $TMPDIR

#/usr/bin/wget http://www.maxmind.com/download/geoip/database/$DAT.gz
/usr/bin/wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/$DAT.gz
if [ $? != 0 ] ; then
    echo "wget failed"
    exit 1
fi

/bin/gunzip $DAT.gz
if [ $? != 0 ] ; then
    echo "gunzip failed"
    exit 2
fi

cd $GEODIR
/bin/mv $DAT $DAT.`/bin/date "+%Y%m%d-%H%M%S"`
/bin/mv $TMPDIR/$DAT .

Apache側の設定

<Location />
Order allow,deny
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE KR BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE US BlockCountry
Deny from env=BlockCountry
Allow from all
</Location>

特定の国からのWebアクセスを拒否する

SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
# もし国コードが「RU」だったら、それは「BlockCountry」です。
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry

# 「BlockCountry」に設定されているものからの接続を拒否する
Deny from env=BlockCountry

特定の国からのWebアクセスをリダイレクトする

# リダイレクトを有効にします。
RewriteEngine On
# もし国コードが「US」だったら
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$
# http://english.domain.com/ に転送する
RewriteRule ^(.*)$ http://english.domain.com [L]

Webアクセスログに接続元国情報を出す方法

GeoIPのモジュールを読み込んでる状態で、「%{GEOIP_COUNTRY_CODE}e」をLogFormatに足す事で

国情報を出力する事ができます。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    ↓   ↓
LogFormat "%{GEOIP_COUNTRY_CODE}e %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

これで下記のように国コードが先頭に出力されます。

JP 210.172.143.2 - - [27/Jan/2012:18:58:51 +0900] "POST /lib/exe/ajax.php HTTP/1.1" 200 68 "http://dokuwiki.fl8.jp/doku.php"