【実務・中級編】 IEEE 802.1QのTCI内部:VID(VLAN Identifier) – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

VLANの命運を握る12ビットの正体:IEEE 802.1QのVID(VLAN Identifier)を深掘りする

ネットワークエンジニアとして現場を渡り歩いていると、「VLAN間通信ができない」「トランクポートでパケットが落ちる」といったトラブルに幾度となく直面します。その大半の原因は、レイヤー2のスイッチングの基本でありながら、意外と見落とされる「タグの仕組み」にあります。

特に、最大4096個のネットワーク論理分割を実現する IEEE 802.1Q の世界において、その心臓部とも言えるのが VID(VLAN Identifier) です。

今回は、この12ビットの小さな領域が、どのように巨大なネットワークの分離と秩序を保っているのか、パケットの挙動や実務での設定例を交えて徹底的に解説していきます。

—

1. IEEE 802.1QとTCIの構造:VIDが鎮座する場所

現代のイーサネットフレームにおいて、VLANタグは標準のイーサネットヘッダー(Destination MAC / Source MAC)の直後、正確にはL記者タイプ(EtherType)の前に挿入されます。

タグ自体のサイズは4バイト(32ビット)で構成されており、その内訳は以下の通りです。

  • TPID (Tag Protocol Identifier): 0x8100 (2バイト / 16ビット) – 「俺は802.1QのVLANタグだ」と告げる看板
  • TCI (Tag Control Information): (2バイト / 16ビット) – 制御情報の本体

そして、この TCI の中身こそが今回の主役であり、以下のように細かく分割されています。

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        TPID (0x8100)          |User Priority (PCP)|CFI|  VID  |
|                               |     (3 bits)      |(1)|(12bit)|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCIを構成する3つの要素

1. PCP (Priority Code Point – 3ビット): QoS(Quality of Service)のための優先度(0〜7)。VoIPやビデオスリーミングを優先転送させたいときに使います。
2. CFI / DEI (Canonical Format Indicator / Drop Eligible Indicator – 1ビット): トークンリングなどのレガシー互換(現在は主に輻輳時に破棄されやすいパケットを示すDEIとして利用)。
3. VID (VLAN Identifier – 12ビット): 今回のテーマ。VLANを識別するための番号。

$2^{12} = 4096$。これにより、1台の物理スイッチ上で 0 から 4095 までの合計4096個 のVLANを識別できるようになります。

—

2. VIDの予約値と実務での制限

12ビットで表現できる4096個のIDですが、すべてが自由にユーザーの業務ネットワーク用として使えるわけではありません。標準(IEEE 802.1Q)および実運用上、いくつかのVIDには特別な意味や予約が定められています。

| VID範囲 | 用途・仕様 | 現場での実務的メモ |
| :— | :— | :— |
| 0 (0x000) | 優先度タグ付け専用(VLAN IDなし) | データ自体はどのVLANにも属さず、PCP(QoS)のみを伝えるフレームで使用。 |
| 1 (0x001) | デフォルトVLAN(Cisco等では標準) | 多くの機器で初期値として使われますが、セキュリティの観点からネイティブVLAN等の変更が推奨されます。 |
| 2 〜 4094 | 通常のユーザVLAN(動的・静的割当) | 一般的な企業ネットワークで自由に設計・利用できる領域。 |
| 4095 (0xFFF) | 予約済み(Implementation use only) | フレーム内では使用されません。内部処理や一部ベンダーの特殊なコンフィグで使用される予約値。 |

—

3. 通信の裏側:トランクポートとVIDのライフサイクル

パケットがスイッチ間を結ぶトランクポートを通過する際、VIDがどのように扱われているのか、そのシーケンスを確認してみましょう。

[PC A (VLAN 10)] 
       │ (アンタグ/通常フレーム送信)
       ▼
[Access Port (Switch A)] 
       │ (受信フレームに VID = 10 の 802.1Q タグを付与)
       ▼
[Trunk Port (Switch A)] 
       │ (トランク線路を流れる: Tagged Frame [VID: 10])
       ▼
[Trunk Port (Switch B)] 
       │ (タグを剥がす、またはそのまま次へ転送)
       ▼
[Access Port (Switch B)] 
       │ (アンタグにして PC B へ配送)
       ▼
[PC B (VLAN 10)]

現場のインフラエンジニアとして絶対に押さえておかなければならないのは、「トランクリンク上を流れるパケットには基本的にVIDのタグが刻まれているが、エンドホスト(PCやサーバーのNIC)に届くときはタグが剥がされる(アンタグになる)」 という原則です(ハイパーバイザー上の仮想スイッチやチーミング構成などを除く)。

