【実務・中級編】 SVI(Switched Virtual Interface)を用いたマルチレイヤー一个(L3スイッチ)での高速ルーティング – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

こんにちは。ネットワークの深淵へようこそ。
大規模なWebシステムのインフラを設計・運用していると、必ずと言っていいほど「VLANを跨いだ通信の遅延」や「ルーターのCPU負荷高騰」という壁にぶつかります。

「なぜ、同じ社内・同じデータセンター内にあるサーバー同士の通信なのに、ルーターを挟むと途端にスループットが落ちるのか?」
「Kubernetesクラスターやマイクロサービスのノード間で、VLAN境界を越えたパケットをワイヤーレートでさばくにはどうすればいいのか?」

Web APIの高速化やコンテナネットワークのチューニングに奔走するエンジニアの皆さん、その答えは物理ルーターの排除と、L3スイッチ(マルチレイヤー・スイッチ)に備わる SVI(Switched Virtual Interface) と ASIC(Application-Specific Integrated Circuit) のコンビネーションを極めることにあります。

今回は、教科書的な仕様のなぞりを超え、パケットがL3スイッチの内部バスをどう駆け抜け、なぜミリ秒単位ではなくナノ秒単位の爆速ルーティングが実現できるのか、実務の現場で培った泥臭い知見を交えて徹底解説します。

—

1. なぜ「SVI」なのか?:レガシーなルーター・オン・アームズからの脱却

かつてのネットワーク設計では、異なるVLAN間(例えば、Webフロントエンド用VLAN 10と、DBバックエンド用VLAN 20)で通信を行う場合、物理ルーターを1台用意し、IEEE 802.1Qのトランクリンクを1本ぶら下げる 「Router-on-a-Stick(ワンアームルーター)」 構成が主流でした。

しかし、この構成には致命的な弱点があります。VLAN 10からVLAN 20へ向かうすべてのパケットが、同一の物理インターフェースを「往復」するため、リンク帯域が物理的ボトルネック(いわゆる「ヘアピン問題」)になります。さらに、ルーティング処理はCPUベースで行われるため、トラフィックが増大するとルーターのCPU使用率が張り付き、Web APIのレスポンスタイムがジリジリと悪化していく……。インフラエンジニアなら誰もが冷や汗をかいた悪夢のシナリオです。

ASICによるハードウェア処理の魔術

これを根本から解決するのが、L3スイッチの内部に論理的なL3インターフェースを生やす SVI です。

SVIは、IEEE 802.1Qでカプセル化されたレイヤー2のVLANドメインに対し、IPアドレス(デフォルトゲートウェイ)を割り当てる仮想的なルーティングインターフェースです。
最大の特徴は、パケットのルーティング判定(L3ヘッダーの書き換え、TTLのデクリメント、ARP解決、そしてL2の宛先MACアドレスの書き換え)が、CPUではなく専用のハードウェアチップである ASIC によってワイヤーレート(回線速度の限界)で実行される点にあります。

一度L3スイッチのルーティングテーブル(TCAM: Ternary Content-Addressable Memory)にエントリがキャッシュされれば、2番目以降のパケットはCPUを一切介さず、ハードウェア回路のハードワイヤードな処理だけで別のVLANへとルーティングされます。この挙動の差こそが、モダンなインフラにおける高速ルーティングの命綱なのです。

—

2. パケットはL3スイッチ内部でどう動くのか?(通信フロー)

では、実際にSVIを持つL3スイッチ上で、VLAN 10(192.168.10.0/24)に属するWeb APIサーバーから、VLAN 20(192.168.20.0/24)に属するDBサーバーへリクエストが飛ぶときの内部挙動を、パケットの身になって追ってみましょう。

[ Web Server (VLAN 10) ] 
       │ (1. パケット送信: 宛先MACはL3SWのSVI)
       ▼
  +-------------------------------------------------------+
  | L3 Switch (Multi-Layer Switch)                        |
  |                                                       |
  |  [VLAN 10 SVI] (192.168.10.1 / MAC: AABB.CC11.2233)    |
  |         │                                             |
  |         ├─► [ASIC / TCAM] (ルーティング判定 & 書き換え)   |
  |         │                                             |
  |  [VLAN 20 SVI] (192.168.20.1 / MAC: AABB.CC11.2233)    |
         │                               (2. 宛先MACをDBのMACに書き換え)
       ▼                                         │
