VLANの深淵を覗く:802.1Qタグが語るパケットの「身分証明書」
ネットワークエンジニアとして現場に立っていると、「VLANはスイッチの設定画面でポチポチ選ぶだけのもの」と誤解している若手に遭遇することがあります。しかし、LANケーブルを流れる電気信号の正体、つまりイーサネットフレームの構造を知らなければ、大規模障害の切り分けや、クラウド環境でのパケットロスという「見えない敵」には勝てません。
今日は、IEEE 802.1Qのタグヘッダー、特にその4バイトの中に詰め込まれた「パケットの身分証明書」について、現場の視点から掘り下げて解説します。
1. 802.1Qタグの構造:4バイトの小さな巨人
標準的なイーサネットフレーム(Ethernet II)に、VLAN情報を付与するための「タグ」を挿入する。これが802.1Qの基本です。本来、イーサネットヘッダーのType/Lengthフィールド直後に挿入されるこの4バイトは、パケットの運命を決定づけます。
タグの構成要素
- TPID (Tag Protocol Identifier): 2バイト。
0x8100が固定値です。受信側のスイッチは、この値を見て「あ、このフレームはVLANタグ付きだ」と判断します。 - TCI (Tag Control Information): 2バイト。ここが重要です。
- PCP (Priority Code Point): 3ビット。QoS(CoS値)を決定します。音声や動画の優先制御に使われます。
- DEI (Drop Eligible Indicator): 1ビット。輻輳時に「捨ててもいいパケット」かどうかを判定します。
- VLAN ID (VID): 12ビット。0〜4095の範囲でVLANを識別します。
0と4095は予約済みのため、実質は4094個のVLANが利用可能です。
2. なぜ「TPID=0x8100」が重要なのか?
トラブルシューティングで最も恐ろしいのは「タグ不一致」です。対向のスイッチやサーバー(NIC)が、このTPIDを正しく認識できない場合、パケットは「壊れたフレーム」として破棄されます。
特に厄介なのは、Q-in-Q(Double Tagging)環境や、一部のキャリアイーサネットで用いられる0x88a8(Service Tag)との混在です。パケットをキャプチャしてWiresharkで確認する際、Typeフィールドが正しくデコードされているか、必ず確認してください。
# tcpdumpでVLANヘッダーを確認する場合のコマンド例
# -e オプションでリンクレイヤーヘッダーを表示させるのが定石です
tcpdump -i eth0 -e vlan
3. 実務で遭遇する「タグ付きフレーム」の罠
開発者がWeb APIの疎通確認を行う際、「なぜかパケットが届かない」という状況に陥ることがあります。多くの場合、原因は「物理インターフェース(Access Port)」と「トランクポート(Trunk Port)」の取り違えです。
LinuxサーバーでのVLANインターフェース設定(例)
Linux上でVLANを扱う場合、カーネルの8021qモジュールが必要です。
# VLANインターフェース作成の例(VLAN ID: 100)
# eth0.100 という論理インターフェースを生成します
ip link add link eth0 name eth0.100 type vlan id 100
# インターフェースを有効化
ip link set dev eth0.100 up
# 設定状況を確認
ip -d link show eth0.100
4. API設計者へのメッセージ:L2の視点を忘れないで
Web APIの設計において、HTTPヘッダーのX-VLAN-IDなど、アプリケーションレイヤーで独自にVLAN情報を付与するケースを見かけます。しかし、ネットワークインフラ側で802.1Qタグを扱う場合、アプリケーション層からはその下のL2ヘッダーは見えません。
もし、インフラ運用の現場でパケットが「VLANタグ付き」で届くのか「タグなし(Untagged)」で届くのか不明な場合は、Pythonで簡易的なパケットキャプチャを行い、scapyライブラリで解析することをお勧めします。
from scapy.all import sniff, Dot1Q
def packet_callback(packet):
# パケットが802.1Qタグを持っているかチェック
if packet.haslayer(Dot1Q):
vlan_id = packet[Dot1Q].vlan
print(f"Detected VLAN ID: {vlan_id}")
# 指定インターフェースでキャプチャ開始
sniff(iface="eth0", prn=packet_callback, count=10)
5. まとめ:トラブルシューティングの極意
VLAN周りのトラブルに直面したとき、私は必ず以下の3点を確認します。
1. ネイティブVLANの不一致: トランクポートで片方が「タグなし」をVLAN 1として扱い、もう片方がVLAN 99として扱っていないか。
2. MTUサイズの問題: 4バイトのタグが挿入されることで、MTU(最大転送単位)が超過していないか(Jumbo Frameの考慮)。
3. TPIDの不整合: ネットワーク機器のベンダー独自仕様で、TPIDが0x8100以外になっていないか。
ネットワークは「正直」です。パケットは嘘をつきません。Wiresharkやtcpdumpが出力する生のデータこそが、現場の真実です。仕様書を読み込み、パケットの「身分証明書」を正しく読めるようになること。それが、ネットワークスペシャリストへの第一歩です。
皆さんのインフラが今日も安定して稼働することを願っています。何か不明な点があれば、いつでもパケットダンプを片手に相談に来てください。
コメント