2-2 スイッチング基礎
スイッチが受信フレームを宛先ポートへ届ける仕組み。CAM テーブルの自動学習、ユニキャスト転送、未知宛先のフラッディング、aging-time までを Cat9000v 実機の出力で確認する。
1. スイッチの役割
スイッチは LAN 内の機器同士を結ぶ集線装置です。一見すると複数のケーブルを束ねるだけのハブと似ていますが、両者の動作はまったく異なります。ハブは受信した信号をそのまま全ポートへ流すだけで、結果として接続機器すべてが同一の衝突ドメインに属します。これに対しスイッチは、フレームの宛先 MAC アドレスを見て 必要なポートにだけ転送します。
ポートごとに衝突ドメインが分離されるため、複数のペア間通信が同時に成立し帯域が無駄になりません。この「宛先別の送り分け」を支えるのが、スイッチ内部に保持される CAM テーブル です。
2. CAM テーブルとは
CAM (Content Addressable Memory) テーブルとは、スイッチが「どの MAC アドレスがどのポートにつながっているか」を記録する対応表です。MAC アドレステーブルとも呼ばれます。
エントリは静的に登録することもできますが、通常は 受信フレームから自動学習 されます。スイッチはフレームを受信するたびに、その送信元 MAC アドレスと着信ポートの組をテーブルに登録します。一定時間そのアドレスからの通信が途絶えると、エントリは エージング により自動削除されます。既定の保持時間は 300 秒です。
実機で確認すると以下のとおりです。Cat9000v 上で稼働中のスイッチに PC1 / PC2 を接続した状態で、テーブルとエージング時間を表示した出力です。
SW1#show mac address-table aging-time
Global Aging Time: 300
SW1#show mac address-table dynamic
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- -------- -----
1 5254.003b.4a81 DYNAMIC Gi1/0/1
1 5254.0060.3144 DYNAMIC Gi1/0/2
Total Mac Addresses for this criterion: 2VLAN 1 上で 2 件の動的エントリが学習されており、それぞれ Gi1/0/1 と Gi1/0/2 に紐付いています。DYNAMIC 表記は自動学習エントリを意味します。
3. ユニキャスト転送・フラッディング・学習の3ステップ
スイッチがフレームを受け取ったときの動作は、宛先 MAC が CAM テーブルに登録済みかどうかで分岐します。下のアニメーションは、空の CAM テーブルから始まり、最初のフレームでフラッディング → 学習 → 以降はユニキャストで送り分けされる一連の流れを 6 ステップで可視化したものです。図をクリックすると次のステップに進みます。
- STEP 1 (フラッディング): 宛先 MAC が CAM に無い場合、受信ポートを除く同一 VLAN 内の全ポートへフレームを複製送出する動作。これをフラッディングと呼ぶ。ブロードキャストフレーム (ARP リクエスト等) も同様にフラッディングされる。マルチキャストフレームも、制御機能が無ければ基本的にフラッディングされる (実運用のスイッチでは IGMP/MLD スヌーピングにより必要なポートへ限定されることが多いが、本節では単純化して扱い、詳細は後続のマルチキャスト節に譲る)。
- STEP 2 (学習): 受信したフレームの 送信元 MAC と着信ポート の対応を CAM テーブルへ登録する処理。ここが学習の本体。
- STEP 3 (ユニキャスト転送): 以降、その MAC 宛のフレームは登録済みのポートにのみ送出される処理。他のポートには流れないため帯域が節約され、関係ない端末へ盗聴目的のトラフィックも届かない。
学習は 受信フレームの送信元 MAC に対して行われるため、送り分けが効くようになるのは「宛先側がそのポートから一度フレームを出して学習された後」です。たとえば PC1→PC2 の最初のフレームは PC2 がまだ学習されていなければフラッディングされ、その受信で学習されるのは送信元の PC1 です。続いて PC2→PC1 のフレーム (ping の応答など) が届くと PC2 も学習され、以降は双方向ともユニキャストで送り分けられます。ARP や ping のように往復で通信する場面では双方向の学習が一瞬で完了するため、結果として「最初のやり取りだけがフラッディングされ、以降は送り分けが効く」ように見えます。これが「スイッチは賢い」と表現される所以です。
4. CML での検証
検証は CML (Cisco Modeling Labs) 上の Cat9000v (IOS-XE 17.15.3) で実施しました。トポロジは以下のとおりで、PC1 と PC2 は 30 秒ごとに peer へ ping を打ち続けるバックグラウンドループで動作させています。
スイッチ側のアクセスポート設定は最小限で、VLAN 指定もせず default VLAN (VLAN 1) に所属させています。
interface GigabitEthernet1/0/1
description PC1
switchport mode access
!
interface GigabitEthernet1/0/2
description PC2
switchport mode access
!show interfaces status で両ポートのリンク状態を確認した結果が以下のとおりです。
SW1#show interfaces status
Port Name Status Vlan Duplex Speed Type
Gi1/0/1 PC1 connected 1 a-full a-1000 unknown
Gi1/0/2 PC2 connected 1 a-full a-1000 unknown
# ...(Gi1/0/3 以降は未使用、省略)両ポートとも VLAN 1 に所属し、オートネゴシエーションで 1Gbps / 全二重に決まっています。
5. CAM 学習の動作観察
CAM が「動的に消えて、動的に再学習される」様子を時系列で観察します。
(a) 安定状態: PC1 / PC2 が定期 ping を打っているため、両端末の MAC が登録済みの状態。
SW1#show mac address-table dynamic
1 5254.003b.4a81 DYNAMIC Gi1/0/1
1 5254.0060.3144 DYNAMIC Gi1/0/2
Total Mac Addresses for this criterion: 2(b) clear mac address-table dynamic 直後: 動的エントリを強制的に削除した状態。実行 4 秒後の表示が以下のとおりです。
SW1#clear mac address-table dynamic
SW1#show mac address-table dynamic
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- -------- -----
SW1#show mac address-table count
Total Dynamic Address Count : 0
Total Static Address Count : 0
Total Mac Address In Use : 0エントリが空になり、Dynamic Address Count = 0 となっています。
(c) 35 秒後: 何も追加で操作していなくても、PC が定期 ping を再開すれば次のフレーム受信で即座に再学習されます。
SW1#show mac address-table dynamic
1 5254.003b.4a81 DYNAMIC Gi1/0/1
1 5254.0060.3144 DYNAMIC Gi1/0/2
Total Mac Addresses for this criterion: 2同じ MAC が同じポートで戻ってきました。CAM は その時点で通信している機器を映す動的なスナップショット であり、運用中はほぼ常に最新の状態に保たれます。aging-time = 300 秒という値も、通信が活発な間は意識する必要がありません。
(d) aging-time の確認と短縮: 自動削除までの保持時間 (aging-time) は既定で 300 秒です。値は次のコマンドで確認・変更できます。
SW1#show mac address-table aging-time
Global Aging Time: 300検証用に保持時間を 30 秒へ短縮してみます。
SW1(config)#mac address-table aging-time 30
SW1#show mac address-table aging-time
Global Aging Time: 30
Vlan Aging Time
---- ----------Global Aging Time が 30 に変わりました。理屈のうえでは、ここで対象機器の通信が完全に途絶えれば 30 秒後に該当エントリが自動削除されます。ただし clear mac address-table dynamic による即時削除と異なり、自然エージングは「その MAC からのフレームが一切届かない状態が aging-time 続くこと」が条件 です。エージングがどのような場面で効くのかは、後述の落とし穴で実機検証の限界とあわせて補足します。
6. ポート別の確認とカウンタ
特定ポートに絞った確認も可能です。トラブルシュート時に「あの機器は本当にこのポートに見えているか」を素早く判定するときに使います。
SW1#show mac address-table interface GigabitEthernet1/0/1
1 5254.003b.4a81 DYNAMIC Gi1/0/1
Total Mac Addresses for this criterion: 1ポートごとの送受信フレーム種別は show interfaces ... counters で確認できます。
SW1#show interfaces GigabitEthernet1/0/1 counters
Port InOctets InUcastPkts InMcastPkts InBcastPkts
Gi1/0/1 151142 281 1 372
Port OutOctets OutUcastPkts OutMcastPkts OutBcastPkts
Gi1/0/1 255634 282 1356 355 InUcastPkts はそのポートで受信したユニキャストフレーム、InBcastPkts はブロードキャストです。ARP の解決リクエスト等が InBcastPkts に積まれていきます。一方、フラッディングされた未知ユニキャストは送出側では OutUcastPkts として扱われ、宛先機器側では InUcastPkts として観測されます。送受信の分布を見れば、その VLAN にどれだけブロードキャストやマルチキャストが流れているかも掴めます。
7. 落とし穴・補足
- CAM オーバーフロー: テーブル容量には上限があります (Cat9000v の本検証環境では空き 32766 件)。攻撃者が大量の偽 MAC をフラッディングさせて CAM を埋め尽くすと、本来学習されるべき正規宛先のエントリが登録・保持できなくなります。その結果、当該宛先へのフレームが 未知ユニキャストとしてフラッディングされ、攻撃者の居るセグメントにも届くようになります (CAM に残っている既知エントリ宛は引き続きユニキャスト転送されます)。盗聴の足場となる古典的な L2 攻撃です。
- VLAN ごとに分離: CAM テーブルは VLAN ごとに独立しています。同じ MAC アドレスでも VLAN が違えば別エントリとして扱われ、VLAN を跨ぐフレームはルータか L3 スイッチを経由しないと届きません。
- 静的エントリ: 運用上必要な場合は手動で MAC を固定登録もできます (
mac address-table static ...)。エージングされず常時有効ですが、機器入れ替え時の保守負荷が増えるため通常は使いません。 - 自然エージングは「リンクは up のまま送信だけが止まる」場面の話 (検証の限界): aging-time を 30 秒に縮めても、相手機器が背景トラフィックを出し続ける限りエントリは消えません。本検証環境で aging-time を 30 秒に短縮して 40 秒待っても、接続機器 (PC・ルータいずれの端末も) が ARP や IPv6 近隣探索などの定期フレームを送出し続けるため、CAM エントリは更新され続けて一つも自然消滅しません。自然エージングが目に見えて起きるのは「リンクは up のまま、その MAC を送信元とするフレームだけが aging-time 以上届かない」状態 です。ここで注意したいのは、ケーブル抜けや端末の電源断のように物理リンクが down する場合との違いです。リンクダウンではそのポートに紐付く動的エントリがリンク状態変化に伴って即時に削除されるため、aging-time の経過を待つ自然エージングとは別の仕組みになります。運用中の機器のエントリが消えないのは正常な挙動であり、自然エージングは「通信が止まったのにリンクは生きている」ような状況でだけ静かに片付ける仕組みだと理解すれば十分です。
- 未知ユニキャストの「全ポート複製」を counter で直接観察するのは難しい (検証の限界): 「未知ユニキャストが傍観ポートにも複製送出される」ことを、第 3 のポートに観測用ノードを足してそのポートの送信カウンタの増分で示す方法は、本検証環境では成立しません。理由は二つあります。(1) 前項のとおり接続機器が常時フレームを送出するため、
clear mac address-table dynamicを打っても CAM を「空のまま」に保てず、未知ユニキャストが発生する窓を作れない。(2) CML の Cat9000v 仮想プラットフォームでは、show interfaces <port> countersの per-port ユニキャストカウンタが単発フレームの増分を即座には反映しない。フラッディングそのものは「宛先 MAC が CAM に無ければ送り先を絞れず、受信ポート以外の同一 VLAN 全ポートへ複製する」という設計上の必然であり、§3 のアニメーションと空テーブル状態 (§5(b)) が示すとおりです。実機の単発フレームを counter で捉えるのは仮想環境では割に合わない、という検証上の限界があります。
8. 次節
単一 VLAN (default VLAN 1) におけるスイッチの素のスイッチング動作を実機の出力で確認しました。CAM テーブルが受信フレームから自動的に育ち、未知宛先はフラッディングし、学習済みはユニキャスト送出します。この一連の流れがすべてのイーサネットスイッチの土台です。
続く 2-3 VLAN では、1 台の物理スイッチを論理的に複数のスイッチへ分割する仕組みに踏み込みます。CAM テーブルが VLAN ごとに分離されるという伏線の回収でもあります。
SW1#show mac address-table dynamic
Vlan Mac Address Type Ports
---- ----------- -------- -----
1 5254.003b.4a81 DYNAMIC Gi1/0/1
1 5254.0060.3144 DYNAMIC Gi1/0/2
Total Mac Addresses for this criterion: 2DYNAMIC というのが「自動学習で覚えたエントリ」という印だ。それぞれの MAC がどのポートに紐づいているか、ちゃんと表になっているだろう。ちなみに、一定時間その MAC からの通信が途絶えると、このエントリは エージングで自動的に消える。既定の保持時間は 300 秒だよ。clear mac address-table dynamic で強制的に消す方法はある。実行直後はこうやって空になる。SW1#clear mac address-table dynamic
SW1#show mac address-table count
Total Dynamic Address Count : 0SW1(config)#mac address-table aging-time 30
SW1#show mac address-table aging-time
Global Aging Time: 30Global Aging Time は確かに 30 になる。でも 40 秒待っても、エントリが一つも自然消滅しなかった。理由は、接続機器(PC でもルータでも)が ping の応答や ARP・IPv6 近隣探索といった何らかのフレームを送り続けて、その MAC が aging-time 以内に繰り返し再学習されるからなんだ。どのフレームがどの周期で出るかは環境次第だけど、要は「対象の MAC が無通信のまま 30 秒を越える」状態を作れなかった、ということだね。だから大事なのはこの理解だよ ── 自然エージングが目に見えて起きるのは「リンクは up のまま、その MAC を送信元とするフレームだけが aging-time 以上届かない」という、限られた状況だけなんだ。show interfaces <port> counters の per-port ユニキャストカウンタが、単発フレームの増分を即座に反映しないことだ。フラッディングそのものは「宛先が CAM に無ければ送り先を絞れない」という設計上の必然で、§3 のアニメと空テーブルの状態がそれを示している、というところで止めてある。仮想環境で単発フレームを counter で捉えるのは割に合わない、という限界だね。