GeoIPを使わずに、nginxで国別のアクセス制御を行う方法のメモ。
環境
- FreeBSD 14.1
- nginx 1.26
設定方法
simplegeoをインストール
次のリポジトリから、パッケージをダウンロード。
GitHub - versil2024/simplegeo
Contribute to versil2024/simplegeo development by creating an account on GitHub.
インストールしたい場所で解凍する。
# cd /usr/local/bin
# sudo tar xvfz simplegeo_v1_0.tar.gz
詳しくはリポジトリ参照。Pythonパッケージが不足していたら、pipでインストールしておく。
# pip3 install PyYAML requests
国別confファイルを作成
コマンドを実行して、ファイルを作成。ディレクトリ構成が異なる場合には、適宜オプションで指定する。
# sudo /usr/local/bin/simplegeo.py
自動更新
cron実行にコマンドを追加する。
# sudo crontab -e
crontabに次の行を追加。
20 15 * * * /usr/local/bin/simplegeo.py
nginx.conf編集
/usr/local/etc/nginx/nginx.conf
を編集して、アクセス制御を定義する。下記は関連部分だけ抜き出してある。
http {
geo $remote_code {
# 使用するファイルのみ読み込み
default ZZ;
include conf/JP.conf;
include conf/US.conf;
# 国以外にも、別途定義したいものがあれば名前をつけて定義
192.168.0.0/16 MyNet;
192.168.1.0/16 MyNet;
}
map $remote_code $access_allow {
# 指定したIP以外すべて拒否
default no;
JP yes;
US yes;
MyNet yes;
}
server {
location / {
if ($access_allow = no) {
return 403;
}
}
}
}
国別だけでなく、別に指定したいものを混在させて定義できるところが、フレキシブル。
GeoIPを使うよりも便利かもしれない。アップデートが必要なのは、どちらも同じことだし。