IPSecでトンネリングした時なぜrouteが見えないのか

お世話になります。

以下の質問に近い内容となります。
http://tonetsutomu.com/tone/node/152

拠点間をIPsecを用いてトンネリングしてる場合、
仮想的にポイントツーポイントで繋がっているのは理解しますが、
実際はインターネット上の様々なルータを通して繋がりますよね。

実際に拠点AにあるWindowsクライアントから拠点Bにあるサーバに対してtracertすると、
ゲートウェイを通過した直後にサーバへ到達できたように結果が返りました。

ここの技術的な部分についてお伺いしたいです。
なぜ途中の経路のルータはトレースされないのでしょうか?

よろしくお願いいたします。

名前: 
匿名希望
日時: 
20/05/12 22:59

コメント

匿名希望さん
こんにちは

> http://tonetsutomu.com/tone/node/152

答えは、こちらのページに書いてあることと一緒ですが、
もう一度整理し直してみましょう。

まず、IPsecは動作モードが2種類あって、
パケットの形が違いますし、
tracerouteでの見え方も違います。

(a)トンネルモード
 元のパケット全体を暗号化してカプセル化する
(b)トランスポートモード
 ヘッダ以後を暗号化して、カプセル化しない

普通、IPsecを用いて拠点間を接続する場合は
(a)に該当すると思います。
そして、カプセル化すると、暗号化の有無に関わらず、
tracerouteでトンネル内のルータは全く見えなくなります。
で、こちらの場合、本題は、IPsec云々ではなくて、
カプセル化すると、なぜ見えなくなるの?
という話になります。

カプセル化は、一つのパケットを丸ごと
別のパケットのデータ部分に格納して運ぶ方法です。
これを使うとき、トンネルの入り口でカプセル化して(カプセルの中に入れる)
出口でカプセルから取り出します。
すると、入り口から入ったパケットが
そっくりそのまま出口から出てきます。
この動きは、通信回線の入り口で
パケットを電気や光の信号に変換したものが
通信回線の出口で信号から元のパケットに戻り、
パケットがそのまま通信回線の先に届く、
という動きと同じです。
つまり、カプセル化で作ったトンネルは
通信回線と同じものになるわけです。
だから、通信回線の中身がtracerouteで見えないのと同様に
トンネルの中にあるルータも見えなくなります。
これはカプセル化に起因する性質なので、
カプセル化を用いてパケットを運べば、そうなります。
IPsec以外にも当てはまる、ということですね。

次は(b)の場合ですが、
こちらはパケットのデータ部分が
暗号化される格好になります。
原則として、パケットを中継する機器は
パケットのデータ部分に何が入っているか関知しませんから、
その部分の暗号化はパケット配送動作には影響を与えません。
普通のパケットを同じように考えればよい、ということですね。
結局、tracerouteで見えるか否かは
途中のルータの設定次第になります。
つまり、ICMPを返すかどうかで
tracerouteで見えるものもあれば、
見えないものもある、という結果になります。

お世話になっております。
詳しいご説明ありがとうございます。

本件、(a)についてとなります。
以下、確認させて頂けますでしょうか。

トンネルに入るため、拠点AのVPNルータがカプセル化したとこによって
それ以降の経路のインターネット網(拠点間NW)に抜けたパケットは
自分が送信した生パケットと相違している
 →ICMPは返ってこない(返ったとしても拠点のVPNルータ止まり?)
送信先に到達した時(トンネルを抜けた先の拠点BのVPN)カプセル化が解除され、初めてICMPが返ってくる
 →結果、直で繋がっているように見える

【拠点A-クライアントPC】生パケット
 ↓
【拠点A-VPNルータ】カプセル化
 ↓
【インターネット網】カプセル化されたパケット(見た目は生パケットとは完全に別物)
 ↓
【拠点B-VPNルータ】カプセル化解除
 ↓
【拠点B-サーバ】生パケットそのまま(A拠点から直接来たように見える)

このような認識でしょうか?

稚拙な文章で大変恐縮ですが、よろしくお願いいたします。

まず、tracerouteの仕組みから説明しましょう。
IPにはパケットの生存期限を管理する仕組みがあります。
具体的には、IPヘッダのTTLという欄に
送信側で適当な値(実際の値は実装によって違います)を入れて送信し
ルータで中継する際にカウントダウンして、
TTLがゼロになったら、パケットは期限切れなので廃棄する、というものです。

tracerouteはこの仕組みを利用しています。
まず、TTLに1を入れてパケットを送ります。
すると、最初のルータで期限切れになり、
そこからパケット廃棄を知らせるICMPが返ってきます。
その送信元アドレスを見ることで、最初のルータのIPアドレスが分かります。
以後、TTLを2,3,4,5...と増やしていけば、
2番目、3番目...というように手前から順にルータのIPアドレスが分かります。
それを順番に表示するのがtracerouteです。

次はカプセル化の仕組みです。
カプセル化はパケットを丸ごと全部(ヘッダとデータの両方)
別のパケット(カプセル化用パケットと呼びましょう)のデータ部分に入れて運ぶ仕組みです。
その姿は下のようなイメージになります。

| カプセル化用パケットヘッダ(A) | tracerouteのヘッダ(B) | tracerouteのデータ(C) |

そして、このパケットを中継するルータは
カプセル化パケットのデータ部分(上のBとC)をビットの塊として認識するだけで、
その内容は関知しません。

このパケットがトンネルを流れるとどうなるか。

トンネルの入り口のルータがn番目とすると、
TTL=nにしてパケットを送信すると
パケットは入り口のルータで廃棄され、
返ってきたICMPから入り口のルータのIPアドレスが分かります。
次、TTL=n+1のパケットを送信すると
TTL=n+1のパケットはトンネル入り口でカプセル化され、
トンネルを通って出口に届き、そこでカプセル化を解いて元のパケットに戻り、
そのルータ(出口のルータ)がTTLをカウントダウンしてゼロになり、
パケット廃棄してICMPを返送するはずです。
そして、tracerouteの画面には
トンネル入り口のルータの次に出口のルータが表示されます。
tracerouteのパケットの立場から見ると、
トンネル入口のルータ(n番目)の次はトンネル出口のルータ(n+1番目)なのです。
トンネルの中間のルータは見えないというのは、こういうことなのです。

補足すると、
カプセル化されたパケットはTTLカウントダウンの対象にならないのですが、
これをトンネルの中間のルータはTTLをカウントダウンをしない、と誤解してはいけません。
トンネルの中間のルータもTTLのカウントダウンは行います。
ただ、その対象になるTTLは、カプセル化用のパケットのTTL(上記Aの中にある)であって、
データ部分に入れたパケットのTTL(上記Bの中にある)ではない、ということです。

戸根様
お世話になっております。

大変詳しいご説明感謝致します。

「カプセル内のtracerouteのヘッダとデータ中身は中間ルータは読み取れない」
「中間ルータはカプセル自体のヘッダを読む」

納得致しました。
確かに、中間ルータではtraceroute本体のTTLのカウントダウンは実施されませんね。
よく考えれば当たり前のことでした。

自身、混乱を招いていたのは、通信の全体を見すぎていた+tracerouteの仕組みの理解の甘さのようでした。
トンネルの入り口、中間、出口でのパケットの状態をよく考えるべきでした。
反省です。

本当にありがとうござました。

AH