STUDY · NETWORK GUIDE

2-4 Trunk と 802.1Q

1 本のリンクで複数 VLAN のフレームを運ぶトランク構成と 802.1Q タグの仕組み。スイッチ間で VLAN を共有する設定と CAM テーブルへの遠端 MAC 学習を実機で確認する。

1. Trunk とは

前節 2-3 では、1 台のスイッチを VLAN で論理的に分割し、アクセスポートが 1 つの VLAN にだけ所属することを確認しました。アクセスポートはその VLAN のフレームしか送受信せず、フレームには VLAN を識別する情報も付きません。物理ポートと VLAN が 1 対 1 に対応する、シンプルな関係です。

トランクポート はこの前提を覆します。1 本のリンクで複数 VLAN のフレームを同時に運ぶためのポート種別で、運ぶフレーム 1 つひとつに 802.1Q タグ と呼ばれる 4 バイトの識別子を挿入し、受け取った側がそのタグを見て「このフレームは VLAN 10 のもの」「これは VLAN 20」と仕分けします。アクセスポートが 1 VLAN 専属だったのに対し、トランクポートは複数 VLAN を多重化する管です。

検証トポロジ


2. Trunk が必要となる状況

スイッチが 1 台で完結するなら、VLAN 機能だけで論理分割は十分に成立します。問題はスイッチが複数になった瞬間に発生します。たとえばフロアの東西に SW1 と SW2 を置き、両方に VLAN 10(USERS)と VLAN 20(GUESTS)の端末が混在している状況を考えます。素直にやれば「VLAN 10 用のケーブル 1 本」「VLAN 20 用のケーブル 1 本」と VLAN の数だけスイッチ間を結ぶことになります。VLAN が 4 つあれば 4 本、10 個あれば 10 本です。

これでは現実的ではありません。トランクを使えば、スイッチ間は 1 本 で済みます。VLAN を増やしてもケーブル本数は変わりません。利点をまとめると以下のとおりです。

  • スイッチ間の VLAN 共有: 別筐体に同じ VLAN を分散して配置できる構成。SW1 の VLAN 10 と SW2 の VLAN 10 は、トランク越しに同一のブロードキャストドメインを構成。
  • 配線本数の節約: VLAN を何個増やしても、トランク 1 本でカバー可能。
  • 設計柔軟性: 端末の所属 VLAN は物理結線とは無関係に決められる仕組み。組織変更が起きてもパッチパネルを引き直す必要なし。

トランクは「VLAN は L2 で隔離する」という 2-3 の規律を保ったまま、その隔離されたドメインを複数のスイッチに 拡張する ための道具です。


3. 802.1Q タグの構造

トランクで運ばれるフレームには 802.1Q (IEEE 802.1Q) のタグが挿入されます。普通の Ethernet フレームの「宛先 MAC」「送信元 MAC」の直後、Type/Length フィールドの手前に、4 バイトの領域が挿入される形になります。

802.1Q タグの挿入位置と 4 バイトの内訳 (各サブフィールドにホバーで詳細表示)

4 バイトの内訳は以下の 2 つに分かれます。

  • TPID (Tag Protocol Identifier、2 バイト): 値は固定で 0x8100。後ろに続く 2 バイトがタグであることを示すマーカーで、受信側はこの値を見てタグ付きフレームと識別。
  • TCI (Tag Control Information、2 バイト): タグの中身。さらに 3 つのサブフィールドに分かれる。
    • PCP (Priority Code Point、3 bit): QoS 用の優先度。0〜7 の 8 段階。
    • DEI (Drop Eligible Indicator、1 bit): 輻輳時に優先的に破棄してよいかを示すフラグ。
    • VID (VLAN Identifier、12 bit): VLAN ID 本体。12 bit なので理論上 0〜4095 を表現でき、実用 VLAN ID は 1〜4094 (0 と 4095 は予約)。

受信側はフレームを受け取ったらまず TPID を見て「これはタグ付き」と判断し、TCI の VID を取り出してから当該 VLAN のテーブルでフォワーディングを行います。タグはスイッチ内部での仕分けにだけ使われ、最終的にアクセスポートから端末側へ送出される時には剥がされます。端末側はタグの存在を意識する必要がありません。


4. Native VLAN

トランクには 1 つだけ例外があります。タグが付いていないフレーム が流れてきたときに、それをどの VLAN として扱うかという規則です。この「タグなしフレームを乗せる VLAN」を Native VLAN と呼びます。既定では VLAN 1 です。

タグなしフレームが流れる主な状況は 2 つあります。1 つは、相手側がトランクをサポートしない旧装置で、そもそもタグを付けずに送ってくるケース。もう 1 つは、自スイッチが VLAN 1 (既定の Native VLAN) のフレームを送出する際、敢えてタグを外して送る挙動です。前節 2-3 で扱った VLAN 1 がほぼ「素のフレーム」と等価に振る舞うのは、この Native VLAN の仕組みが背景にあります。

