手軽に国別のアクセス制限をかける方法のメモ。
環境
- FreeBSD 14.1
- nginx 1.26.1
GeoIP設定
net/geoipupdateインストール
GeoIPデータの自動アップデートツールをportsからインストール。
# sudo portmaster net/geoipupdate
アップデート用のツールがインストールされるけれども、これだけではまだデータのダウンロードはできない。
MaxMindにユーザー登録
FAQ内の「Create an Account」のページを参照し、アカウントを作成する。
3種類の方法が記載されているが、2番目の「sign up for GeoLite2」を選択すればよい。1番目と3番目の選択肢は、有償版を使用したい人向け。
「Sign up for free GeoLite2 databases and web services」の項にあるリンク先にアクセスし、必要事項を記入してアカウントを作成する。ログイン時にメール認証が必要になるので、ちゃんとメールの届くアドレスで登録すること。
MaxMindはパスキーに対応しているので、一度ログインした後にパスキー登録すれば、メール認証は不要となる。
ライセンスキー取得
ログイン後、左側メニューから「Manage License Keys」を選択し、「Generate new license key」をクリックしてライセンスキーを発行する。
アカウントIDとライセンスキーは発行時にしか表示されないので、コピー&ペーストで保存しておく。
また、このとき表示される「Download Config」ボタンをクリックすると、必要情報が埋められたGeoIP.conf
がダウンロードできる。
GeoIP.conf編集
/usr/local/etc/GeoIP.conf
を編集して、アカウントIDとライセンスキーを入力する。または、ダウンロードしたGeoIP.conf
で上書きする。
データ更新
geoipupdateコマンドを実行して、データを取得。
# sudo geoipupdate
自動更新をcron登録
自動更新を、cron登録する。
# sudo crontab -e
crontabに、次の行を追加。
27 0 * * 1,3 /usr/local/bin/geoipupdate
nginx設定
geoipモジュール追加
nginxをビルドし直して、geoipモジュールを追加する。
# sudo portmaster --force-config nginx
オプション選択で、次のものをチェックして再ビルド。
HTTP_GEOIP2=on: 3rd party geoip2 module
nginx.conf編集
/usr/local/etc/nginx/nginx.confを編集し、load_module
を追加。
load_module /usr/local/libexec/nginx/ngx_http_geoip2_module.so;
httpディレクティブに使用するファイルを指定。
geoip_country /usr/local/share/GeoIP/GeoLite2-Country.mmdb;
アクセス制限/許可を、httpディレクティブに次のように定義。
# JPだけ許可する場合
map $geoip_country_code $allowed_country {
default no;
JP yes;
}
# CNとRUだけ拒否する場合
map $geoip_country_code $denied_country {
default yes;
CN no;
RU no;
}
$allowed_country
や$denied_country
の部分は、自分で好きなように変数定義できる。ここで定義した変数を使って、httpディレクティブやlocationディレクティブ内で次のように制限をかけることができる。
if ($allowed_country = no) {
return 403;
}
nginx再起動
nginx.conf
の編集を終えたら、nginxを再起動して反映させる。
# sudo service nginx restart