nginxで手軽に国別アクセス制御

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を使うよりも便利かもしれない。アップデートが必要なのは、どちらも同じことだし。

タイトルとURLをコピーしました