Fastlyで特定の国からのアクセスをブロック


Fastlyではエッジサーバー上で様々な情報にもとづいて処理を行うことが出来ますが、そのひとつとしてよく使われるものにアクセス元の国によるアクセス制限があります。

この記事では特定の国からのアクセスをFastlyサーバー上でブロックする手順を紹介します。なお、この設定はカスタムVCL機能を利用せずにGUIから設定が可能です。

特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
Fastlyの正式なサポート情報は以下のサイトでご確認下さい。
https://docs.fastly.com/

設定の手順としてはまず503や404などを返却するレスポンス設定を作成し、その設定に条件としてアクセスを拒否する国を設定します。

アクセス拒否レスポンスの作成

  1. FastlyのWebポータルにログインしConfigureをクリックします。
  2. Serviceメニューから設定を行いたいServiceを選択して下さい。
  3. Edit Configurationボタンをクリックし、Clone activateをクリックして下さい。Serviceの新しいversionが表示されます。
  4. 左側のメニューから Content をクリックして下さい。
  5. 右側のコンテンツの一番下にある SET UP ADVANCED RESPONSE をクリックして下さい。 次の画面が表示されるので必要な情報を入力して下さい。

Name: このレスポンスの名前です。適当な名前を指定して下さい。
Status: ブロックした際に返却するレスポンスのステータスコードを指定します。ブロックしたことを明示的に通知したいのであれば403。ブロックしたことをクライアントに分かられたくないのであれば404や503などが考えられます。
MIME Type: text/html
Response: レスポンス内容を記述して下さい。
6. 必要な情報を入力したら Create をクリックして下さい。

Response に HTML コードを記入すると、このレスポンスを返却する際に記入したHTMLコードをレスポンスとして返却する事が出来ます。簡単なカスタムエラーページを返却したい場合などに利用することが出来ます。

アクセス拒否条件の作成と割当

続いて作成したアクセス拒否レスポンスにアクセスを拒否する条件を割り当てます。

  1. 作成したアクセス拒否設定の横に表示されているAttach a condtionをクリックして下さい。

  1. Create a new conditionウインドウが表示されるので、以下のように入力して下さい。

  • Type: Request
  • Name: 条件を識別するための適当な名前
  • Apply if...: ここでアクセスを拒否する国を指定します。

クライアントのアクセス元の国はclient.geo.country_code変数で取得できますので、たとえば日本からのアクセスを条件としたい場合はApply ifに
client.geo.country_code == "JP"
と指定して下さい。

なお、UIではなくSnippetなどを使ってVCLを自分で書く場合、この条件は以下のようなコードになります。

vcl_recv
  if( client.geo.country_code == "JP" ) {
    処理内容
  }

複数の国を指定したい場合は
client.geo.country_code ~ "(JP|US)"
と指定することが可能です。

地域制限を行いながら特定のIPは制限の対象外としたい場合は
client.geo.country_code == "JP" && req.http.Fastly-Client-IP !~ white_acl
といったような条件を指定することも可能です。(別途 white_acl を作成する必要があります)

  1. 条件を作成したらSaveしてからコンフィグをActivateして下さい。

以上で設定は完了です。新しい設定は通常数秒程度で反映されます。

実際にアクセスを行って期待通りに動作しているかを確認して下さい。

なお、Fastly で利用可能な地域情報の変数については
https://docs.fastly.com/guides/vcl/geoip-related-vcl-features
を参照下さい。