VLANの基本設定:深夜2時に叩き起こされて学んだこと

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

深夜2時の電話が、VLANへの考え方を変えた

3年前、「オフィスからサーバーに接続できない」という理由でアラートが来た。1人だけではない——60人全員が使えない状態だった。ベッドから転がり出て、VPNに接続し、幽霊を追いかけるように45分を費やした末に分かったのは、誰かがラップトップを誤ったスイッチポートに接続し、ネットワークセグメント全体を落としていたということだった。

原因はケーブルでもNICの不具合でもなかった。1つのトランクポートにVLAN設定が抜けていただけだ。その夜はSLAペナルティで4,000ドルの損失となり、VLANを最初から正しく設定することの大切さが骨身に染みた。

今まさに何かが壊れているのか、あるいは同じ状況を避けたいのか——このガイドはそんなあなたのために書いた。

ネットワークが「壊れる」とき、実際に何が起きているのか

「スイッチのせい」にされるネットワーク障害の多くは、実際にはVLANの設定ミスだ。コマンドに入る前に、フレームレベルでVLANが何をしているのかを理解する必要がある。問題の本質が分かれば、修正方法は自ずと見えてくる。

VLAN(仮想LAN)は、物理ネットワークを独立したブロードキャストドメインに分割する。VLAN 10のデバイスは、トラフィックがレイヤー3デバイスを経由しない限り、VLAN 20のデバイスと通信できない。これはバグではなく、セキュリティモデルだ。

スイッチポートは2つのモードのどちらかで動作する:

  • アクセスポート — 1つのVLANにのみ属し、エンドデバイスに転送する前にVLANタグを取り除く。ワークステーション、プリンター、IoTデバイスはここに接続する。
  • トランクポート — 802.1Qヘッダーでタグ付けされた複数のVLANを伝送する。スイッチ間リンクやスイッチ-ルーター間リンクで使用する。

先ほど説明した障害の話に戻ると、新しいVLANをスイッチに追加したものの、アクセス層とディストリビューション層の間のトランクポートで許可するのを忘れていたことが原因だった。新しいVLANからのトラフィックには行き場がなかった。

根本原因分析:本番環境でVLAN設定が失敗する理由

何年もオンコール対応を続ける中で、繰り返し見てきたVLAN障害を整理した:

  1. トランクポートでVLANが抜けている — 一方のスイッチにVLAN 30を追加したのに、アップリンクのトランクで許可するのを忘れた。トラフィックがブラックホールに落ちる。
  2. ネイティブVLANのミスマッチ — スイッチAのネイティブVLANが1、スイッチBが99の場合、タグなしトラフィックが誤って割り当てられる。追跡が非常に難しい断続的な接続問題が発生する。
  3. STPトポロジーの変更 — スパニングツリーの優先度を確認せずに新しいVLANを追加すると、予期しないルートブリッジ選出が発生する。
  4. VLAN間ルーティングが設定されていない — VLANは存在するが、VLAN間のレイヤー3パスがない。ユーザーは自分のVLAN内でpingできるが、他はどこにも到達できない。
  5. VLANデータベースにVLANが存在しない — ポートをVLAN 50に割り当てたのに、VLAN 50が作成されていない。ポートが非アクティブ状態になる。

ほぼすべてのVLAN障害は、この5つのどれかに当てはまる。全部経験してしまえば、もう勘で探ることはなく、チェックリストに直行できるようになる。

比較:Cisco IOS vs. Open vSwitch vs. Linux Bridge

コマンドはプラットフォームによって異なって見えるが、根本的なロジックは変わらない。よく使う3つの環境での違いを以下にまとめる。

選択肢1:Cisco IOS(Catalystスイッチ)

最も一般的なエンタープライズ環境だ。VLANを作成してポートに割り当てるのは簡単:

# VLANデータベースにVLANを作成する
switch# configure terminal
switch(config)# vlan 10
switch(config-vlan)# name OFFICE
switch(config-vlan)# vlan 20
switch(config-vlan)# name SERVERS
switch(config-vlan)# exit

# アクセスポートを設定する(例:ワークステーション用 Gi0/1)
switch(config)# interface GigabitEthernet0/1
switch(config-if)# switchport mode access
switch(config-if)# switchport access vlan 10
switch(config-if)# spanning-tree portfast
switch(config-if)# exit

# トランクポートを設定する(例:Gi0/24 アップリンク)
switch(config)# interface GigabitEthernet0/24
switch(config-if)# switchport mode trunk
switch(config-if)# switchport trunk encapsulation dot1q
switch(config-if)# switchport trunk allowed vlan 10,20
switch(config-if)# switchport trunk native vlan 999
switch(config-if)# exit

# 設定を保存する
switch# write memory

native vlan 999の設定は意図的なものだ。ネイティブVLANは常に未使用のVLANに設定している。VLAN 1のままにしておくのはよく知られたセキュリティリスクだ(VLANホッピング攻撃はネイティブVLAN 1を悪用する)。

選択肢2:Open vSwitch(仮想化/SDN環境)

KVM、OpenStack、またはSDNベースのインフラを使っているなら、Open vSwitchのVLAN処理は少し異なる:

# ブリッジを作成する
ovs-vsctl add-br br0

# 物理インターフェースをトランクとして追加する
ovs-vsctl add-port br0 eth0

# VMインターフェースをVLAN 10のアクセスポートとして追加する
ovs-vsctl add-port br0 vnet0 tag=10

# VLAN 10と20を許可するトランクポートを追加する
ovs-vsctl add-port br0 eth1 trunks=10,20

# 確認する
ovs-vsctl show
ovs-ofctl show br0

選択肢3:Linuxカーネルブリッジ(シンプルなサーバー/コンテナ)

