調べる経緯
WarpをONにした状態で8.8.8.8と1.1.1.1へtracertコマンドを打鍵すると、1.1.1.1に対するホップ数がワンホップとなる。
※ちなみにWarpを使わず1.1.1.1にtracertをするとワンホップにはならない。
以下の図がWarpをONにした状態で8.8.8.8と1.1.1.1に対してtracert打鍵した結果だ。
(tracertの途中経路とローカルのフォルダ名はグレーで網掛けしている。)
Warpを使っているからワンホップというのはなんかおかしいということは分かる。
インターネットは色々なネットワークが接続して構成されているものであるため、同じネットワークに所属していない限りワンホップとはならないはずだからだ。
だが、何故このような違いが起きているのかということを(具体的には何故ワンホップなのか)を自分でちゃんと説明できないなと思った。
そのため、一つずつ要素を確認しながら理解・説明できるようになりたいというのがこのブログ記事の主旨である。
Warpとは
Warpは、CDNやDNSサービスを提供するCloudflare社により提供されるアプリで、VPNサービスの一部を提供する。
VPNサービスと言っても、従来のVPNサービスと異なり通信の匿名化というよりも、プライバシーやパフォーマンスに力点を置いたものとなっている。
また、内部の技術としてはWireGuardという、UDPを用いたモダンなVPN用プロトコルによってVPNトンネルを構築している。
tracertコマンドとは
コマンドの引数として指定した目的地での間に、どのルータを経由しているのかを知ることができるコマンドである。
以下の図ように、IPパケットのTTL値を設定してパケットを送信し、ルータにたどり着く度にカウントを1減らす。
TTLが0になると、パケットの破棄通知が行われる。
この破棄通知によってカウントが0になった先のルータの情報が手に入る。
これをコマンドの引数として指定した目的地に到達するまで、TTLに設定する初期値を増やしながら行う。
そうすることで、目的地までにどのようなルータがいるかを知ることができるというわけだ。
TTLとは
IPパケットに設定される値で、最大転送回数を表す。
ネットワーク上でパケットが永遠にループしないように設定されている。
ルータなどの機器を経由するごとに値が1減少する。
IPアドレス「8.8.8.8」「1.1.1.1」とは
どちらも誰でも使用できるパブリックDNSサーバと呼ばれるもので、
「8.8.8.8」はGoogleが提供しており、「1.1.1.1」はCloudflare社が提供している。
事象の整理
以上を踏まえて、今回何故1.1.1.1に接続した際にワンホップだったのかを整理したい。
以下の図を見てほしい。
まず、送信元にてtracertコマンドが打鍵される。
すると、WarpのWireGuardによってtracertコマンドのTTLを含むパケットがカプセル化される(このTTLを内部TTLと呼ぶことにする。)。
そしてカプセル化パケットが目的地のネットワークに運ばれ、カプセル化が解除される。
カプセル化が解除されると、出てくるのは内部TTLを含むパケットだ。
すなわち、内部TTLのカウントは目的地のネットワークから開始される。
Warpを使用している場合、VPNの終端は1.1.1.1と同じネットワークに属するCloudflareのVPNサーバとなる。
そのためtracertを1.1.1.1に向けて打鍵するとホップ数がワンホップになり、8.8.8.8 の場合はCloudflareのVPNサーバ以降も複数のネットワークを経由しなければならなかったため、ホップ数が複数になったと理解できる。
図の補足
- カプセル化されたパケット自体もTTL値は持っている(外部TTL)ので、TTL値がカウントされる。
- 図にはないが、帰りのパケットもWireGurdによってカプセル化され、外部TTLがカウントされつつも、内部のTTLは減らない
まとめ
各要素から、何故Warpを使用して1.1.1.1にtracertを打鍵するとワンホップになるのかを考えてみた。
結論として、tracertによって設定されたTTLを含むパケットが、Warpによってカプセル化されて、1.1.1.1のCloudflareのネットワークまで届くためである。
と考えることができた。
最後に
色々調べて整理したものの、実際にCluoudflareのネットワークがどうなっているのか、Warpのアプリどうなっているかは分からないので、各要素と外から見た感じから考えるとこうだよね、という整理をした。
そのため実は間違っているということもあるかもしれない。
その場合は是非、「ここはこうだよ」等指摘して頂けると助かる。