VPNパケットのチェックサムはいくつか?状況による
数はIPのバージョン、運ばれるトランスポートプロトコル、保護形式によって変わる。ヘッダーチェックサム、上位層のチェックサム、整合性タグは別物だ。
VPNパケットがチェックサムをちょうど二つ運ぶという主張は整って聞こえるが、崩してみる価値があるほど頻繁に誤りだ。数はどのIPバージョンが現れるか、どのトランスポートプロトコルが運ばれるか、トンネルがどの保護形式を使うかで変わる。ヘッダーチェックサム、上位層のチェックサム、暗号学的な整合性タグは、三つの範囲を持つ三つの仕組みである。数えるにはまず、それぞれが何を覆うかを印づける。
実際に回線上にあるIPバージョンを確認する
IPv4ヘッダーは16ビットのヘッダーチェックサムを運び、IPv6ヘッダーはその種のものを何も運ばない。この一つの事実がすべてのトンネルで数を変えるのは、IPv4をIPv6の内側に包む場合とIPv6をIPv4の内側に包む場合とでは、できる文書が違うからだ。トンネルは両方の系列を同時に運ぶことがあり、その場合、一方の方向にだけ存在するフィールドがありうる。何かを数える前にバージョンを確定しよう。
レイアウトは図ではなくヘッダーの一覧として書く。キャプチャーを読むときには順序が重要であり、チェックサムフィールドの有無が最初に印づけるべきものだ。
outer IPv6 | ESP | inner IPv6 | UDP | application data
outer IPv4 | ESP | inner IPv4 | TCP | application data
一行目はIPヘッダーのどこにもIPヘッダーチェックサムを持たないが、二行目は両方のヘッダーがIPv4のとき二つ持つ。同じトンネル技術でも数は違い、どちらの行も完全な回線形式ではない。
各チェックサムが何を覆うかを確認する
範囲は人が飛ばしがちな部分であり、数の意味を決めるのはまさにそこだ。IPv4ヘッダーチェックサムはヘッダーだけを守り、その後ろのペイロードについては何も語らない。IPv6上のUDPチェックサムは疑似ヘッダーに加えてUDPヘッダーとペイロードを覆うので、データグラムがトンネル化されると運ばれるパケットの内部まで届く。TCPには同様の疑似ヘッダー依存を持つ独自のチェックサムがある。三つともチェックサムと呼ばれるが、範囲は三つとも異なる。
RFC 791はIPv4ヘッダーの検査と各ホップでの再計算を定め、RFC 8200は疑似ヘッダーを含むIPv6上の上位層の扱いを定めている。どちらの文書も、VPNパケットが固定の数のチェックサムを持つとは述べておらず、どちらもトンネルを記述していないからだ。
tshark -r capture.pcap -Y "ip.proto == 50" -V | grep -i checksum
整合性保護は別に確認する
ESPの整合性は独自の範囲とアルゴリズム依存の表現を持つ暗号学的保護である。別名のIPやUDPのチェックサムではなく、長さは選んだ構成によって変わる。整合性検査はパケットの定められた部分を覆い、使うモードによってはESPヘッダーとペイロードの一部を含むことがある。これを既知の幅のチェックサムフィールドとして数えるところで、こうした説明の多くは崩れる。
バイトを数える前に選んだ構成を読み、結果を別のラベルのチェックサムではなく整合性保護として述べる。頼めばデコーダーがフィールド名を教えてくれる。
tshark -r capture.pcap -Y esp -V | grep -iE "integrity|icv"
数える前に観測点を確認する
内側インターフェースでのキャプチャーと回線上でのキャプチャーは、まったく違う層を見せることがある。内側インターフェースではトンネルがすでに外されており、運ばれるパケットが見え、外側のヘッダーは一つも見えない。回線上では外側のヘッダーと、読めない暗号化されたペイロードが見える。どちらの見方も誤りではなく、同じ対象の見方でもない。数を引用する前に、どこでキャプチャーしたかを述べる。
sudo tcpdump -ni eth0 -vv -c 5 esp
sudo tcpdump -ni tun0 -vv -c 5
最初のコマンドは外側のパケットを整合性トレーラーとともに示し、二番目は運ばれるパケットをそれ自身のトランスポートチェックサムとともに示す。二つのキャプチャーの数値を足しても二重に数えることにはならないが、同じパケットを二度説明することになる。
数を実際のキャプチャーと突き合わせる
一つのパケットを完全にデコードし、デコーダーがチェックサムまたは整合性の値と呼ぶフィールドをすべて印づける。次に各印を自分が書いたレイアウトと比べ、実際には数えていない層に属するものを消す。その作業を生き残った数は弁護できるが、記憶から引用した数はそうではない。
両方の系列を運ぶトンネルは方向ごと、フローごとに違いうるので、応答方向についても繰り返す。そのうえで、たとえばこの観測点におけるこの内側パケットのチェックサムは三つ、という形で数を範囲とともに述べ、VPNパケット一般の性質として述べてはならない。
tshark -r capture.pcap -T fields -e ip.checksum -e udp.checksum -e tcp.checksum