【実務・中級編】 トランクポート(Trunk Port)とアクセスポート(Access Port)のトラフィック処理 – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

ネットワークの「境界線」を支配せよ:トランクとアクセスの深淵

ネットワークエンジニアとして現場に立っていると、若手から「なぜ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 という物理的な箱の中に記された「ルール」に従って動いています。トランクとアクセスの境界を制する者は、ネットワークを制します。次回の設計やトラブル対応では、ぜひこの「タグの剥離」を意識してみてください。視界が劇的にクリアになるはずです。

コメント

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