【実務・中級編】 スイッチのポートベースVLANとタグベースVLANの混在 – ネットワーク基礎とWebセキュリティ実践ガイド

境界線上の「見えない壁」:VLAN混在環境でパケットが迷子にならないための深層心理

現場でネットワークトラブルに遭遇したとき、一番厄介なのは「物理的には繋がっているのに、論理的には断絶している」という状況だ。特に、アクセスポートとトランクポートが混在するスイッチ環境で、VLANの理解が曖昧だと、パケットはまるで迷宮入りしたかのように消失する。

今日は、なぜVLANという「論理的な区切り」が必要なのか、そしてその境界でパケットがどのような変身(タグ付け)を遂げているのか、実務的な視点で解剖していこう。

—

1. VLANの基本:アクセスポートとトランクポートの「役割分担」

まず、スイッチのポート設定における鉄則を整理する。

  • アクセスポート (Access Port): 特定のVLAN(例:VLAN 10)に属する端末を接続するポート。ここを流れるイーサネットフレームには、タグは付いていない。端末側はVLANなんて知らないから、当然だ。
  • トランクポート (Trunk Port): 複数のVLANを束ねて運ぶ高速道路。ここを通るフレームには「VLAN ID」を記した小さな名札(802.1Qタグ)が貼り付けられる。

パケットの変身プロセス

1. Ingress(入口): アクセスポートにPCからパケットが入る。スイッチは「このポートはVLAN 10だ」と判断し、内部でタグを付与する。
2. Transit(移動): スイッチ間を移動する際、トランクポートはタグ付きフレームのまま転送する。
3. Egress(出口): 出口側のアクセスポートに到達すると、スイッチはタグを剥がして(Untag)、PCが理解できる素のイーサネットフレームとして送り出す。

この「タグの付け剥がし」こそが、VLANの神髄だ。ここをミスると、通信は即座に遮断される。

—

2. なぜ「VLAN間ルーティング」が必要なのか

VLANは「ブロードキャストドメインを分ける」ためのものだ。セキュリティや管理の都合上、VLAN 10(Webサーバー)とVLAN 20(APIサーバー)を分けたなら、この二つの間は、論理的には「物理的に別のLAN」として扱われる。

ここで、開発者がよく躓くポイントがある。「同じスイッチに繋いでいるのに、なぜ直接pingが通らないのか?」という問いだ。答えは明確。OSI参照モデルの第2層(データリンク層)で隔離されているからだ。 別のネットワーク間を渡るには、必ず第3層(ネットワーク層)であるルーター(またはL3スイッチ)を通らなければならない。

—

3. 実践:トランクポート設定とデバッグの作法

Cisco CatalystやAristaのような構成でのトランク設定例を見てみよう。

# インターフェースをトランクポートに設定
interface GigabitEthernet0/1
 switchport mode trunk
 # 許可するVLANを明示的に指定(セキュリティの基本)
 switchport trunk allowed vlan 10,20
 # ネイティブVLANの不一致はトラブルの温床なので注意
 switchport trunk native vlan 99

もし、サーバーサイドからAPIを叩いて接続できない場合は、まず curl での疎通確認と、併せて tcpdump を行うのが鉄則だ。

# 特定のインターフェースでVLANタグ付きのパケットをキャプチャする(要root権限)
tcpdump -i eth0 -e vlan 10

Web API開発者へのTips

クラウド環境(AWS VPCやAzure VNet)では、これらVLANの概念は「セキュリティグループ」や「ネットワークACL」という抽象化されたレイヤーに隠蔽されている。しかし、オンプレミスのハイブリッド環境や、コンテナネットワーク(Dockerのブリッジなど)では、今もなおこの「タグ付け」が通信を支配している。

PythonでAPIの疎通を確認する際は、タイムアウトの設定に注意してほしい。VLAN間ルーティングのゲートウェイでパケットが破棄されている場合、接続拒否よりも「タイムアウト」が発生することが多いからだ。

import requests

# 接続タイムアウトを設定して、ネットワーク経由の到達性を確認する
try:
    response = requests.get("http://192.168.20.10/api/v1/resource", timeout=3)
    response.raise_for_status()
    print("接続成功!")
except requests.exceptions.ConnectTimeout:
    print("エラー: ネットワーク経路(ルーティング)でタイムアウトしました")
except requests.exceptions.RequestException as e:
    print(f"その他のエラー: {e}")

—

4. 現場で生き残るための「心構え」

トラブルシューティングの現場では、「設定は正しいはずだ」という思い込みが一番の敵だ。

1. VLAN IDの不一致: 対向側のポートとVLAN IDが一致しているか。
2. ネイティブVLANの不一致: トランクリンクにおいて、タグを付けない native vlan が両端で揃っているか。
3. MTUサイズ: タグが付与されることでフレームサイズが4バイト増える。稀にMTU制限に引っかかる古い機器がある。

ネットワークは生き物だ。パケットの流れを想像し、どこでタグが付き、どこでルーティングされるのか。その論理的な地図を頭の中に描けるようになったとき、あなたは「ただのエンジニア」から「ネットワークを支配するエンジニア」へと一歩近づいているはずだ。

次は、もしパケットが途中で消えたら、落ち着いて「出口」ではなく「交差点(スイッチのポート)」を疑うことから始めてほしい。それが、長年現場で戦ってきた僕からのアドバイスだ。

コメント

タイトルとURLをコピーしました