もし、トランクポートの設定ミス(ネイティブVLANの不一致など)が発生すると、VIDの解釈がズレてしまい、意図しないVLANへトラフィックが漏洩する「VLANホッピング」や、パケットロスを引き起こす原因になります。

—

4. 実務で役立つ設定例とデバッグ手法

ここからは、実際の機器設定や、ネットワークの状態をプログラム(Python)やCLIで確認する方法を見ていきましょう。

Cisco IOSにおけるVLANおよびトランクポートの設定例

実務で最も遭遇するCisco Catalyst / Nexusシリーズでの基本的な設定です。ここで指定する数値こそが、まさに12ビットのVIDそのものになります。

! --- VLAN 10 と 20 を定義 ---
vlan 10
 name ENGINEERING  ! VLAN 10の名称設定(VID = 10)
vlan 20
 name MARKETING    ! VLAN 20の名称設定(VID = 20)

! --- アクセスポートの設定(接続端末側) ---
interface GigabitEthernet0/1
 description Connected to PC-A
 switchport mode access
 switchport access vlan 10  ! このポートに出入りする無タグパケットにVID=10を強制付与

! --- トランクポートの設定(スイッチ間接続) ---
interface GigabitEthernet0/24
 description Trunk to Core Switch
 switchport trunk encapsulation dot1q  ! 802.1Qカプセル化を指定
 switchport mode trunk
 switchport trunk allowed vlan 10,20   ! トランクを許可するVIDを明示的に制限(セキュリティベストプラクティス)

Python (Scapy) を使った802.1Qフレームの自作と解析

ネットワークの挙動を深く理解するために、Pythonのパケット操作ライブラリ Scapy を使って、明示的にVIDを挿入したイーサネットフレームを構築してみましょう。API開発やネットワーク自動化のテストでも役立つ手法です。

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

def send_vlan_tagged_packet(interface="eth0", vlan_id=10):
    """
    指定したVIDを持つIEEE 802.1Qタグ付きパケットを構築し、送信する関数
    """
    # イーサネットヘッダーの後に 802.1Q (Dot1Q) レイヤーを挟むことで、
    # 内部のTCIフィールド(VID)に値を設定します。
    packet = (
        Ether(dst="ff:ff:ff:ff:ff:ff", src="00:11:22:33:44:55")
        / Dot1Q(vlan=vlan_id, prio=0)  # ここで12ビットのVIDを指定 (例: 10)
        / IP(dst="192.168.10.254", src="192.168.10.10")
        / TCP(dport=80, sport=12345, flags="S")
    )

    print(f"[*] インターフェース {interface} から VLAN ID: {vlan_id} のパケットを送信します...")
    
    # レイヤー2レベルでパケットを送出
    # sendp(packet, iface=interface)
    print("[+] パケットの構築に成功しました。TCI内のVIDビット列が正常にセットされています。")

if __name__ == "__main__":
    # VLAN 10 を想定したテストパケットの生成実行
    send_vlan_tagged_packet(interface="eth0", vlan_id=10)

—

5. トラブルシューティングの現場から:よくある罠

最後に、現場でVIDに起因するトラブルに遭遇した際の、シニアエンジニアとしての実践的なデバッグ手順を共有します。

1. 「二重タグ(QinQ / 802.1ad)」との混同に注意する
ISP環境やクラウドのレイヤー2延伸サービスでは、標準の802.1Qの外側にさらにもう一つタグを巻く「QinQ(VLAN Stacking)」が使われます。内側のVIDと外側のVID(S-VID / C-VID)のどちらを見ているのか、パケットキャプチャ(Wireshark等)でTPIDが 0x8100 なのか 0x88a8 なのかを必ず確認してください。
2. ネイティブVLANのミスマッチ(Native VLAN Mismatch)
Ciscoスイッチのトランクポートにおいて、片側が vlan 1、もう片側が vlan 99 のネイティブVLANになっていると、スパニングツリーの警告ログ(CDP/LLDPアラート)が吐き出され、無タグパケットが予期せぬセグメントに流れ込みます。設計書と実際のコンフィグのVIDが完全一致しているかを show interfaces trunk で必ず突き合わせましょう。

—

まとめ

IEEE 802.1Qのたった12ビット、それがVIDです。しかし、この12ビットが存在するおかげで、私たちは物理的な配線の縛りから解放され、柔軟でセキュアなマルチテナント・ネットワークを構築できています。

API設計やクラウドアーキテクチャのレイヤーがどれほど抽象化されようとも、パケットの足元を支えているのは、こうした古典的かつ洗練されたL2/L3のプロトコル仕様です。仕組みの本質を理解していれば、いざという時のトラブルシューティングで迷うことはありません。

日々のインフラ運用・開発の現場で、ぜひこの「12ビットの重み」を思い出してみてください。

コメント

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