nginxでGoIP2を使ってアクセス制限

手軽に国別のアクセス制限をかける方法のメモ。

環境

  • 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
タイトルとURLをコピーしました