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 段階で、第 5 章で深掘りする。
    • 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 とほぼ同一で、本記事で示す switchport mode trunk switchport trunk encapsulation dot1q switchport trunk allowed vlan ... は Cat9000v でもそのまま使える。

トポロジは前出の図の通りで、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 任せにしない)、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 を入れていても、対向側の設定や DTP 交渉次第で Operational が access に落ちることがあり得るため、必ず両方を確認する。
  • 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 の VLAN 編で「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 で受信してタグを剥がして Gi0/2 のアクセスポートから 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 制御プレーンが流れるという視点で見ていく。