Native VLAN で注意すべきは 両端の不一致 です。SW1 側のトランク Native VLAN が 1、SW2 側が 99 という状態でリンクすると、SW1 が VLAN 1 のつもりでタグなしで送ったフレームを、SW2 は VLAN 99 のフレームとして受け取ってしまいます。VLAN ホッピング攻撃 (dot1q double tagging) の前提条件にもなるため、運用上は両端で一致させ、かつ未使用の VLAN を Native に割り当てる (VLAN 1 を業務に使わない) のが定石です。show interfaces trunkNative vlan 列で常時確認できます。


5. CML での検証

検証は CML (Cisco Modeling Labs) 2.9 上で、IOSv L2 (Classic IOS 15.2) の iosvl2 イメージ 2 台で実施しました。

本来は L2 章全体を Cat9000v (IOS-XE) で統一する方針ですが、Cat9000v × 2 ノードを同時起動すると CML ホスト (nuc1) の 60 GB RAM では OOM kill されました。本節は軽量な iosvl2 で代替しています。switchport / trunk 系のコマンド文法は IOS-XE とほぼ同一ですが、1 点だけ注意があります。switchport trunk encapsulation dot1q は ISL と 802.1Q を選べた旧来プラットフォーム向けのコマンドで、Cat9000v / Catalyst 9000 系 (IOS-XE 17.x) では 802.1Q のみ対応のため、このコマンド自体が存在しません。Cat9000v では switchport mode trunkswitchport trunk allowed vlan ... だけでトランクが構成でき、encapsulation 行は不要です(本節の iosvl2 では旧文法として残っているため記載しています)。

トポロジは前出の図のとおりで、SW1 と SW2 を Gi0/3 同士で結び、両端を 802.1Q トランクに設定しています。各スイッチには VLAN 10 (USERS) と VLAN 20 (GUESTS) の PC を 2 台ずつ収容し、PC1 (192.168.10.10) と PC3 (192.168.10.30) は VLAN 10、PC2 (192.168.20.20) と PC4 (192.168.20.40) は VLAN 20 でそれぞれ同 VLAN の peer へ 30 秒周期で ping を打ち続けています。

SW1 のトランク関連 config 抜粋は以下のとおりです。

snippet
vlan 10
 name USERS
vlan 20
 name GUESTS
!
interface GigabitEthernet0/3
 description Trunk to peer
 switchport trunk encapsulation dot1q
 switchport mode trunk
 switchport trunk allowed vlan 10,20
 no shutdown

ポイントは 3 行です。switchport trunk encapsulation dot1q でタグ方式を 802.1Q に固定し、switchport mode trunk でポートをトランク固定 (DTP (Dynamic Trunking Protocol) 任せにしない)、switchport trunk allowed vlan 10,20 で実際にこの管に通す VLAN を制限します。allowed vlan を省略すると 1〜4094 全てが通る設定になり、不要な VLAN のブロードキャストもトランクに流れてしまうため、運用では必ず明示します。

VLAN とトランクの状態を確認した結果が以下のとおりです。

snippet
SW1#show vlan brief

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active
10   VLAN0010                         active    Gi0/1
20   VLAN0020                         active    Gi0/2
99   VLAN0099                         active    Gi0/0
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup
SW1#show interfaces trunk

Port        Mode             Encapsulation  Status        Native vlan
Gi0/3       on               802.1q         trunking      1

Port        Vlans allowed on trunk
Gi0/3       10,20

Port        Vlans allowed and active in management domain
Gi0/3       10,20

Port        Vlans in spanning tree forwarding state and not pruned
Gi0/3       10,20

show vlan brief の VLAN 10 / 20 が VLAN0010 VLAN0020 表記になっているのは、config の vlan 10 name USERS を入れた後に access port 設定で同 VLAN を再参照したため、IOSv L2 が VLAN を自動再生成して既定名で上書きしたためです。実用上は問題なく、コマンド順序を vlan 定義 → name → アクセスポート設定の順で入れ直せば名前は反映されます。フレーム転送には影響しません。

show interfaces trunk のほうが本題です。Gi0/3 が Mode: on (管理的に強制トランク)、Encapsulation: 802.1qStatus: trunking (実際にトランクとして動作中)、Native vlan: 1、許可 VLAN は 10 と 20 だけ、と読み取れます。設定どおりにトランクが上がっていることがこの 1 行ずつで確認できます。


6. トランクポートの詳細

トランクの内部状態をもう一段細かく見ると、設定値 (管理面) と実動作 (運用面) の 2 系統が並んで表示されます。

