ネットワークの「境界線」を支配せよ:トランクとアクセスの深淵
ネットワークエンジニアとして現場に立っていると、若手から「なぜVLANの設定が通らないのか」という相談を頻繁に受けます。多くの場合、原因は 802.1Q のタグ処理、特に「ネイティブVLAN」の理解不足にあります。
アプリケーションエンジニアが curl でAPIを叩くとき、その裏側でパケットがL2スイッチのASICをどう駆け抜け、どのポートでタグが付与され、どこで剥がされるのか。この「見えない境界線」を意識できるかどうかが、大規模インフラのトラブルシューティングにおける分水嶺となります。
—
1. アクセスポートとトランクポート:その本質的な違い
L2スイッチにおいて、ポートは大きく2つの役割に分かれます。
- アクセスポート (Access Port):
特定のVLANに所属し、接続されるデバイス(サーバーやPCなど)には「タグなし」のイーサネットフレームを渡します。デバイス側はVLANの存在を知る必要がありません。
- トランクポート (Trunk Port):
複数のVLANを一本の物理リンクで多重化します。ここで登場するのが IEEE 802.1Q タグです。フレームに4バイトのタグを挿入し、「このフレームはVLAN 10のものだ」と識別させることで、スイッチ間を跨いでも論理セグメントを維持します。
ネイティブVLANの「泥臭い」真実
ここが初心者が最も躓くポイントです。802.1Q トランクにおいて、「タグを付けずに送受信するVLAN」をネイティブVLANと呼びます。
なぜこんな仕組みがあるのか?歴史的な経緯もありますが、実務上の理由は「タグ非対応の機器や古いスイッチとの互換性」です。しかし、これがセキュリティリスクや通信障害の温床にもなります。
—
2. パケット送受信のシーケンス
スイッチ内部での処理は、以下のようなフローで行われます。
1. フレーム受信時:
- アクセスポート: 受信したフレームにVLAN ID(PVID)を付与。
- トランクポート: タグ付きフレームならそのまま。タグなしなら、そのポートのネイティブVLAN IDを付与。
2. スイッチ内部(ASIC内):
- VLAN IDに基づき、MACアドレステーブルをルックアップ。宛先ポートを特定。
3. フレーム送信時:
- アクセスポート: 送信先のVLANとポートのVLANが一致すれば、タグを剥がして送信。
- トランクポート:
- 送信するVLANがネイティブVLANと一致する場合:タグを剥がして送信。
- それ以外:タグを付与したまま送信。
—
3. 実践:Cisco IOSでの設定と確認
現場でよくあるミスは、対向機器とネイティブVLANの不一致です。以下の設定を見てください。
# インターフェイスの設定例
interface GigabitEthernet0/1
description Uplink to Server
switchport mode trunk
# ネイティブVLANを10に設定(デフォルトは1だが、セキュリティ推奨は変更)
switchport trunk native vlan 10
# 許可するVLANを明示的に制限する(セキュリティの鉄則)
switchport trunk allowed vlan 10,20,30
もし対向側のスイッチで native vlan が 1 のままだった場合、フレームが混ざり合い(VLANリーク)、特定のVLANの通信が全く通らないといった「難解な障害」が発生します。
—
4. アプリケーション層からの疎通確認(トラブルシューティングTips)
API開発者が「サーバーから応答がない」と嘆いているとき、インフラ側は tcpdump やスイッチのミラーポートを活用します。ここで重要なのは、「タグが見えているか」です。
Linuxサーバー側で VLANインターフェイス を作っている場合、tcpdump で確認すると、タグが含まれたフレーム(.1Q ヘッダー付き)を観測できます。
# VLANインターフェイス(eth0.10)の通信をキャプチャ
tcpdump -ni eth0.10 port 80 -vv
もし、サーバー側でタグなしのインターフェイス(eth0)で通信しているのに、スイッチ側でトランクポートに繋いでいる場合、ネイティブVLANの設定がズレていれば、疎通は完全に遮断されます。
PythonでAPIを叩く際、接続タイムアウトが頻発するなら、まずは traceroute や ping でL3到達性を確認しつつ、L2領域でのVLAN不整合を疑うのがシニアの勘所です。
import requests
# 接続先APIが特定のVLAN内にある場合
# ネットワークパスにL2境界が含まれるなら、MTUサイズにも注意(タグが付くとフレームが4バイト増えるため)
try:
response = requests.get("http://192.168.10.50/api/v1/status", timeout=2)
print(f"Status: {response.status_code}")
except requests.exceptions.Timeout:
print("ネットワーク経路のVLAN設定か、MTU不整合を疑うべき")
—
エンジニアへのアドバイス
「なぜ通信できないのか」という問いに対して、show interface trunk を叩く前に、まずは頭の中で「フレームがどのポートに入り、どのタグが付与され、どこで剥がされるのか」をパケットの動きとしてイメージしてください。
ネットワークは魔法ではありません。すべては Ethernet Frame という物理的な箱の中に記された「ルール」に従って動いています。トランクとアクセスの境界を制する者は、ネットワークを制します。次回の設計やトラブル対応では、ぜひこの「タグの剥離」を意識してみてください。視界が劇的にクリアになるはずです。
コメント