以前 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
日本以外を許可したい場合は国コードを変更するだけで応用可能。 便利で楽です。