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 バイトの領域が挿入される形になります。
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 trunk の Native 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 trunkとswitchport 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 抜粋は以下のとおりです。
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 とトランクの状態を確認した結果が以下のとおりです。
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,20show 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.1q、Status: trunking (実際にトランクとして動作中)、Native vlan: 1、許可 VLAN は 10 と 20 だけ、と読み取れます。設定どおりにトランクが上がっていることがこの 1 行ずつで確認できます。
6. トランクポートの詳細
トランクの内部状態をもう一段細かく見ると、設定値 (管理面) と実動作 (運用面) の 2 系統が並んで表示されます。
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 テーブルを引いた結果が以下のとおりです。
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: 78394504VLAN 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 側でも確認しました。
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: 4SW1 と 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 ごとの構成もあわせて確認します。
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 制御プレーンが流れるという視点で見ていきます。

0x8100。「この後ろ 2 バイトはタグですよ」という目印だ。後半 2 バイトが TCI(Tag Control Information)で、これがタグの本体。さらに 3 つに分かれていて、PCP(3 bit、QoS の優先度 0〜7)、DEI(1 bit、輻輳時に捨ててよいかのフラグ)、そして肝心の VID(12 bit、VLAN ID 本体)だ。show interfaces trunk の Native vlan 列でいつでも確認できる。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,20Mode: on(管理的に強制トランク)、Encapsulation: 802.1q、Status: trunking(実際にトランクとして稼働中)、Native vlan: 1、許可 VLAN は 10 と 20 だけ ── 設定どおりに上がっていることが 1 行ずつ読み取れる。ちなみに switchport trunk allowed vlan 10,20 で通す VLAN を制限していて、これを省くと 1〜4094 全部が通ってしまって不要なブロードキャストまでトランクに流れる。だから運用では必ず明示するんだ。SW1#show mac address-table
Vlan Mac Address Type Ports
---- ----------- -------- -----
10 5254.004b.ca44 DYNAMIC Gi0/1
10 5254.00e4.9bb1 DYNAMIC Gi0/3
20 5254.0009.112f DYNAMIC Gi0/2
20 5254.00a8.fe6e DYNAMIC Gi0/3(VLAN, MAC) の組」と言ったよね。その「VLAN」の次元が、同じ Gi0/3 の上で 2 つに分かれている。これが、トランクが複数 VLAN を多重化していることの直接の証拠なんだ。vlan 10 name USERS を手で打って、許可 VLAN を揃えて…という手作業は現実的じゃない。そこで次は 2-5 VTP で、VLAN 定義そのものを複数スイッチ間で自動同期する仕組みを見ていこう。便利だけど事故も多い、クセのあるプロトコルだよ。