Harada's Diary

Webサーバのアクセスを国内だけに制限する(Nginx編)

以前 apache の GeoIP モジュールを使用して海外からのアクセスを拒否する設定をしていました。

GeoIPを使用してWebサーバのアクセスを国内だけに制限する

今回は Nginx で拒否する方法を考えてみました。


1. 国別のIPアドレスリストを取得

国別の IPv4 アドレスリストを加工して公開してくださっている方がいるので、これを利用します。

— 世界の国別 IPv4 アドレス割り当てリスト —
http://nami.jp/ipv4bycc/

このサイトから、CIDR表記版の gzip ファイルをダウンロードします。

# wget http://nami.jp/ipv4bycc/cidr.txt.gz # gunzip cidr.txt.gz 

このファイルにはCIDR表記のIPアドレスと割り当て国コードが記載されています。

AD 85.94.160.0/19 AD 91.187.64.0/19 AD 109.111.96.0/19 ... 

2. Nginxのアクセス元IPアドレス許可ルールを作成

今回は 日本国内のみ許可 → 海外拒否 とします。

まず全拒否:

deny all; 

次に国別IPv4リストから JP 行のみ抽出し Nginx 用に整形
出力先 /etc/nginx/allow.conf

# sed -n 's/^JP\t\(.*\)/allow \1;/p' cidr.txt > /etc/nginx/allow.conf 

Apache 例(参考):

# echo "Order allow,deny" > .htaccess # echo "Allow from all" >> .htaccess # sed -n 's/^JP\t/Allow from /p' cidr.txt >> .htaccess 

3. Nginx設定に組み込み

/etc/nginx/nginx.conf の include conf.d/*.conf より前に追加

http { ... include /etc/nginx/allow.conf; include /etc/nginx/conf.d/*.conf; } 

設定反映:

# /etc/init.d/nginx configtest # /etc/init.d/nginx reload 

拒否ログは error.log に出る:

2017/01/25 23:23:54 [error] access forbidden by rule, client: 114.40.25.38 

4. スクリプト化例

#!/bin/bash cd /usr/local/src/ wget http://nami.jp/ipv4bycc/cidr.txt.gz gunzip cidr.txt.gz echo 'deny all;' > /etc/nginx/conf.d/allow.conf sed -n 's/^JP\t\(.*\)/allow \1;/p' cidr.txt >> /etc/nginx/conf.d/allow.conf /etc/rc.d/init.d/nginx reload rm -f cidr.txt exit 

日本以外を許可したい場合は国コードを変更するだけで応用可能。 便利で楽です。