【実務・中級編】 IEEE 802.1QフレームフォーマットとEtherType (0x8100) – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

ネットワークの「神の目」を持つ:IEEE 802.1Qと0x8100が語るVLANの真実

ネットワークエンジニアとして現場に立っていると、上位レイヤー(APIやアプリケーション)のエンジニアから「なぜ通信が通らないのか」と相談を受けることがよくあります。アプリケーション層でパケットの中身を追うのも大切ですが、その土台を支えるL2の世界、特に「タグ」の仕組みを理解していないと、トラブルシューティングは迷宮入りします。

今日は、すべてのVLAN通信の要である IEEE 802.1Q、その核心である 0x8100 について、教科書には載っていない「現場の視点」で深く掘り下げてみましょう。

1. なぜ「タグ」が必要なのか? 0x8100の正体

イーサネットフレームは、本来シンプルです。宛先MAC、送信元MAC、そしてタイプフィールド(EtherType)。しかし、現代のネットワークでは1つの物理スイッチを複数の論理ネットワーク(VLAN)に分割して利用するのが当たり前です。

ここで登場するのが IEEE 802.1Q です。この規格は、イーサネットフレームの送信元MACアドレスの直後に、「私はどのVLANに所属しているか」という名札(タグ)を挿入します。

この名札の先頭に記されているのが TPID(Tag Protocol Identifier)であり、その値が 0x8100 です。

フレーム構造の解剖

通常のイーサネットフレームに4バイトのタグが挿入されることで、合計1522バイトにフレームサイズが拡張されます。これが、MTU(Maximum Transmission Unit)の設定ミスによる断片化や、パケットロスを招く「隠れた原因」になることは、経験者なら一度は泣かされたことがあるはずです。

  • TPID (0x8100): 「これからVLANタグが来るよ」という合図。
  • TCI (Tag Control Information):
  • PCP (3bit): 優先度(QoS)。優先制御の要。
  • DEI (1bit): 輻輳時の破棄優先度。
  • VID (12bit): VLAN ID。0〜4095まで指定可能(0と4095は予約済み)。

2. 現場で遭遇する「タグ」の境界線

Web APIの設計やクラウドインフラを触る際、このタグを意識するのは主に「トランクポート」の設定時です。スイッチのポートを Trunk モードに設定すると、そのポートは複数のVLANを透過させるようになります。

Cisco IOSでの設定例

現場で最もよく見る、ポートをトランク化する際の設定です。

interface GigabitEthernet0/1
 description Trunk Port to Server Farm
 # カプセル化方式をdot1qに強制指定
 switchport trunk encapsulation dot1q
 # トランクポートとして動作させる
 switchport mode trunk
 # 許可するVLANを明示的に指定(セキュリティの基本)
 switchport trunk allowed vlan 10,20,30

ここで重要なのは、switchport trunk allowed vlan の指定漏れです。これが原因で、「特定のAPIサーバーだけが疎通しない」という怪奇現象が発生します。Wiresharkでパケットをキャプチャし、802.1Q Virtual LAN のレイヤーが見当たらない場合、それはスイッチがタグを剥がして(Untagged)送出しているか、あるいはドロップしている証拠です。

3. アプリケーション視点での「パケット観測」

APIエンジニアの皆さんが tcpdump や tshark を使ってデバッグする際、インターフェースにVLANタグが付与されていると、生のパケットキャプチャではタグが見えないことがあります。これは、NICのドライバやOSがタグを「取り除いて」上位層に渡しているためです。

もしLinuxサーバー上でVLANタグそのものを確認したい場合は、仮想インターフェース(vlan10 など)ではなく、物理インターフェース自体をキャプチャする必要があります。

# eth0インターフェースの全トラフィックをキャプチャし、vlanタグ情報を含めて表示
sudo tcpdump -i eth0 -e vlan

Pythonでパケットの断片を扱う際の注意

もしPythonの scapy 等を使ってネットワークツールを自作する場合、Ether 層の直後に Dot1Q 層を挿入する必要があります。

from scapy.all import Ether, Dot1Q, IP, sendp

# VLAN 10のタグ付きパケットを作成する例
# 0x8100はDot1Qクラスにより自動的にセットされます
pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / Dot1Q(vlan=10) / IP(dst="192.168.10.1")

# 送信インターフェースを指定して送信
sendp(pkt, iface="eth0")

4. トラブルシューティングの鉄則

最後に、現場で私が心がけている「タグのトラブル」解決のチェックリストを伝授します。

1. ネイティブVLANの不一致: 対向のスイッチでネイティブVLAN(タグなしで送受信するVLAN)が異なると、セキュリティリスクに加え、通信が不可解な挙動をします。常に明示的に固定しましょう。
2. MTUの不整合: 前述の通り、タグ分(4バイト)のオーバーヘッドでMTUサイズが超過していないか確認してください。特にVPNトンネルを通す場合は要注意です。
3. NICのオフロード機能: 高性能なNICを使用している場合、ハードウェア側でVLANタグの処理(VLAN Offloading)が行われ、OS上のキャプチャで見えないことがあります。困ったら ethtool -K <interface> rxvlan off でオフロードを無効化して確認しましょう。

ネットワークは「目に見えない」からこそ面白い。0x8100 という数字一つが、物理的な線の上で何千もの論理ネットワークを捌いている。このロマンこそが、エンジニアリングの醍醐味だと私は信じています。

皆さんの設計するシステムが、安定したタグ付けのもと、今日もパケットを正確に届けられますように。

コメント

タイトルとURLをコピーしました