IPアドレスから地域特定するGeoIP系技術について調べてみた(追記あり)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。CONTACTTOPインフラIPアドレスから地域特定するGeoIP系技術について調べてみた(追記あり)インフラ2019.08.31IPアドレスから地域特定するGeoIP系技術について調べてみた(追記あり)morimorihogeシェアツイートブックマークLINEmorimorihogeです。昔は夏ってもっと仕事なくて暇だった気がするんですが、ここ数年徐々に忙しくなっていてまったりできてない?はてブでこんな記事が上がっていて、IPアドレスからの地域特定サービスについて具体的にどうなのよ?と思ったので調べてみた結果をまとめてみます。NURO光最大のデメリットとサポート対応の悪さが上限知らずでどうにもならないなお、GeoIPという用語について、世間では狭義のGeoIPはMaxMind社のサービスを指しますが、広義のGeoIP系技術はIPアドレスから地域を推定する技術やサービス一般を指すと捉え、本記事では広義のGeoIPの視点から解説します(狭義のGeoIPを示す場合、現行サービス名のGeoIP2やGeoLite2の名称を使います)。※記事公開後、NURO光の問題の割当IPアドレスと思しきものが分かったため追記しています前提知識そもそもNURO光のサポートがどうかとかは僕の預かり知らない技術的興味の範囲外なので、ここでは気にせず、純粋に元海外IPを割り振られて大手動画配信サイトや子供のゲームなどいろいろなサービスを利用できなくなってしまいましたという点にのみ絞ってfocusします。世の中では一般的にIPアドレスから接続元地域(国やより詳しい情報)を特定する方式を広くGeoIPという言葉で使っているように思いますが、実際にはユーザーのアクセス元地域を想定する方法にはいくつかのやり方が考えられます。※僕の知識範囲で調べたものなので、他にもあればぜひ教えて下さいGeoIP2等の外部データベースを活用する方式(辞書方式)前提として、狭義のGeoIPという固有名詞はMaxMind社の提供するサービスのことを指しており、一企業の提供するデータベースを利用します。元々はGeoIPが広く利用されていましたが、今はGeoIPはサービス提供終了(2019年1月)し、GeoIP2に移行しているようです。MaxMind社はGeoIP2のサービスを提供しており、無償版のGeoLite2と有償版のGeoIP2があります。世間一般で流通しているOSSライブラリのほとんどが無償版のGeoLite2を利用していると思います。GeoLite2とGeoIP2の違いは有償・無償、データの細かさ、サポートの有無、ライセンスにあるようです。この辺り細かく知りたい人は公式を参照して下さい。databases?少なくともGeoLite2はMaxMind社から圧縮ファイル形式でデータベースが提供されており、利用者はこのデータベースファイルをサーバー側にダウンロードしてアクセス元IPで検索することにより、どの地域からのアクセスかを調べることができます。GeoLite2ではCity、Country、ASN(AS番号)の3種類のデータベースが提供されており、アクセス制限などで国レベルの粒度が必要な場合にはCountryを使っているのではないかと思われます。一方で、アクセス解析などの用途でより細かい地域情報がほしければCityを使っているところもあるでしょう。Databasesこの方法のメリットは、タイトルに「辞書方式」とあるように、予めダウンロードしたデータベースを利用できるので、高速にIPアドレスから場所情報の解決が可能な点と、国(Country)・市区町村(City)粒度の情報が得られる点になります。Webサービスでは高い応答性を求められるため、前もってデータベースをダウンロードできるGeoIP2(GeoLite2)が広く利用されるのは順当と言えます。一方で、MaxMind社はあくまで一企業であるため、企業買収やサービス方針の変更によりサービス停止や仕様変更、対応サポートの恣意的な運用の可能性があります。MaxMind社は公式にIPアドレスと地域の紐付けを申請するフォームを用意していますが、こちらで申請した情報がどのような過程を経てGeoIP2(GeoLite2)に反映されるのかは恐らく企業秘密です。requestまた、公的機関ではなく、アメリカにあるいち企業であるため、アメリカの施策等によってサービス内容に制限がかかることもあるかもしれません。日本で利用する分には今の所気にしなくて良いとは思いますが、アメリカの敵対国家に関する情報や、アメリカ国防に関わる情報については意図的に粒度を下げられている、などの可能性は十分にあるのではないかと思います。Element社、IPIP.net、ipgeolocationなども提供しているようですので、サービス開発サイドの方でGeoIP2(GeoLite2)が使えない事情のある方は他のサービスも調べてみると良いと思います。Numbers)はインターネットにおけるIPアドレスやDNS名などの資源を管理している団体です。Registry)と呼ばれる地域ごとの管理団体に管理を移譲しています。Centre)に含まれており、さらにAPNICは日本のIPアドレス割当をJPNIC(日本ネットワークインフォメーションセンター)に移譲しています。冒頭にあったようなNUROのようなISPは、通常はJPNICからIPアドレス割当を受け、それを利用者に提供している、というのが実態になります。企業や個人という形で権限移譲しながら割り当てられているわけですね。IPアドレスの地域解決に戻ると、IANAは全てのグローバルIPアドレスをどのRIRに割当しているかという情報を公開しています。Updated(執筆時点では2019-07-18でした)とある通り、グローバルIPアドレスの割当は大本のIANAレベルで最新情報を公開しているので、この情報を参照することで、RIRレベル(とても大きな地域レベル)でのざっくりとした地域を調べることが可能です。Centre)の管理IPであればヨーロッパだろう、ということはこの情報から予測できます。再割当て」などで検索すると良いと思いますというわけで、あとはGeoIP2(GeoLite2)と同じで、データベースをダウンロードしてアクセス元IPと突き合わせをすればいいわけですね。こちらの方法も予めデータベースをダウンロードできる辞書方式なので、高速な特定が可能ですが、RIRレベルの判別では国までは分からないため、国別のアクセス制限に使うには少々情報の粒度が荒すぎるという問題はあります。一方で、ICANN本拠地はアメリカに存在しますが、非営利組織として組織構成や意識決定について広く公開されているためその辺りは信頼性の面で利点があるといえるとも思います。ICANNの組織紹介より引用IANAのRIRに対するアドレス割当はそもそもIPアドレスという有限のリソース割当を意識したものであり、IPアドレスからアクセス元地域を判断するために作られたものではありませんが、予測情報の一つとして使うこともできなくはない、ということになります。ドメイン(ホスト)名」の名前解決を行う逆引き(PTR)の機能もあります。#{調べたいIPアドレス}で調べることもできますし、自分が今繋いでいるIPアドレスに関する情報であれば、確認君+のようなオンラインサービスでも「あなたのリモートホスト」として調べることができます。これにより、アクセス元ユーザーのIPアドレスに逆引き(PTR)レコードが設定されていればドメイン名を調べることができるので、例えば「逆引きアドレスのドメインがJPだから、多分日本からのアクセスだろう」といった推測が可能になります。逆引きレコードは全てのIPアドレスについて設定されているとは限らないため、この方法で確実にドメイン名を調べることができるとは限りません。他にも、WHOIS公開データベースを用いることでもう少し詳しい情報を取得できます。JPNICのように、APNIC傘下のJPNIC管理であること、日本からのアクセスであることなどを調べることが可能です。hosting(防弾ホスティング)などを使われるとどこまでの情報を信頼してよいのか分からないという問題もあり、人力で処理するならともかくプログラムで自動処理するのはやや難しいところです。今回問題になったようなサービスはオンラインサービスのため、人力で調べることはまず不可能だったり、DNSの逆引きレコードが設定されていないケースに対応できないという問題があります。サービス運営側の大きな問題として、これらのオンライン問い合わせ方式では、IPアドレスからDNS逆引き・WHOIS問い合わせといった外部サービスへの問い合わせをアクセスされるたびに実行する必要があるため、アクセス制限に用いるにはサービス応答性の面で都合が悪いという背景もあります。いうわけで、これらの方式は何か障害や問い合わせがあったときに後から調べるのには向いている方法ですが、オンラインサービスのアクセス制限に動的に用いるには不向きということになります。元の問題の原因を考察してみる(あくまで推測です)ざっとIPアドレスからのアクセス元推測方式についてまとめてみたところで、冒頭に挙げた「特定ISPのサービスで一部のサービスで海外アクセス認定されてしまう」という点について考察してみましょう。大前提として、IPアドレスから地域を特定する具体的な方法はサービス提供者側に委ねられています。あるサービス事業者はGeoIP2やGeoLite2を使っているかもしれませんし、ある事業者は違うものを使っている(独自ブラックリストや別のGeoIPデータベースなど)かもしれません。そのため、ISP(今回ではNURO光)に対して直接クレームをつけても本来の問題解決に至らない可能性があります。一方で、ISP側で何も対策をできないのかというと、そんなこともありません。NCCのIP取って割当できるのか?という疑問はあります。そもそもJPNIC割当IPでした(追記参照)DNS逆引きレコードをjpドメインなどの国が特定できるドメインで設定する(改善する可能性はあるが微小?)対応済みでした(追記参照)WHOISデータベースで国情報を提供する(改善する可能性はある)対応済みでした(追記参照)といった対策を行うことで、海外アクセスに誤検知される可能性を下げることができるのではないかと思います。15:40更新:その後問題とされているIPアドレスが分かって追加調査したところ、ここで挙げたISP側での対策は全て実施済みのようでした。今回の事例ではISPであるNURO光(SO-NET)は悪くなさそうですまた、特定サービスを使いたいということだけで良ければ、サービス事業者側に直接問い合わせするというのがより近い解決策にはなりますが、企業向けのサービスであればともかく、一般個人向けのマス向けサービスでいちいち個別IPからのアクセス対応をしてくれるというのは期待薄だと思います(僕がサービス提供者側でもコスト面からお断りすると思います)。サービス提供者側がGeoIP2(GeoLite2)のような公開データベースサービスを利用しているケースの場合、データベースの更新を怠っているという可能性がゼロではありませんので、同じように地域アクセス制限を実施しているサービスで「このサービスはアクセスできるのになぜ御社のサービスはアクセスできないのか?」という問い合わせを上記技術的背景を含めて相談すると、改善される可能性はあります。MaxMind社のGeoIP(GeoLite)は2019年1月という比較的最近にサービス終了しているため、サービス事業者側がGeoIP2(GeoLite2)への移行を済ませていない可能性はそれなりの確率であり得ると思います。最近割当が変更されたIPアドレスを使っている場合には、2019年1月時点で更新が止まってしまっており、新しいGeoIP2(GeoLite2)データベースを参照していないことで誤検知されている可能性はありそうです。この辺り、自分が当事者でない(割当IPアドレスもわからないので詳細を調べようがない)ため、あくまで参考情報ということで、実行及び解決するかについては各自自己責任ということでお願いいたします。15:40更新)NURO光は本当にヨーロッパ圏のIPアドレスを使っているのか?Twitterを「GeoIP」でさらっと検索していたところ、興味深い情報がありました。GeoIPは頻繁な更新ですし、ミスればお客さんブロックなので、運用コスト高いですよね。そもそもnuroはちゃんと逆引きPTRレコードにnuro.jp付いてますから、むしろこれを海外とみなしてブロックしちゃう事業者がなぜいるのか不思議です。nuro.jpのPTRレコードは設定されているWHOISデータベースは登録しているということがわかります。NCCに割り当てられており、IANA公開情報だけを見るとヨーロッパ圏に見えます。whoisコマンドで調べてみます(2019/08/31)時点。RIPE(後ろは省略)よく見るとNON-RIPE-NCC-MANAGED-ADDRESS-BLOCKと書かれていますね。NCCレベルでは92.202.0.0/16をさらに他のRIRに提供しているアドレスブロックである(他のIPアドレスの足りないRIRに移譲していると思われる。わからない人はCIDRとかで検索して下さい)となってしまっていると考えられます。JPNICということで、92.202.64.0/25の情報でSO-NET(NURO光のISP)情報が取得できました。NCCに行ってしまい、APNICが管理していることにたどり着けないことです。NCCが返しているWHOIS情報を見ても「他のRIR参照してね」としか書かれていないので、最悪全てのRIRのWHOIS問い合わせをしなければならず、これはオンライン問い合わせ型のアクセス制限をしているのであればちょっと難しそうですね。JPNICから割り当てられた日本割当のIPアドレスを使っているが、IANAのWHOISデータベースから直接たどるのは難しいということになります。JPNICと割当が行われているため、NURO光がヨーロッパ圏のIPアドレスを割り当てているということはありません。正確には「割と最近までヨーロッパ圏に割り当てられていたIPアドレスを利用している」が正しいです。GeoIP2(GeoLite2)はどうなっているのか?さらに、IPアドレスが分かったので、実際にGeoIP2(GeoLite2)を確認してみます。Gemを利用させて頂き、最新のGeoLite2データベースをMaxMind社公式ページからダウンロードして実行しています。"Japan"というわけで、ちゃんとGeoIP2(GeoLite2)では日本と識別できていますね。合わせて、更新の止まってしまった旧GeoIP(GeoLite)でも調べてみましょう。こちらはUbuntu公式のgeoip-bin及びgeoip-databaseパッケージを利用しました。Germanyというわけで、ドイツと認識されてしまっていますね。JPNICから日本であることを調べることができるということになります。なると、疑わしいのはサービス事業者側が古い更新の止まったGeoIP(GeoLite)を利用してしまっているという状況になります。ここまでの情報を総合すると、NURO光に問い合わせするよりはサービス事業者に問い合わせする方が良さそうですね。さまより、JPNICのIPアドレス移転履歴は公開情報なので確認できる旨教えていただきました。確かに、先程調べた92.202.0.0/15が2019-01-16(GeoIP(GeoLite)のサービス終了時期)に国際移転されていることがわかります。GeoIP技術を使った国判別という観点で見ると、JPNIC内でのIPアドレス移転については同じ日本内なので更新されなくても大事にはなりませんが、国際移転されるケースでは今回のような問題が発生するので、サービス事業者側はこうしたリスクも理解した上でGeoIP系技術を利用する必要がありそうです。まとめIPアドレスからアクセス元地域を調べるGeoIP系技術について、自分の理解をさらっとまとめてみました。ここに挙げた以外の方法や間違いがありましたらぜひTwitterにて@morimorihoge宛にご意見いただけますと幸いです。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。