サーバに対するアクセスで、接続元IPの位置情報から地図に接続元をマッピングして表示したりする機能はよくある。Google Analyticsでは見慣れた人も多いと思う。
インターネットの通信はEnd-to-End繋がっているように見えるけど、1方のEndから送信されたデータはもう1方のEndに直接届くわけではなく、途中で色んな経路を辿っていく。例えば自分のこのサーバにアクセスしにきた’95.138.53.131’のIPアドレスは次のような経路を辿っている。
+-----------------+---------------+----------------+ | trace_ipaddr | country | city | +-----------------+---------------+----------------+ | 95.138.53.131 | Martinique | Riviere-Salee |(ここからの接続) | 213.188.170.58 | France | Presles | | 213.188.171.9 | Guadeloupe | Pointe-a-Pitre | | 77.67.69.126 | Germany | Neu-Isenburg | | 141.136.109.25 | Germany | Neu-Isenburg | | 199.229.229.181 | United States | Willowbrook | | 129.250.5.43 | United States | Englewood | | 129.250.3.12 | United States | Englewood | | 129.250.4.108 | United States | Englewood | | 203.105.72.229 | Japan | Tokyo | | 157.7.40.137 | Japan | Tokyo | | 157.7.40.113 | Japan | Tokyo | | 203.189.96.2 | Japan | Tokyo | +-----------------+---------------+----------------+
上から接続元のIPで次に辿る経路のIP…と続いて最後にJapan/Tokyoが来ている。例的にはこんな感じね。Martiniqueって国、初めて知ったよ…
んで、この辿った経路は調べることが出来る(tracerouteというコマンドで)。ただ全ての経路が分かる訳じゃなく、分からない所もあったり(tracerouteのICMPに対応していないとか)するんだけど、大体の経路は分かる。その経路のIPアドレスから位置を取得するIP-API(Geolocation API)を叩いて、経路上の位置を特定して通信しているデータがどんな経路を辿っているかマッピングしたのがこちら。
ちなみに、アクセスデータは自分のブログにアクセスしにきている接続ログを利用している。
WebAPのログをfluentでelasticsearchに送って、golangでログを検索してlocationのデータをMySQLにツッコムといった感じで。golangからesにはelastigoを使ってみた。そして集計したMySQLのデータをopenFrameworksで描画!!といった感じ。
ちなみに、IPと位置という関係は正確では無いです。「このIPはこの場所にある」というのは正確に特定するのは難しい(そもそも、IPのプロトコルで位置データを扱うヘッダというのは無い)。ルーティングやIPの設定で、全然違う所に配布したりも出来るわけで、その辺の正確性には欠ける。ただ、大体の国と地域はAPIで取得される位置でもOK。またtracerouteの経路情報もその時々で変わって、常に同じ経路という訳でも無い。経路はルーティングプロトコルによって変わったり再構成されていく。
これはアクセス順に動画にしてみた。
接続元IPがどの国から来ている、という絵とか動画は見たりするけど経路も含めた物は見た事がなくって面白いかなーと思ったら、スゲーことになった。
全ての経路が日本の自分サーバに集中している。色んなアクセス経路のデータが取れたから、接続元IPの国別にどういった経路を辿ってきているのかも分かる。
まずはアメリカからの経路。殆どがUSからデータが来ているけれど、一部ヨーロッパ経由で来ているものもある。
次はフランスから。これはフランスから直接日本に来ている場合と、アメリカ周りの大きく2パターンがあるですね。
次は南米の国、コロンビアから。これはUS経由のものしか無いっすね。何故か一旦ヨーロッパに向かって、その後またアメリカ大陸に来てから…という謎の往復経路もあって面白い。
次はパレスチナからのパケット。これは直接日本に来ているものと、ヨーロッパ、アメリカを経由している2パターンっすね。
これは中国発のパケット。日本に直接来ている物と、アメリカを経由している2パターン。昔はロシア、アメリカ経由の経路が確かあったような気がするけど。
これはイタリア発のパケット。同じくヨーロッパのフランスと同じく、直接来るパターンとUS経由の大きく2パターン。
経路が少ない所を見てみたらウガンダ共和国から来ている物も。インド->US経由と、香港経由の2パターンがあった。
最後にこれはインドから。殆どが直接でヨーロッパ、US経由が少しだけ。
データとして溜められたのは、
IPの位置情報 : 17208
取得した国・地域: 164
アクセスログ : 56799
経路数 : 99985
今見ているインターネットのデータ・パケットは自分と相手で直接やりとりしているんじゃなく、「世界中を駆け巡って色んな国を旅行して来ている」というのが分かる。技術の進歩で、その旅は一瞬で感じられるし気にする事も無いと思う。今この瞬間も世界中をデータが駆け巡っている。そして、自分もデータと一緒に世界中を旅行して回りたいとか思ったった。