http://nginx.org/en/docs/http/ngx_http_geoip_module.html
nginxのngx_http_geoip_moduleモジュールを利用して、国を指定してアクセス制御をします。
フィルタリング用のデータは、MaxMindのGeoIPオープンソースデータを利用します。
日本だけにコンテンツを配信したい、もしくは、特定の国からのアクセスを拒否したい、といったときに使えるとおもいます。
環境は、CentOS 6です。
以下、セットアップ方法です。
GeoIPデータベースを準備
GeoIPデータベースと更新コマンドをインストール。
# rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum install GeoIP geoipupdateGeoIPデータベースファイルが設置されたことを確認。
# stat /usr/share/GeoIP/GeoIP.dat
nginxを準備
nginxをインストール。
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm # yum install nginx nginx-module-geoip # nginx -v nginx version: nginx/1.10.1nginx設定パラメータにhttp_geoip_moduleが入っているか確認。GeoIPは、動的モジュールとして有効化できるようになっています。
# nginx -V --with-http_geoip_module=dynamicnginx動的モジュールの共有オブジェクトファイルが設置されているか確認。
# ls /etc/nginx/modules/ ngx_http_geoip_module-debug.so ngx_http_geoip_module.so
nginx設定
カントリーコードはこちらのURLを参考にします。
http://dev.maxmind.com/geoip/legacy/codes/iso3166/
load_moduleを追記。modules/ngx_http_geoip_module.soを指定します。
events {} ブロックより上に記述するのがポイントです。
# emacs /etc/nginx/nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; load_module modules/ngx_http_geoip_module.so; events { worker_connections 1024; }
http {} ブロックを編集。
includeより上に記述します。
アメリカ(US)と日本(JP)からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default yes; US no; JP no; }日本(JP)と韓国(KR)からのアクセスを許可、他の国からのアクセスを拒否する場合。
# emacs /etc/nginx/nginx.conf geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default no; JP yes; KR yes; }
server {} ブロックを編集。
allowed_countryがnoだったらステータスコード403を返します。
# emacs /etc/nginx/conf.d/default.conf if ($allowed_country = no) { return 403; }
nginx再起動
nginxをリスタート、またはリロード。
# /etc/init.d/nginx restartブラウザなどでアクセスして確認しましょう。思い通りにアクセスコントロールできたでしょうか?
GeoIPデータベースを更新するには?
GeoIPデータベースをアップデートをするには、以下のコマンドを叩きます。定期実行するようにしましょう。
# geoipupdate -v
ELBの場合は?
AWSを使っている場合、ELBを前段に置く場合がほとんどだとおもいます。
ELBからのヘルスチェックでサーバに来るアクセスは、内部IPアドレスのため、国で判別することができません。そのため、VPC内のIPアドレスからアクセスが来た時には、制限をスルーするようにnginxを設定します。
以下の設定では、ELB経由のアクセスから、アクセス元IPアドレスを取得。ELBのヘルスチェックのアクセスを許可、日本からのアクセスを許可、ほかの国は拒否としています。
ついでに、アクセスログにGeo情報を出力するようにしています。
Top image from いらすとや