海外からのアクセス(IP)を拒否する方法と注意点【.htaccess】

この記事は最終更新から3年以上が経過しています。情報が古くなっている可能性があります。

こんにちは、しばです。
ネットワークの知識がまだまだ疎い今日この頃、海外(国外)IPアドレスからのアクセス拒否する簡単な設定方法は無いかな〜と調べる機会がありました。
そこで出てきたのが掲題の.htaccess を使う方法。

検索したらすぐ書き方が出てきて、ありがたく参考にさせて頂いていたんですが、

  • 自分は国内にいるわけだし、実際弾かれてるかの確認はどうやってやれば…(´・ω・`)?
  • 許可する国内IPアドレスリストの更新は必要じゃ無いんだろうか(´・ω・`)?

という疑問点がいくつか。

そこら辺を調べつつ、.htaccess での海外アクセス拒否の書き方〜確認〜注意点あたりを整理してみました。
同じようにネットワークにあまり自身がない方の補足的な知識になれば幸いです。

.htaccessの書き方

こちらのコードを使いつつ、自分用の勉強用にコメントを追加させていただきました。

### 検索エンジンをまとめて許可するためにenv化する(Must)
### 検索エンジンbot参考)https://www.casis-iss.org/ex1911/
SetEnvIf User-Agent "Googlebot" allowbot
SetEnvIf User-Agent "msnbot" allowbot
SetEnvIf User-Agent "bingbot" allowbot
SetEnvIf User-Agent "Slurp" allowbot

### いったん全てを拒否する (Must)
order deny,allow
deny from all

### 検索エンジンからのアクセスを許可 (Must)
allow from env=allowbot

### SearchConsoleのプロパティが確認出来るためにの対策 (任意)
### 参考)https://support.google.com/webmasters/answer/80553?hl=ja
allow from googlebot.com
allow from google.com

### 日本国内のIPを許可 (Must)
### 国内IP取得先)http://www.cgis.biz/tools/access/
allow from 1.0.16.0/20
allow from 1.0.64.0/18
allow from 1.1.64.0/18
allow from 1.5.0.0/16
allow from 1.21.0.0/16

( 中略 )

allow from 223.223.164.0/22
allow from 223.223.208.0/21
allow from 223.223.224.0/19
allow from 223.252.64.0/19
allow from 223.252.112.0/20

記述の内容は下記の通り。

3〜6行目 SetEnvIf User-Agent “xxx” allowbot

この.htaccess は、すべてのアクセスをブロックする→特定のアクセス(国内IPアドレス)のみ許可 という流れで海外アクセス制限を実行しています。(制限→許可の実行順は後述にて命令)

ただ、国内IPアドレスのみの許可だと検索エンジンのクローラー(bot)もブロックされたりしてサイト運営に色々支障が。
そのためこの行では、実際に命令を行う前の準備として、アクセスを許可する検索エンジンのbotを指定しておきます。
今回はGooglebot(Google)、Slurp(Yahoo)、msnbot・bingbot(Bing)のクローラーのみ許可設定をしてます。
よそ様の記事をみると、ほとんどがこの4つだけ許可してる印象ですが、もし他にも許可したいときはこちらのブログのbotUA一覧が参考になりそう。

「SetEnvIf」は環境変数をセットする命令なので、「SetEnvIf User-Agent “Googlebot” allowbot」→”リクエストのユーザーエージェントがGooglebotであれば、環境変数allowbotに1(True)をセットするよ!”という内容の処理になります。

9〜10行目 order deny,allow〜

9行目が制限(deny)→許可(allow)の順で実行するという命令、10行目がすべてのアクセスを制限するという命令です。

13行目 allow from env=allowbot

3〜6行目で記述した環境変数allowbotが1(True)ならばアクセスを許可するよ!という意味。
上記の.htaccess なら、Googlebot、Slurp、msnbot、bingbotはallowbotがTrueになるのでアクセスすることが出来ます。

22行目〜 allow from x.x.x.x/x

ここに許可する日本国内のIPアドレスリストを記載します。
コメントにもあるこちら(「IPアドレスで日本国外(海外/外国)からのアクセスを制限する.htaccess CGI’s」)から最新の国内IPアドレスリストを取得してきて、すべてのIPアドレスの前にallow fromを書くだけ。
ちなみに2019/7/11時点では4000行くらいありました。

この.htaccess を、通常通りアクセス制限をかけたいサイトのルートフォルダにアップロードすれば、すぐにアクセス拒否を有効化することが出来ます。

正直最初.htaccess で拒否設定できると聞いて「国外IPをまとめて数行で制限できる画期的な記述とかがあるのかなぁ」と思ってましたが、初心者の戯言でした_(:3」∠)_

実際に拒否されているか確認する

できたら海外のIPアドレスで当該サイトにアクセスしてブロックされているか確認したいところですが、日本から確認するのはなかなか難しい…

サーバーのアクセスログをSSH接続(やレンタルサーバの機能)でチェックして、上記対策の施行前施行後で海外IPからのアクセスが無くなっているか見るのが確実なんだと思いますが、もうちょっとサクッと確認したいなぁと思い探してみました。

ここら辺のツール・サービスだと確認できそうなことを発見。

  1. 海外のブラウザチェッカーツール
  2. IPアドレス切り替えツール(言い方悪いけどIPアドレス”偽装”目的で使用されることも多い)

実際に確認に使ったツールをそれぞれご紹介します!

