【第12回】VLANの境界線を揺るがす闇:アクセス・トランク混在環境におけるパケット変態の全記録
ネットワークエンジニアの夜は、いつも不穏なアラート音から始まる。
「あるフロアの端末から、突如として別のセグメントへの通信がロストした。だが、物理リンクはアップしている」
配線を辿り、CiscoやAristaのCLIを叩き、Wiresharkでキャプチャを仕掛ける。そこで我々が目撃するのは、教科書の図解がいかに綺麗事で塗り固められた幻想であるかという現実だ。IEEE 802.1Qのタグが剥がされ、あるいは付与され、L2スイッチのASIC(Application-Specific Integrated Circuit)の内部バッファを駆け抜ける瞬間、パケットは変貌を遂げる。
今回は、現場で最も設計ミスが頻発し、時にセキュリティ上の致命傷となる「ポートベースVLANとタグベースVLANの混在環境」における、パケットレベルの挙動と最適化の極意を紐解いていこう。
—
1. アクセスポートとトランクポートの境界におけるフレームの「変態」
L2スイッチングの世界では、物理ポートの振る舞いは大きく2つに分かれる。すべての端末がネイティブで理解できる素のイーサネットフレームを扱う「アクセスポート」と、複数VLANのパケットを多重化して流すための「トランクポート」だ。
この2つの境界、すなわちトランク・アクセス混在ポート(HybridポートやNative VLANが絡む境界)において、ASIC内部で何が起きているのか。
[端末 A (VLAN 10)]
│ (素のイーサネットフレーム)
▼
[SW ポート1 (アクセスポート: VLAN 10)]
│ (内部処理: 4バイトの 802.1Q タグが付与される)
▼
[ASIC 内部スイッチファブリック]
│ (タグ付きフレームのまま転送)
▼
[SW ポート24 (トランクポート: VLAN 10, 20)]
│ (ネイティブVLANの場合はタグを剥がすか否かの判定)
▼
[ルータ / 対向スイッチ]
パケットがアクセスポートに飛び込んだ瞬間、スイッチのASICは即座に4バイトの802.1Qタグ(TPID 0x8100 + TCI)をSRC MACとEtherTypeの間にねじ込む。
ここで問題になるのが、設計の甘い環境でよく見られる「ネイティブVLAN(Native VLAN)の不一致」だ。
トランクポートにおいて、タグなし(Untagged)で送受信されてきたフレームをどのVLANに所属させるか。この解釈がスイッチ間で食い違った瞬間、VLANホッピング(VLAN Hopping)のセキュリティ脆弱性が産声を上げる。攻撃者は二重タグ(Double Tagging)を用いた細工により、意図したVLANの境界をやすやすと突破し、隔離されたセグメントへ侵入することが可能になる。
堅牢なトランク設定の模範解答 (Cisco IOSの例)
不必要なネイティブVLANの混入や、DTP(Dynamic Trunking Protocol)による自動ネゴシエーションの脆弱性を断ち切るため、インフラアーキテクトは以下のように厳格な設定を投入しなければならない。
! すべてのポートでDTPを無効化し、強制的にトランクまたはアクセスに固定する
interface GigabitEthernet0/1
description === Uplink to Core Switch ===
switchport mode trunk
! ネイティブVLANには使用しないダミーのVLAN IDをあえて割り当て、ネイティブVLAN攻撃を無効化
switchport trunk native vlan 999
! このトランクで許可するVLANを明示的にホワイトリスト形式で指定(VLAN 10, 20のみ許可)
switchport trunk allowed vlan 10,20
no shutdown
interface GigabitEthernet0/2
description === Edge Access Port for Client PC ===
switchport mode access
switchport access vlan 10
! 接続ミスの検知や不正端末の接続を防ぐためPortFastとBPDUガードを有効化
spanning-tree portfast
spanning-tree bpduguard enable
no shutdown
—
2. VLAN間ルーティング(Router-on-a-Stick)とレイテンシの物理的限界
異なるVLAN間で通信を行う場合、L2スイッチの枠を超えてL3デバイス(ルータまたはL3スイッチ)によるルーティングが必要になる。いわゆる「Router-on-a-Stick(棒状ルータ)」構成だ。
物理的なインターフェースは1つであっても、内部的にはサブインターフェース(例:GigabitEthernet0/0.10などカプセル化された論理I/F)を切り、VLANごとにゲートウェイを提供する。
[VLAN 10 のクライアント] ──(L2 SW)──> [トランクリンク] ──> [L3ルータ (サブI/Fでルーティング)]
RTT削減とTCPバッファチューニングの極意
このアーキテクチャの最大のボトルネックは、同一セグメント内の通信であっても(ルーティング設定ミスやポリシーにより)一度ルータのサブインターフェースまでパケットが往復してしまう「ヘアピンルーティング(Hairpinning)」や、CPUベースのルータにおけるパケット処理の遅延である。
データセンターや高頻度取引(HFT)のインフラ、あるいはセキュアなエンタープライズNWにおいて、RTT(Round Trip Time)の削減は死活問題だ。Linuxベースのルータや仮想アプライアンスでVLAN間ルーティングを行っている場合、カーネルのTCPスタックおよびバッファチューニングが最適化されていないと、マイクロバーストによるパケットドロップが多発する。
/etc/sysctl.conf に記述すべき、極限までパフォーマンスを絞り出した設定例を以下に示す。
# カーネル全体のネットワークメモリ割り当て上限を拡張 (pages単位)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# パケット処理のバックログキューを拡大し、トラフィックバースト時のドロップを防ぐ
net.core.netdev_max_backlog = 10000
# TCPウィンドウのスケーリングを有効化し、高速・高遅延ネットワークでのスループットを最大化
net.ipv4.tcp_window_scaling = 1
# BBR混雑制御アルゴリズムの採用 (従来のCUBICに比べ、パケットロスに対する耐性と低遅延を両立)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
このチューニングにより、VLAN間ルーティングにおけるカーネル内のパケット処理遅延を極小化し、スループットの頭打ちを防ぐことが可能になる。
—
3. トランスポート層とTLSハンドシェイクへの影響
ネットワーク層やデータリンク層の歪みは、上位レイヤーであるトランスポート層(TCP)、ひいてはアプリケーション層のセキュリティ(TLSハンドシェイク)にダイレクトに波及する。
例えば、VLANの設計ミスやトランクポートでのMTU(Maximum Transmission Unit)設定の不整合(標準の1500バイトに対し、802.1Qタグの4バイトが付加されることで1504バイトになり、途中の経路で断片化やパケットロスが発生する現象)があると、TCPのセグメント化やPath MTU Discovery(PMTUD)に悪影響を及ぼす。
特に強力な暗号スイートを用いた TLS 1.3のハンドシェイク においては、以下のような問題が生じる。
1. Client Helloの肥大化: サポートする暗号化方式、鍵共有アルゴリズム(X25519など)、SNI、そしてTLS 1.3の目玉である「0-RTT用のEarly Data」などが詰め込まれたClient Helloメッセージは、容易に1.KB〜2KBを超える。
2. パケットの分割(Fragment): これが標準的なMTU制約やVLANタグ付加によるオーバヘッドと重なると、TCPセグメントが複数に分割され、パケットロス時の再送コストが跳ね上がる。
3. ハンドシェイクの遅延: 結果として、TCP 3-wayハンドシェイク完了後のTLSハンドシェイク(1-RTTまたは0-RTT)の完了タイミングが遅れ、体感速度の低下やタイムアウトを引き起こす。
この問題に対処するためには、スイッチ側のジャンボフレーム(Jumbo Frame)対応(例: MTU 9000バイトへの拡張)をトランクパス全体で一貫して行い、パケットの断片化を物理的に排除することが大前提となる。
—
4. 重大なネットワーク脆弱性の回避策
最後に、アクセスポートとトランクポートが混在する環境において、セキュリティスペシャリストが必ず押さえておかなければならない「悪意ある挙動」と「その防衛策」について言及する。
脅威1: VLANホッピング(Double Tagging)
攻撃者がアクセスポートから、内側に VLAN X のタグ、外側にネイティブ VLAN 99 のタグという二重のタグがついたフレームを送信する。
スイッチのポート(アクセスポート)は外側のネイティブVLANタグを剥がして内部へ転送するが、その結果として内側に隠されていた VLAN X のタグが露わになり、本来アクセスできない別VLANへパケットが到達してしまう。
【回避策】
- ネイティブVLANにはトラフィックを流さない専用の未使用VLAN IDを割り当てる。
- すべてのユーザ接続用アクセスポートでDTPを完全にオフにし、アクセスモードに固定する。
- 未使用のポートは必ずシャットダウンし、アクセス不可のダミーVLANに割り当てる。
脅威2: 不正なDTPスイッチの接続(Switch Spoofing)
攻撃者がPCのNICを偽装し、DTPパケットを送信してスイッチポートを「トランクモード」に強制移行させる。これが成功すると、スイッチ間を結ぶトランクポートになりすまし、すべてのVLANのトラフィックを盗聴・改ざんすることが可能になる。
【回避策】
! ポート単位でDTPのネゴシエーションを完全に拒否する
interface Range GigabitEthernet0/1 - 24
switchport nonegotiate
この switchport nonegotiate の一行こそが、インフラエンジニアのプライドを守る最後の砦である。
—
5. まとめ
スイッチのポートベースVLANとタグベースVLANの境界線。それは、静的なハードウェアスイッチングと動的なパケット変態が交錯する、ネットワークの最前線だ。
「とりあえず動いた」で放置されたトランクポートのネイティブVLANや、チューニングを怠ったルーティング経路は、いつの日か必ず大規模障害やセキュリティインシデントという名の牙を向く。
パケットが1パケットごとにどのようなヘッダーを纏い、どのASICのキューを通過し、カーネルのどこで処理されているか。そのリアリティを脳内に描き切る者だけが、真にセキュアで高パフォーマンスなエンタープライズネットワークを構築・維持できるのだ。さあ、今夜もログとパケットキャプチャ画面に向き合うとしよう。
コメント