Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

カプセル化・トンネル

Status: draft

VXLAN / GRE / NVGRE / MPLS / MPLS-in-UDP / L2TPv2・v3 / GTP-U / Geneve / IP-in-IP の補足です。定義は crates/wpg-protocols/src/encap.rs、サンプルは templates/protocols/encap/ にあります。

到達経路とサンプル

idプロトコル下位レイヤ上位レイヤサンプル
vxlanVXLANUDP 4789ethernet2vxlan.wpg.yaml
geneveGeneveUDP 6081protocol_type で選択geneve.wpg.yaml
greGRE (基本 4 オクテット)IPv4 protocol / IPv6 next header 47protocol_type (IPv4 / IPv6 / 0x6558 Ethernet / MPLS)gre-ipv4.wpg.yaml
nvgreNVGREビルド専用 (IP protocol 47 のデコードは gre)ethernet2nvgre.wpg.yaml
mplsMPLS ラベル 1 段EtherType 0x8847 / 0x8848、GRE、UDP 6635 (MPLS-in-UDP)s = 0 なら次の mpls、s = 1 なら先頭ニブルで IPv4 / IPv6mpls-ipv4.wpg.yaml、mpls-in-udp.wpg.yaml
l2tpv2L2TPv2UDP 1701本体は不透明l2tpv2.wpg.yaml
l2tpv3L2TPv3 over IPIPv4 protocol 115本体は不透明l2tpv3.wpg.yaml
gtpuGTP-U (必須 8 オクテット)UDP 2152先頭ニブルで IPv4 / IPv6gtpu-ipv4.wpg.yaml
—IP-in-IP / 6in4IPv4 protocol 4 → ipv4、41 → ipv6—ipip.wpg.yaml、6in4.wpg.yaml

IP-in-IP 用の専用プロトコルはありません。ipv4 の上に ipv4 (または ipv6) を積むだけで、外側の protocol は Auto で 4 (41) になります。

Auto になるフィールド

  • gre.protocol_type、geneve.protocol_type: 次のレイヤから決まります。
  • gtpu.length: GTP-U ヘッダ以降の長さ。
  • mpls.s (bottom-of-stack): 次のレイヤが mpls なら 0、それ以外なら 1。ラベルを重ねるには mpls レイヤを必要な段数だけ積みます。
  • 外側の UDP 宛先ポート・EtherType・IP protocol は、上に積んだレイヤから Auto で決まります。

制約と近似

  • GRE のチェックサム / キー / シーケンス番号は対応するフラグが立ったときだけ存在しますが、エンジンには「存在条件付きフィールド」がありません。gre は基本の 4 オクテット (flags + protocol type) のみで、フラグを立てても追加フィールドは生成されません。キー付き GRE の代表例である NVGRE には専用の nvgre (Key ビット既定オン、vsid + flow_id) を使ってください。nvgre はビルド専用で、受信したパケットを解析すると gre としてデコードされ、キーの 4 オクテットは内側フレームの先頭として誤って読まれます。それ以外のオプションが必要な場合は、gre の直後に raw レイヤで値を置き、フラグを手動で立てます。
  • MPLS 疑似ワイヤ: 最下段ラベルの下はペイロードの先頭ニブルで判別します (4 → IPv4、6 → IPv6)。コントロールワードや Ethernet 疑似ワイヤには判別できる印がないため、デコードでは raw になります。ビルド時は ethernet2 を明示的に積んでください。
  • GTP-U の任意フィールド (シーケンス番号、N-PDU 番号、拡張ヘッダ。E/S/PN フラグで存在) は表現されません。
  • Geneve のオプションはヘッダが 3 ビットのフラグ + 5 ビット長と 1 オクテット未満の幅を含むため、opt_len で大きさが決まる不透明な options 領域です。
  • L2TPv2 / v3 のヘッダは種別 (制御 / データ) とフラグで存在するフィールドが大きく変わるため、本体は不透明なバイト列です。

自動生成リファレンス

このページのプロトコルのフィールドリファレンス (定義から自動生成):

ethernet2 · ipv4 · ipv6 · vxlan · gre · nvgre · mpls · gtpu · geneve · l2tpv2 · l2tpv3 · raw