snippet
SW1#show interfaces GigabitEthernet0/3 switchport
Name: Gi0/3
Switchport: Enabled
Administrative Mode: trunk
Operational Mode: trunk
Administrative Trunking Encapsulation: dot1q
Operational Trunking Encapsulation: dot1q
Negotiation of Trunking: On
Access Mode VLAN: 1 (default)
Trunking Native Mode VLAN: 1 (default)
Administrative Native VLAN tagging: enabled
Voice VLAN: none
Administrative private-vlan host-association: none
Administrative private-vlan mapping: none
Administrative private-vlan trunk native VLAN: none
Administrative private-vlan trunk Native VLAN tagging: enabled
Administrative private-vlan trunk encapsulation: dot1q
Administrative private-vlan trunk normal VLANs: none
Administrative private-vlan trunk associations: none
Administrative private-vlan trunk mappings: none
Operational private-vlan: none
Trunking VLANs Enabled: 10,20
Pruning VLANs Enabled: 2-1001
Capture Mode Disabled
Capture VLANs Allowed: ALL

Protected: false
Appliance trust: none

着目すべき行は以下の 4 つです。

  • Administrative Mode: trunk / Operational Mode: trunk: 管理者が設定した値 (Administrative) と、実際にポートが動作しているモード (Operational) の両方が trunk で一致した状態。switchport mode trunk は対向が trunk でなくても自ポートを強制的に trunk にする設定なので、DTP 交渉の結果で access に落ちることはありません。一方 Administrative が dynamic auto / desirable の場合は対向との交渉結果で Operational が access になり得ますし、リンクダウンやプラットフォーム制約でも Operational は期待とずれます。Administrative と Operational が食い違っていないか、必ず両方を確認します。
  • Administrative Trunking Encapsulation: dot1q / Operational Trunking Encapsulation: dot1q: 設定したカプセル化と実際に使われているカプセル化。本検証はどちらも dot1q で一致。
  • Trunking Native Mode VLAN: 1 (default): タグなしフレームが落ちる VLAN。両端で必ず一致させる必要がある項目。
  • Trunking VLANs Enabled: 10,20: 通過を許可された VLAN リスト。switchport trunk allowed vlan 10,20 の反映結果。

Administrative と Operational が分かれている設計は、設定 (意図) と実態 (観測) を分離して見るための仕掛けです。トラブル時に「設定は trunk なのに access として動いている」「dot1q 指定なのに isl で交渉してしまった」といったズレを最短で特定するため、両方の列を必ず照合します。


7. CAM テーブルに見える遠端 MAC

2-3 では「各アクセスポートに 1 つの MAC だけが学習される」ことを確認しました。ここで見るべきは、同じ trunk ポートに複数 VLAN の MAC が同居する という現象です。これがトランクが実際に複数 VLAN のフレームを運んでいることの直接的な証拠になります。

SW1 で CAM テーブルを引いた結果が以下のとおりです。

snippet
SW1#show mac address-table
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
  10    5254.004b.ca44    DYNAMIC     Gi0/1
  10    5254.00e4.9bb1    DYNAMIC     Gi0/3
  10    5254.00f4.ba64    DYNAMIC     Gi0/3
  20    5254.0009.112f    DYNAMIC     Gi0/2
  20    5254.00a8.fe6e    DYNAMIC     Gi0/3
  20    5254.00f4.ba64    DYNAMIC     Gi0/3
Total Mac Addresses for this criterion: 6
SW1#show mac address-table count

Mac Entries for Vlan 1:
---------------------------
Dynamic Address Count  : 0
Static  Address Count  : 0
Total Mac Addresses    : 0

Mac Entries for Vlan 10:
---------------------------
Dynamic Address Count  : 3
Static  Address Count  : 0
Total Mac Addresses    : 3

Mac Entries for Vlan 20:
---------------------------
Dynamic Address Count  : 3
Static  Address Count  : 0
Total Mac Addresses    : 3

Mac Entries for Vlan 99:
---------------------------
Dynamic Address Count  : 0
Static  Address Count  : 0
Total Mac Addresses    : 0

Total Mac Address Space Available: 78394504

VLAN 10 と VLAN 20 のエントリを別々に追ってみます。

  • VLAN 10: 3 件中、Gi0/1 経由が 1 件 (SW1 ローカルの PC1)、Gi0/3 経由が 2 件。Gi0/3 経由の 2 件は SW2 側の VLAN 10 端末 (PC3) と、トランクの先で経由する SW2 自身の MAC。
  • VLAN 20: こちらも 3 件中、Gi0/2 経由が 1 件 (PC2) で、残り 2 件が Gi0/3 経由。

ここで肝心なのは、Gi0/3 という同じ物理ポートが、VLAN 10 と VLAN 20 の両方の MAC を学習している 点です。2-3 で「CAM テーブルのキーは (VLAN, MAC) の組」と述べた、その「VLAN」の次元が、同じポート上で 2 つに分かれている状態です。Gi0/3 がトランクとして複数 VLAN を多重化していることが、CAM の側からも観測できます。

