ネットワークの「神の目」を持つ: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 という数字一つが、物理的な線の上で何千もの論理ネットワークを捌いている。このロマンこそが、エンジニアリングの醍醐味だと私は信じています。
皆さんの設計するシステムが、安定したタグ付けのもと、今日もパケットを正確に届けられますように。
コメント