フルSDNスタックなしでVLANに参加する必要があるLinuxサーバーの場合:

# まだロードされていない場合は8021qモジュールをロードする
modprobe 8021q
echo "8021q" >> /etc/modules

# eth0上にVLAN 10用のVLANインターフェースを作成する
ip link add link eth0 name eth0.10 type vlan id 10
ip link set eth0.10 up
ip addr add 192.168.10.100/24 dev eth0.10

# ブリッジを作成してVLANインターフェースをアタッチする
ip link add name br-vlan10 type bridge
ip link set eth0.10 master br-vlan10
ip link set br-vlan10 up

# /etc/network/interfacesに永続化する(Debian/Ubuntu)
cat >> /etc/network/interfaces << 'EOF'
auto eth0.10
iface eth0.10 inet manual
  vlan-raw-device eth0

auto br-vlan10
iface br-vlan10 inet static
  bridge_ports eth0.10
  address 192.168.10.100
  netmask 255.255.255.0
EOF

最善の方法:Router-on-a-StickによるVLAN間ルーティング

VLANはトラフィックを分離するが、ユーザーはセグメントをまたいで通信する必要がある。VLAN 10のワークステーションはVLAN 20のサーバーに接続しなければならない。レイヤー3スイッチがない場合、最もシンプルな解決策がRouter-on-a-Stickだ。スイッチとルーターの間に1本のトランクリンクを引き、各VLANをサブインターフェースで処理する。

この構成を、本番環境で15以上のVLANを持つ1本のアップリンクで運用してきた。高負荷のトラフィック下でも十分に機能し、設定の監査も容易なままだ。

# Ciscoルーター上 — VLAN間ルーティング用にサブインターフェースを設定する
router# configure terminal

# VLAN 10 サブインターフェース
router(config)# interface GigabitEthernet0/0.10
router(config-subif)# encapsulation dot1Q 10
router(config-subif)# ip address 192.168.10.1 255.255.255.0
router(config-subif)# exit

# VLAN 20 サブインターフェース
router(config)# interface GigabitEthernet0/0.20
router(config-subif)# encapsulation dot1Q 20
router(config-subif)# ip address 192.168.20.1 255.255.255.0
router(config-subif)# exit

# 物理インターフェースを有効化する
router(config)# interface GigabitEthernet0/0
router(config-if)# no shutdown
router(config-if)# exit
router# write memory

設定が完了したら、VLAN 10ホストのデフォルトゲートウェイ192.168.10.1に、VLAN 20ホストを192.168.20.1に設定する。VLAN間のトラフィックはルーターのサブインターフェースを経由してルーティングされるようになる。

覚えておくべき確認コマンド

深夜2時に何か壊れたとき、インターネットを検索する時間はない。私が順番に実行するコマンドを以下に挙げる:

# VLANデータベースを確認 — VLANが実際に作成されているか?
show vlan brief

# トランクの状態を確認 — VLANがトランクで許可されているか?
show interfaces trunk

# 特定のインターフェースを確認する
show interfaces GigabitEthernet0/24 trunk
show interfaces GigabitEthernet0/1 switchport

# 特定のVLANのMACアドレステーブルを確認する
show mac address-table vlan 10

# VLAN別のスパニングツリーを確認する
show spanning-tree vlan 10

# Linux用 — VLANインターフェースを確認する
ip link show type vlan
cat /proc/net/vlan/config

# Open vSwitch用 — ポートの設定を確認する
ovs-vsctl list port
ovs-vsctl get port vnet0 tag

5分でできる変更前チェックリスト

本番環境でVLAN設定を変更するたびに、作業前に必ずこのチェックリストを実行する:

  1. 現在の状態を記録する:show running-config → ファイルに保存
  2. ポートに割り当てる前に、VLANデータベースにVLANが存在することを確認する
  3. トランクポートを確認し、新しいVLANが許可されることを確かめる
  4. すべてのトランクの両端でネイティブVLANが一致していることを確認する
  5. 変更後:show vlan briefとpingテストで確認する

実際のところ、このチェックリストで少なくとも十数件の問題を、深夜の緊急対応になる前に防いできた。深夜2時の45分間のデバッグより、5分の確認作業の方がはるかにいい——どうして知っているかって?身を持って経験したからだ。

クイックトラブルシューティングリファレンス

  • ポートがinactive/notconnect状態 → VLANデータベースにVLANが存在しない。show vlan briefを実行して作成する。
  • VLAN内では通信できるがVLAN間では通信できない → VLAN間ルーティングが設定されていないか、サブインターフェースが不足している。
  • スイッチ間の断続的な接続問題 → ネイティブVLANのミスマッチ。両方のスイッチでshow interfaces trunkを実行して比較する。
  • 新しいVLANがアップストリームに到達できない → トランクでVLANが許可されていない。switchport trunk allowed vlan add 30で追加する(switchport trunk allowed vlan 30ではない——これは許可リスト全体を置き換えてしまう)。
  • デフォルトゲートウェイにpingできない → サブインターフェースがdownか、カプセル化が間違っている。show interfaces GigabitEthernet0/0.10を確認する。

2つのことを身につければ、VLANは怖くなくなる。アクセスとトランクのモデル、そして5つの障害パターンだ。構文はベンダーやプラットフォームによって異なる。しかしロジックは変わらない——タグはトランクポートで付き、アクセスポートで外れ、トラフィックはレイヤー3でのみVLANの境界をまたぐ。

ネイティブVLANを未使用のものに設定し、変更のたびにトランクを確認し、チェックリストを手元に置いておく。将来の自分——深夜2時にアラートを受け取るあなた——がきっと感謝するだろう。

Share: