世界を動かす技術を、日本語で。

自宅でのIP情報の活用法:レイテンシを使ってCLIでIPをジオロケートする方法

概要

  • IPアドレスの物理的な位置情報(国、州、都市)を特定するCLIツールの開発経緯
  • VPN業者がIPジオロケーション情報を偽装する手法の解説と、その検証方法
  • Globalpingを活用した、レイテンシとトレースルートによる高精度な位置特定アプローチ
  • 実際の計測手順と精度向上の工夫、今後の課題
  • オープンソースで公開中、誰でも利用・改良可能

IPアドレスのジオロケーション検証ツール開発

  • CLIツール を作成し、IPアドレスから 国・州・都市 まで特定可能
  • ipinfo などの既存サービスと比較し、精度を確認済み
  • VPN業者 がARINやRIPE、Geo DBプロバイダに 偽の位置情報 を提供する実態を解説
  • ipinfoは 大規模プローブネットワークレイテンシ・ホップ解析 による独自手法で物理位置を特定
  • 公開データに頼らず、 実測値 から信頼性の高いジオロケーションを実現

GlobalpingとCLIツールの仕組み

  • Globalping はオープンソースのプローブネットワークで、世界中に 3000台以上のプローブ を展開
  • pingやtraceroute を使い、IPアドレスの物理的な位置を推定
  • CLIツールは globalping-tsライブラリ を利用し、下記の流れで自動判定
      1. 入力されたIPに対し、各大陸から数回pingして 大陸特定
      1. 特定した大陸内の複数プローブからpingし、 最小レイテンシの国 を判定
      1. 米国の場合は州レベルまで同様に判定
      1. さらに都市レベルまで絞り込み

計測手法と工夫

  • ICMP ping は多くのネットワークでブロックされるため、最終的に traceroute を採用
  • tracerouteの 最終ホップのレイテンシ から物理的な距離を推定
  • より精度を高めるには、 複数手法・複数ポート の組み合わせやASN情報の重み付けも有効
  • 現状は 最小限のプローブ数 で高速・簡易に動作する設計
  • 精度向上にはプローブ数や選定ロジックの最適化 が今後の課題

実際の測定例と精度

  • 大陸判定 :5プローブで極めて高精度(例:ヨーロッパIP→32.39ms)
  • 国判定 :50プローブで十分な精度(例:ポーランド7.29ms、ドイツ13.42ms)
  • 州判定 :米国IPを州レベルで特定(例:Florida 0.45ms)
  • 都市判定 :最小レイテンシのプローブから都市を推定(例:Miami 0.00ms)
  • 注意点 :プローブ選定ロジックの都合で、対象国にプローブが割り当てられない場合もある

精度向上の工夫と今後の展望

  • 全大陸・全州ごとにプローブを明示的に指定 することで、精度や一貫性向上が可能
  • プローブ数の配分(例:米国200台、カナダ20台、メキシコ10台)が精度に大きく影響
  • カバレッジが薄い地域 では精度が低下する可能性
  • シンプルな設計 で未認証ユーザーでも利用可能、精度向上にはプローブ数の増加が有効

オープンソース・活用方法

  • ツールはオープンソース でGitHubに公開:https://github.com/jimaek/geolocation-tool
  • コマンド例:geolocate $IP
  • --limitオプションでプローブ数を調整可能(全フェーズに適用されるため注意)
  • GlobalpingのAPI制限 :未認証で250回/時、認証で500回/時まで利用可能
  • プローブホストやGitHub Sponsorsによる寄付でテスト回数増加
  • ドキュメントや改善PR歓迎、問い合わせや無料クレジット提供も可能(d@globalping.io)
  • プローブ設置も簡単 (コンテナ起動のみ):https://github.com/jsdelivr/globalping-probe

まとめ

  • レイテンシベースのジオロケーション は十分なプローブ数とカバレッジがあれば高精度
  • 未認証でも手軽に試せるツール として公開中
  • ネットワークルーティングやパフォーマンス解析 など多用途で活用可能
  • 今後の課題 はプローブの分布拡大と選定アルゴリズムの最適化

Hackerたちの意見

これは、Globalpingのようなサービスを使って地理的位置情報のニーズを探る小さなプロジェクトです。作るのは楽しかったけど、今の実装はデモに過ぎないし、ちゃんとしたプロダクションツールには程遠いです。本気で使いたいなら、各フェーズで少なくとも500のプローブが必要です。最適化は比較的簡単にできるけど、匿名ユーザーの制限を超えないようにするのが大変でした。

総プローブ数を減らすために最適化できるかもね(ただし、トータルの時間が長くなる可能性はあるけど、場合によっては早くなるかも)。まずは多大陸プローブをやって、例えば3回ずつやる。最も時間がかかるプローブを捨てて、最短時間の近くにプローブを追加して、1回プローブする。これを「プローブ、評価、捨てて追加」のパターンで繰り返す。オーケストレーターに全データを蓄積するから、理論的には各ラウンドで統計的な力を得るために意図的に複数のプローブを出す必要はない(最初を除いて)。これで、5つの離散的なフェーズではなく、リアルな位置を常に「追いかける」ことができると思う。最近、Veritasiumのポテンシャルとベクトル場についての動画を見たんだけど、レイテンシーは一種のスカラー・ポテンシャル場で、それを使ってレイテンシーの勾配を導き出せるかも。

理論的には3つで十分じゃない?

これがうまくいくとはちょっと驚き。レイテンシの変動が大きくて、時々地理的位置とは全然関係ないこともある。オランダの人と話したとき、イギリスからオランダのコンテンツに対して自分の方がいいレイテンシを持ってることに気づいた。おそらく、ピアリングが良いからだろうね。

近くのPoPに近づいて、ほとんどキャッシュされたコンテンツをリクエストするだけじゃない?アムステルダムはすごく繋がってるから、そこにPoPがあるとは思えないし。あと、7~8年前まではオランダの主要都市でもほとんどの場所にファイバーがなかったから、今はほとんどカバーされてるけどね。

それはローカルループのレイテンシーかも。VDSLやDOCSISだと、最初の1kmだけで5~15msのレイテンシーが出ることもあるし。ロンドン(例えばテレハウス)からアムステルダムまでは大体7msくらいだよ。

レイテンシの変動がすごいよね… そうそう。例えば、俺の街からフランスにある専用サーバーまでの距離は250キロって分かってるんだけど、サーバーにpingを打つと、俺の場所を中心に円を描くと半径2000キロになるんだ。距離にして約8倍。自分のIPがアメリカにないことは証明できるけど、それでもあんまり正確じゃないよね。実際、俺のサーバーよりも2倍離れたイギリスのサーバーの方が、常にpingが低いことが多い。TFAのアプローチ、特にPingじゃなくてtracerouteを使ってるのがいいね。

測定対象のホストが、ソースIPに基づいてping応答に追加の人工レイテンシを導入して、測定された位置を偽装するのはどのくらい現実的だと思う?

完全に可能だけど、こういう状況では実際には起こらないことが多いね。

不可能ではないけど、最初からpingに応答しない方がずっと簡単だと思う。

完全に可能だよ。もっとクールなトリックもできるし、例えばhttps://github.com/blechschmidt/fakeroute。無意味?ほぼ確実にそうだね。

XfinityとCharterがほとんどの近所の回線を過剰供給しているおかげで、アメリカのインターネットユーザーのかなりの部分に対して、バッファーブロートの影響で既にそうなってるよ(1000/30の接続で最大2500ms!)。

「ソースIPに基づいて変動する」ああ、それはそう思うよね。でも、代わりにジオロケーションpingに使うIPのソースを偽装したらどうなるかな!

トレーサルートは解釈が難しいことで有名だし、簡単に偽装できるよね。tpbが北朝鮮に移動した時のスタントを覚えてる?ASなら、BGPアナウンスに偽のASを追加して、偽装トレーサルートをもっと信憑性のあるものにできる。これがVPNとのいたちごっこを引き起こすのかな。

素晴らしいアイデアと実行だね。HNにもっとこういうのがあればいいのに。

投稿を理解した限りでは、著者は最小のpingの位置を勝者として取ってるみたいだね。これはすごく初歩的なアプローチに思える。三角測量をやらないのはなんで?各ping時間を2点間の距離の測定として考えれば、ランダムに選んだIPからpingを飛ばして、そこから位置を計算できるはずだよ。

パケットは直線で移動しないからね。

記事の中で少し触れてるけど、主な目的はコンセプトの証明として機能するシンプルなものを作ることだったんだ。この力技のアプローチは、十分なプローブと少しの運があれば、思ったよりもずっと良く機能するよ。でももちろん、もっと良くて賢いアプローチがあるのは間違いないね!

これをTCPスタックに組み込むのは賢いアイデアだね。データ送信とその確認応答の時間に基づいて、相手との距離の下限をすぐに教えてくれるから。これにはすぐに使えるアプリケーションがいくつか見えるよ。

tcp_infoからTCPの往復時間を測定できるよ。具体的には、以下のように使うんだ。 struct tcp_info info; socklen_t len = sizeof(info); getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, &len); tcp_infoはOSやバージョンによって異なるけど、tcpi_rttは結構サポートされてると思う。

AIなしでやり遂げたの、すごいね!君のダサい一言のコミットメッセージを読むだけで嬉しくなるよ。

一部のコードはAI生成かもしれないね。コードが端末出力を区切るのに「══════」を使ってるから。僕の経験では、Claudeはこの文字を使って出力を区切るのが好きなんだ。

逆方向のIPルートを見れば、これを拡張できるよ。最後のホップの状態にはだいたい正確だし、そのホップのfqdnには空港や都市コードが載ってることが多いから、追加のメリットもある。

いい仕事だね!DEFCON 31で似たような研究を発表したよ。タイトルは「時間を欺けない:レイテンシートリラテレーションで敵と自分を見つける」だよ。スレッドで言及された制限に対処するためのいくつかの重要な違いがあるんだ。純粋なpingベースのジオロケーションの主な問題は、

  • IPはすでにデータベースでジオロケーションされている(君が指摘した通り)
  • ルーティングの非対称性が距離モデルを壊す
  • Anycast/CDNが単一のIPを複数の場所に見せる
  • ICMPがブロックされたり優先度が下がったりする 僕のアプローチは、HTTP(S)のレイテンシー測定(pingじゃなくて)を使って、約39,000のデータポイントでトレーニングしたMLモデル(SVR)を使ってインターネットのルーティングの非線形性を扱い、その後最適化を通じてトリラテレーションを行った。CloudFrontの背後にいるターゲットの精度は約600kmで、正確ではないけど、「どこでも」から「おそらくヨーロッパ」に絞り込むには十分だった。実際の価値は精度ではなく、
  • 物理的に不可能なレイテンシーパターンでサンドボックスを検出すること
  • ジオフェンスされたマルウェアを提供すること
  • 従来のIPジオロケーションが失敗したときに任意の位置信号を提供すること トークも見てみてね: https://youtu.be/_iAffzWxexA

すごい投稿と素敵なツールだね。これらの技術を実際に使った経験を少しシェアするよ。

  1. トリラテレーションは、GPSとは違ってインターネットのルーティングではほとんど機能しない。ほかのコメントでも詳しく触れられてるけど、ここで説明されているアプローチ、つまり最も近い単一の測定を取るのが、事前データなしでできる最善の方法だよ。これには、都市にノードを大量に分布させて、スケールで有用なデータを得る必要がある。私たちは自分たちのサーバーを運営していて、Globalpingをスポンサーして、RIPE Atlasを使っていくつかの測定を行っている(私はジオデータプロバイダーで働いてる)。それでも、数千のプローブがあっても、プローブに非常に近いIPのレイテンシーベースの位置を正確に推測できるのは限られている。
  2. だから、レイテンシーやトレーサルートの測定は、既存の位置データを確認するのに最も役立つ。つまり、大多数のIPスペースでは、何かと比較する必要があるってこと。
  3. トレーサルートのホップは良いけど、注意点はルーターをジオロケートしていること。RIPE IPmapは、ほとんどの公共ルーターを良い精度で位置特定している。
  4. 全体的に、これらの技術はインフラやサーバーのIPアドレスにはかなりうまく機能するけど、一般のネットワークにはあまり効果がないね。https://ping.sxもいい比較ツールだよ。

同意だけど… https://youtu.be/_iAffzWxexA DEFCONでの20分間のトーク