WebPagetest

http://www.webpagetest.org/

お手軽にブラウザから確認できるサービスです。
海外IP拒否設定をしたURLを入力、”Test Location”から適当な国を選択して”START TEST”をクリック。

ちゃんと拒否設定が出来てると403 forbidden(アクセス拒否、閲覧権限なし)と表示されます。

ちょっと余談ですが、ここで日本の「Tokyo, Japan – EC2 – Chrome – Cable」を選択して確認したところ、なぜかこちらも403 forbiddenが(°Д°)ここら辺、このブラウザチェッカーで使用している物理サーバーの問題なのか、APNICのリスト更新のタイミングの問題なのかよく分からず…

APNICの最新リストを使っていて自身の環境からサイトを閲覧できることが確認できていれば、国内に関してはちゃんと許可されてると判断していいかなと考えています。

Betternet Unlimited Free VPN Proxy

https://chrome.google.com/webstore/detail/betternet-unlimited-free/gjknjjomckknofjidppipffbpoekiipm

こちらはchromeの拡張機能。
使い方は簡単で、この拡張機能のパネルからCONNECTボタンをクリックし、該当ページにアクセスすればOKです。

国の切り替えは、上記赤枠の国名(Canada)をクリックします。
よそ様の紹介記事をみてるとたくさんの国を選べるようなんですが、確認した時点では次の4カ国だけ選択できるようになっていました。

  • Russian Federation
  • Canada
  • Netherlands
  • Germany

こちらのIPアドレスを表示できるサイト等を利用して、ちゃんとIPが切り替わってるかチェックしながら確認するといいかも知れません。

ちゃんと設定できていれば、こちらもいずれの国でも403 forbiddenになることが確認できます。

注意点① .htaccessの更新箇所

.htaccess は既存の内容を消したり、記述の順番等によって致命的な影響が出ることがあるので、修正する際は注意が必要です。
WordPressサイトの場合は「# BEGIN WordPress」という記述の上に書かないと動かないということも。

詳しくはこちらの記事でも書いているのでご参照ください!

.htaccessを使ったURLの正規化まとめ(wordpress対応)

注意点② 許可する国内IPアドレスの更新について

一番気になったのが、「国内IPアドレスリストを記述したけど、更新する必要はないの?」という点。
どんどん増えていくだろうけど意識するほどの変動ではないのか、頻繁に更新しないと致命的なことになるのか、ということが不安だったので調べてみました。

APNICでの更新頻度について

前述の.htaccess を作成したときに参照した国内IPアドレスリストの取得元を見てみると、日本に割り当てられているIPアドレスは”APNIC”から取得しているとのこと。

「Asia Pacific Network Information Centre」の略。 APNICは、世界に三つある地域レジストリの一つとして IPアドレスの割り当て・管理業務を行っています。
名前が示すようにアジア太平洋地域を受け持っており、 事務所はオーストラリアのブリスベーン郊外に置かれています。 なお、JPNICはAPNICよりIPアドレスの割り振りを受け、 それをIPアドレス管理指定事業者に対して割り振っています。
引用元)インターネット用語1分解説~APNICとは~

日本はこのAPNICに所属していて、JPNICは日本に割り振られたIPアドレス等のネットワーク資源を扱う組織です。
APNICは割り振ったIPアドレスリストを公開しているため、.htaccess 作成時に使ったリストの取得元はそれを利用しているとのこと。

次にAPNICでの更新頻度について調べたらこんな情報が。

この更新リスト1はほぼ毎日アップデートされている。
(中略)
一方で毎日更新されているとはいえ、日本にアサインされたIPが日々こまめに変化しているというわけでもない。だいたい週に1〜2回程度、僅かな追加と削除*が発生している程度だ。
(中略)
* あるときA国で使われていたIPが、気がついたら何時の間にかB国に再割当てされていたということは割とある。
引用元)日本国内限定IPv4アクセス制限の仕込み方 – てくにかるむ

週に1〜2回のわずかな変動…。あんまり影響が無さそうな感じもしますが、まだピンと来ず。
国を跨いで再割り当てされるIPアドレスがあるというのはびっくりしました。

ちなみに*に関してはこちらにもそのような記述がありました。
Amazon EC2 の IP 帯域

実際どれくらい変動するの?

へテムルさんのこちらのブログ(2014年)に、アクセス制限方法の紹介として当時の国内IPアドレスリストが出ていたので、最新版と比較してみました。

差分比較ツールKDiff3の使用

このツールでは右側のバーにコード全体の差分が表示されます。差分がない行は白(色なし)。
こうを見るとかなり変わってることが分かります。確かにインターネット業界で5年…様変わりしてもおかしくないですよね。

ある程度のスパンで更新は必要

まとめると、国内IPアドレスリストの更新頻度、変動に関しては

  • 週1−2回程度の僅かな変動があり、変動によって違う国に割り振られるIPもある
  • 5年放置すると大きな差異が発生

という状態のようです。

アクセス制限の目的によってどの程度敏感に対応すべきか変わってくると思いますが、スパムや攻撃を防ぎたい個人サイトであれば最低でも1年単位、出来たら3〜6ヶ月程度のスパンで更新した方が良さそうです。

最後に

ネットワーク難しい…今回調べる中で国際的なIPアドレスの管理体制・仕組みに触れられていい勉強になりました。
認識が違うところや不明点があれば、フォームかtwitterから教えてもらえると嬉しいです!