[ DB Server (VLAN 20) ] ◄────────────────────────┘

1. フレームの到着とL2終端:
Webサーバーは、宛先IP(192.168.20.50)が自分とは異なるサブネットであると判断し、デフォルトゲートウェイ(VLAN 10のSVIのIP: 192.168.10.1)宛てのARPリクエストを投げた後、L3スイッチのSVIのMACアドレスを宛先MACとしたイーサネットフレームを送信します。
2. ASICによるL3ルックアップ(TCAM検索):
フレームがL3スイッチのポートに届くと、L2のスイッチング処理としてではなく、L3のルーティング処理としてASICがキャッチします。ASICは内蔵のTCAMを一瞬で参照し、192.168.20.0/24 がVLAN 20のSVIに直結されていることをハードウェアレベルで即座に特定します。
3. L2ヘッダーの書き換え(MACリライティング):
ルルーティングが行われるため、パケットのIPヘッダー(TTLが1減算される等)だけでなく、L2ヘッダーも書き換えられます。

  • 送信元MACアドレス:L3スイッチのSVIのMACアドレス
  • 宛先MACアドレス:VLAN 20側に存在するDBサーバーのMACアドレス(ARPキャッシュから取得)

4. VLAN 20からの送出:
書き換えられたパケットは、VLAN 20が割り当てられた物理ポートへ向けてワイヤーレートで送出され、無事にDBサーバーへと到達します。

この一連のプロセスが、CPUのコンテキストスイッチを一切挟まず、ナノ秒オーダーのレイテンシで実行されます。これがマルチレイヤー・スイッチの真骨頂です。

—

3. 実践!L3スイッチ(Cisco IOS-XE / Catalyst系)の設定例

現場で即座に使える、SVIを用いたVLAN間ルーティングの基本設定例を示します。
ここでは、VLAN 10(Web)とVLAN 20(DB)を収容し、L3スイッチ自身をそれぞれのデフォルトゲートウェイとして機能させる設定を行います。

! --- 1. グローバルでルーティング機能を有効化 (Ciscoの基本お作法) ---
ip routing

! --- 2. VLANの定義 ---
vlan 10
 name WEB-FRONT-VLAN
vlan 20
 name DB-BACKEND-VLAN

! --- 3. 各SVI(仮想インターフェース)にIPアドレスを付与 ---
interface Vlan10
 description Gateway for Web Servers
 ip address 192.168.10.1 255.255.255.0
 no shutdown

interface Vlan20
 description Gateway for DB Servers
 ip address 192.168.20.1 255.255.255.0
 no shutdown

! --- 4. サーバー接続用物理ポートの設定(アクセスポート) ---
interface GigabitEthernet1/0/1
 description Connected to Web Server 01
 switchport access vlan 10
 switchport mode access
 spanning-tree portfast
 no shutdown

interface GigabitEthernet1/0/2
 description Connected to DB Server 01
 switchport access vlan 20
 switchport mode access
 spanning-tree portfast
 no shutdown

現場のTips:SVIが「down」になる罠

インフラ構築の現場で最も多いトラブルの一つが、「IPアドレスを設定したのに、SVIのステータスが up/down のまま通信できない」 という現象です。
これは、L3スイッチの仕様上、「そのVLANに所属しているアクティブな物理ポート(L2ポート)が1つも存在しない(リンクアップしていない)場合、SVIはL2的にダウンしているとみなされ、ルーティング対象から外れる」 というルールがあるためです。

もしテスト段階で物理サーバーが接続されていない状態でSVIの疎通を確認したい場合は、ダミーの物理ポートに対して shutdown を解除するか、次項で紹介する仮想的なループバックやテスト用設定を組み合わせる必要があります。

—

4. デバッグと運用の現場から:パケットが流れないときのトラブルシューティング

