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

· 1 min read
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

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