0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

Varnish6.4.x にGeoIP2ベースのアクセス制限を掛ける

日本国内向けのWebサイトの場合、しばしば日本国外からのアクセスが迷惑になるケースがあります。
もちろん、GoogleBotやBingBotのような有益なクローラーはきちんとサイトにアクセスしてもらわなければいけないわけですが、サイトによっては特定の国や地域、あるいは妙なUserAgentによるアクセスが頻発することがあります。
ファイアウオール等でIPから国を割り出して遮断できるサービスが利用できる場合は、もちろんそちらを使うほうが簡単かつ無難ではありますが、そういった機能・サービスが利用できないケースの場合に、アプリケーションサーバーの前に設置していたVarnishで対処してみました。
というわけで自分用の作業メモです。

用意するもの

とりあえず必要なものを整理しておきます。

  • Ubuntu 18.04 LTS(20.04LTSでも基本同じ)
  • Varnish6.4.x (6.0/6.5/6.6でも良いらしい)が動く環境。 packagecloudからインストール前提
  • libvmod-geoip2
  • Maxmindのアカウント
  • geoipupdate

事前準備

当然のことながら、Varnishが動いていないとだめです。VCLの書き方などは省略します。他の記事を適当に調べてセットアップしましょう。
Maxmind のサイトでアカウントを作成し、ライセンスキーを発行しておきます。
ライセンスキーをなくさないようにDLしておくとよいでしょう。

インストール手順

libvmod-geoip2のソースを入手

Githubリポジトリ からソースを入手します。
アーカイブで取ってきてもいいですし、リポジトリをクローンしてきても可です。お好みで。

libvmod-geoip2をビルドする

Installationに書いてある手順に沿ってビルドを行えば基本はOKです。
ただし、packagecloudからVarnishをインストールしている場合は、

sudo apt install varnish-dev libmaxminddb-dev

をしておかないと、autogen.shやconfigureがコケます。
make && make installできたら次に進みます。

geoipupdateのインストール

Ubuntuなので、

add-apt-repository ppa:maxmind/ppa
apt update
apt install geoipupdate

でリポジトリの追加と、geoipupdateのインストールを行います。

GeoIP.confの作成

geoipupdateのインストールができたら、適当なディレクトリにGeoIP.confを作成します。
サンプルは、Github にあるので、これをベースに

  • AccountID
  • LicenseKey

を設定します。どちらも事前準備で取得したMaxmindのライセンスキーで得られます。

geoipupdateの実行

geoipupdate -d GeoIPのDBを保存したいパス -f /path/to/GeoIP.conf

を実行し、GeoIPのデータベースが作成されることを確認します。
この処理は毎週やることを推奨されているので、あとでCronに登録しておくと良いでしょう。

Varnishの設定調整

仕上げにVarnishのVCLを調整します。
libvmod-geoip2のインストール手順にもあるように、VCLに以下の内容を追記します。

import geoip2;

sub vcl_init {
    new country = geoip2.geoip2("/path/to/GeoLite2-Country.mmdb");
}

sub vcl_recv {
    if (country.lookup("country/names/en", client.ip) != "Japan") {
        追加で書きたいVCLの処理を色々
                return (synth(403, "Forbidden"));
    }
}

あとはVarnishにVCLを読ませます。落ちても良い環境の場合はVarnishの再起動でも良いですが、キャッシュをたくさん抱えている場合は、

sudo varnishadm -T localhost:6082 -S /etc/varnish/secret vcl.load 適当なVCL名 /etc/varnish/default.vcl
sudo varnishadm -T localhost:6082 -S /etc/varnish/secret vcl.use 適当なVCL名

でVCLの差し替えができます。
もちろん、テスト用の環境でVCLの内容が正しいことをテストしてから行いましょう。

あとはアクセスログを見て、日本国外のアクセスが遮断されていることが確認できればOKです。
より細かい条件式はVarnishの公式ドキュメントなどを読んで、調整すればよいでしょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?