User-Agentではなく、IPアドレスできちんと制限したい場合のお話。もちろんキャリアが公開しているIPアドレスを書いておけばいいのだけど、変更があった場合に漏れなく対応したいっていう。思いつきで書いてみる。
追記の追記
と思ったけど、apacheのドキュメントを良く見ると、allow にドメインを設定した場合
Apache は HostnameLookups の設定に関わらず、クライアントの IP アドレスに対して DNS の 2 重逆引きを行ないます。 ホスト名からオリジナルの IP アドレスを順引きします。 順引きと逆引きが一致し、ホスト名が該当した場合にのみ、 アクセスが許可されます。
となっているので、PTRレコードに携帯のドメインを記述されても大丈夫だった。
1. IPアドレスを列挙して許可する
- http://www.nttdocomo.co.jp/service/imode/make/content/ip/
- http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
- http://creation.mb.softbank.jp/web/web_ip.html
キャリアが公開しているWebページからIPアドレスを取得して、
allow from 210.153.84.0/24 allow From 210.136.161.0/24
と書き並べていく。もちろん、手動で確認なんてしてられないので
DSASの中の人のPerl を使ったり、WWW::MobileCarrierJP::* モジュール使って取ってくる。ただし、取ってくるだけでは反映されないので
- WebページをチェックしてIP帯域を取得
とかまでスクリプトで自動化しておけば、キャリアの更新に遅れずについていける。と思ったんだけど、自動で再起動かけて起動しなかったら・・・とか、スクリプトをミスってアクセス許可用のconfigが空になったままapache再起動したら・・・とか考えると小心者の僕には出来ませんでした。
2. 逆引きで許可する
お手軽に設定できる。大きな欠点は、アクセスされるごとに逆引きで判定しているるのでwebサーバ、DNSサーバに負荷がかかる。小規模なサイトならこれでもいいかな。
allow from .docomo.ne.jp
負荷以外にも、この設定は他力本願で、
- DNSサーバに依存している
- キャリアがIP帯域追加する時に、PTRレコードに逆引き登録されることをアテにしている
こんなことになっています。たぶんこれで大丈夫だけど。
3. IPアドレスと逆引きの組み合わせ
上2つの折衷案。まずキャリアのIP帯域は1番同様に定期的に確認して、configに吐いておく。で、configをincludeしつつ逆引きの許可も最後に書いておく。
include allow_docomo.conf include allow_ezweb.conf include allow_softbank.conf allow from .docomo.ne.jp allow from .ezweb.ne.jp allow from .jp-c.ne.jp .jp-d.ne.jp .jp-h.ne.jp .jp-k.ne.jp allow from .jp-n.ne.jp .jp-q.ne.jp .jp-r.ne.jp .jp-s.ne.jp .jp-t.ne.jp allow from .vodafone.ne.jp .softbank.ne.jp
こうしとけば、configに記述しているIP帯域からのアクセスは逆引きなしで許可できて、config以外のIPでも逆引きできれば許可できる。後は何かメンテするタイミングで、includeしているconfigを確認しつつapacheを適当に再起動しとけばいいかも。とか。