対称の状況を SW2 側でも確認しました。

snippet
SW2#show vlan brief

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Gi0/0
10   VLAN0010                         active    Gi0/1
20   VLAN0020                         active    Gi0/2
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup
SW2#show interfaces trunk

Port        Mode             Encapsulation  Status        Native vlan
Gi0/3       on               802.1q         trunking      1

Port        Vlans allowed on trunk
Gi0/3       10,20

Port        Vlans allowed and active in management domain
Gi0/3       10,20

Port        Vlans in spanning tree forwarding state and not pruned
Gi0/3       10,20
SW2#show mac address-table
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
  10    5254.004b.ca44    DYNAMIC     Gi0/3
  10    5254.00e4.9bb1    DYNAMIC     Gi0/1
  20    5254.0009.112f    DYNAMIC     Gi0/3
  20    5254.00a8.fe6e    DYNAMIC     Gi0/2
Total Mac Addresses for this criterion: 4

SW1 と SW2 の CAM を見比べると、対称性がはっきり見えます。

  • SW1 の VLAN 10 で Gi0/1 経由だった 5254.004b.ca44 (PC1) は、SW2 から見ると Gi0/3 経由で学習されています。
  • SW2 の VLAN 10 で Gi0/1 経由だった 5254.00e4.9bb1 (PC3) は、SW1 から見ると Gi0/3 経由。
  • VLAN 20 でも同様に、ローカル PC は自スイッチのアクセスポート、遠端 PC は Gi0/3 経由で見えています。

つまり PC1 が打った ARP やデータフレームは、SW1 がアクセスポート Gi0/1 で受け取り、VLAN 10 タグを付けて Gi0/3 のトランクへ送出し、SW2 が Gi0/3 で受信してタグを剥がし、VLAN 10 のアクセスポート (SW2 では Gi0/1) から PC3 側へ流す、という経路を通っています。その経路上で SW1 と SW2 がそれぞれ学習した結果が、この対称な CAM の姿です。トランクが「VLAN を物理スイッチ間でまたぐための拡張」として機能していることが、両側の CAM テーブルを並べただけで読み取れます。

VLAN ごとの構成もあわせて確認します。

snippet
SW1#show vlan id 10

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
10   VLAN0010                         active    Gi0/1, Gi0/3

VLAN Type  SAID       MTU   Parent RingNo BridgeNo Stp  BrdgMode Trans1 Trans2
---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------
10   enet  100010     1500  -      -      -        -    -        0      0

Remote SPAN VLAN
----------------
Disabled

Primary Secondary Type              Ports
------- --------- ----------------- ------------------------------------------
SW1#show vlan id 20

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
20   VLAN0020                         active    Gi0/2, Gi0/3

VLAN Type  SAID       MTU   Parent RingNo BridgeNo Stp  BrdgMode Trans1 Trans2
---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------
20   enet  100020     1500  -      -      -        -    -        0      0

Remote SPAN VLAN
----------------
Disabled

Primary Secondary Type              Ports
------- --------- ----------------- ------------------------------------------

show vlan id で個別の VLAN を見ると、所属ポートに アクセスポートとトランクポートの両方が並ぶ ことがわかります。VLAN 10 は Gi0/1 (アクセス) と Gi0/3 (トランク)、VLAN 20 は Gi0/2 (アクセス) と Gi0/3 (トランク) です。同じ Gi0/3 が複数 VLAN に同時に属している、というのも、トランクならではの表示です。


8. 次節

トランクと 802.1Q タグの基本動作を実機で確認しました。1 本のリンクで複数 VLAN を多重化し、CAM テーブルにはトランクポート経由で遠端 PC の MAC が学習され、VLAN は物理スイッチを越えて 1 つの L2 ドメインを構成できます。これがトランクの核心です。

ただし、スイッチが 2 台で済むうちはよいですが、これが 10 台 20 台と増えると問題が生じます。各スイッチで毎回手作業で vlan 10 name USERS vlan 20 name GUESTS を打ち、許可 VLAN リストを揃え、新 VLAN を増やすたびに全台に同じコマンドを配って回るのは現実的ではありません。VLAN 定義のずれは即座にトラブルに化け、運用工数も膨らみます。

そこで、複数スイッチ間で VLAN 定義そのものを自動同期する仕組みが必要になります。続く 2-5 VTP では、Cisco 独自の VLAN Trunking Protocol を取り上げます。サーバー / クライアント / トランスペアレントの 3 モードと、現代のデータセンタで主流になりつつある VXLAN / EVPN への流れまで、トランクの上を VLAN 制御プレーンが流れるという視点で見ていきます。