share facebook facebook2 twitter menu hatena pocket slack

2014.11.05 WED

CentOSでGeoIPを利用してHTTPアクセスを制御する

佐藤 裕行

WRITTEN BY佐藤 裕行

cloudpack佐藤です。

GeoIP

maxmindが提供する、IPアドレスから地理情報を確認することができるサービス(GeoIP)。

無償版と有償版が用意されている。

MaxMind – IP 地理位置情報およびオンライン詐欺防止

料金体系

GeoIP2 Databases

Database Lite 都市
精度の高い情報
頻繁な更新
月額 free $12 $90
大陸
都市
郵便コード
緯度経度

詳しい料金体系

MaxMind – GeoIP2 Databases

Databaseの精度の確認

こちらに国名を入力して確認できる。
MaxMind – GeoIP2 City Accuracy

GeoIP2 Liteを使用しApacheのアクセスを国別に制限する

OSはCentOS6.5を使用する。

パッケージインストール

yum install mod_geoip GeoIP GeoIP-devel GeoIP-data zlib-devel

データベース取得

cd /usr/share/GeoIP/
mv GeoIP.dat GeoIP.dat_org
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

Apacheモジュール設定

vim /etc/httpd/conf.d/geoip.conf

<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPScanProxyHeaders On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat MemoryCache
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat CheckCache
</IfModule>

#ログ出力したい用
LogFormat "%a [%h] %u %t %D "%r" %>s %b "%{Referer}i" "%{User-Agent}i"   GeoIP_Address="%{GEOIP_ADDR}e" Country_Code="%{GEOIP_COUNTRY_CODE}e" Country_Name="%{GEOIP_COUNTRY_NAME}e"" combined

国別制限

vim /etc/httpd/conf.d/vhost.conf

<Location "/">
  Order Deny,Allow
  SetEnvIf GEOIP_COUNTRY_CODE JP BlockCountry
  #以下どちらか設定
  Allow from env=BlockCountry #日本のみのアクセス許可
  Deny from env=BlockCountry #日本からのアクセス拒否
</Location>

データベース更新仕込み

#!/bin/sh

GEOIP_MIRROR="http://geolite.maxmind.com/download/geoip/database"
GEOIPDIR=/usr/share/GeoIP
TMPDIR=

DATABASES="GeoLiteCity GeoLiteCountry/GeoIP asnum/GeoIPASNum GeoIPv6"

if [ -d "${GEOIPDIR}" ]; then
        cd $GEOIPDIR
        if [ -n "${DATABASES}" ]; then
                TMPDIR=$(mktemp -d geoipupdate.XXXXXXXXXX)

                echo "Updating GeoIP databases..."

                for db in $DATABASES; do
                        fname=$(basename $db)

                        wget --no-verbose -t 3 -T 60 "${GEOIP_MIRROR}/${db}.dat.gz" -O "${TMPDIR}/${fname}.dat.gz"
                        gunzip -fdc "${TMPDIR}/${fname}.dat.gz" > "${TMPDIR}/${fname}.dat"
                        mv "${TMPDIR}/${fname}.dat" "${GEOIPDIR}/${fname}.dat"
                        chmod 0644 "${GEOIPDIR}/${fname}.dat"
                done
                [ -d "${TMPDIR}" ] && rm -rf $TMPDIR
        fi
fi

GeoIPテスト

IPアドレスを入力することで、情報を確認することができます。
MaxMind – GeoIP デモ

アクセスすることで自端末の情報が確認できます。
GeoIP2 JavaScript Client API << Maxmind Developer Site

参考サイト

IPアドレスから地理的位置情報のまとめ
IPアドレスの地理的位置情報が引ける無料RESTful API集

その他サービス
IPligence Lite Free, Free IP Geo-location database

インストール参考
Install Mod_GeoIP for Apache in RHEL/CentOS 6.3/5.8
Apache+mod_geoip2で国単位でアクセスを遮断する – 旅モバ

元記事はこちらです。
CentOSでGeoIPを利用してHTTPアクセスを制御する

佐藤 裕行

佐藤 裕行

元NIerの通称砂糖です。AWSのネットワークまわりには詳しいです。現在は構築チームに所属し、多忙な日々を過ごしています。