日本国内向けの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の公式ドキュメントなどを読んで、調整すればよいでしょう。