APIサーバーからDBサーバーへ向けてテスト用の疎通確認(例えば、Pythonスクリプトやcurlを用いた疎通テスト)を行った際、パケットがピクリとも動かない場合に確認すべきステップを、実務のシニア目線で伝授します。

ステップ1: SVI自体の状態とARPテーブルの確認

まずはL3スイッチにSSHログインし、SVIが本当にルーティング可能な状態にあるか確認します。

# SVIのステータスとIPアドレスの確認
show ip interface brief | include Vlan

# 出力例:
# Interface          IP-Address      OK? Method Status                Protocol
# Vlan10             192.168.10.1    YES manual up                    up
# Vlan20             192.168.20.1    YES manual up                    up

ここで Status と Protocol の両方が up になっていることを確認してください。片方が down の場合は、物理ポートのリンク切れやVLANの割り当てミスを疑います。

次に、ARPテーブルが正しく解決されているか確認します。

show ip arp | include Vlan

もし宛先サーバーのIPに対するMACアドレスが Incomplete になっている場合、L3スイッチからサーバーへARPリクエストが届いていない、あるいはサーバー側がファイアウォール(iptablesやWindows Firewallなど)でARPやICMPをドロップしている可能性があります。

ステップ2: アプリケーション層・APIからの疎通検証コード

インフラの疎通が担保されたら、Web APIのクライアント側(Python等)から実際にトラフィックを流し、レイヤー4(TCP)レベルでのルーティングを確認します。以下のスクリプトは、VLANを跨いだ通信におけるTCPコネクション確立(3Wayハンドシェイク)の成否を検証する実践的なコードです。

import socket
import sys

def verify_vlan_routing(target_ip, target_port, timeout=3.0):
    """
    L3スイッチのSVIを経由したVLAN間ルーティングおよび
    TCPレイヤーの疎通性を検証するデバッグスクリプト
    """
    print(f"[*] 疎通確認中: 宛先 {target_ip}:{target_port} ...")
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout)
    
    try:
        # TCP 3Wayハンドシェイクの実行(SVIによるルーティングが正常なら成功する)
        sock.connect((target_ip, target_port))
        print(f"[SUCCESS] ルーティングおよびポート開放確認完了: {target_ip}:{target_port} への接続に成功しました。")
        
    except socket.timeout:
        print(f"[ERROR] タイムアウト: {target_ip} へのパケットが途中で破棄されているか、ルートが存在しません。", file=sys.stderr)
        print("        -> L3スイッチのARPキャッシュやデフォルトルート、ACLを確認してください。", file=sys.stderr)
    except socket.error as e:
        print(f"[ERROR] ソケットエラーが発生しました: {e}", file=sys.stderr)
    finally:
        sock.close()

if __name__ == "__main__":
    # 例: VLAN 10 から VLAN 20 にあるDB/APIサーバーへ接続
    TARGET_DB_IP = "192.168.20.50"
    TARGET_PORT = 5432  # PostgreSQL等のポート
    
    verify_vlan_routing(TARGET_DB_IP, TARGET_PORT)

このスクリプトを実行してタイムアウトする場合は、ネットワーク層だけでなく、OS側のルートテーブル(ip route コマンドなど)でデフォルトゲートウェイが正しくL3スイッチのSVI IPに設定されているかも必ずダブルチェックしてください。サーバー側のデフォルトゲートウェイが間違っていると、パケットはL3スイッチにたどり着くことすらできません。

—

5. まとめ

SVIを用いたマルチレイヤー・スイッチによるルーティングは、現代のローカルネットワークおよびデータセンターインフラの心臓部です。
物理ルーターのボトルネックを排除し、ASICのハードウェア処理によって極限まで遅延を削ぎ落とすこの仕組みは、高スプレッドが求められるWeb APIや、マイクロサービス間のトラフィックを支える基盤技術として、今後も廃れることはありません。

「なぜこのパケットはここで曲がるのか」「ASICのTCAMはどう解釈しているのか」——。
パケットの旅路を頭の中で完璧にトレースできるようになったとき、あなたのインフラエンジニアとしてのスキルは、間違いなく次のステージへと到達しています。

日々の運用や設計の現場で、ぜひこの知識を武器に、堅牢で爆速なネットワークを築き上げてください。

コメント

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