⏱ 約 60 分 · Linux Bridge と VLAN
Part 2Chapter 03/ネットワーク基礎

Linux Bridge と VLAN -- 自分で仮想スイッチを作る

VLAN10 と VLAN20 を「別々の島」として捉え、learner01 の中に小さな Linux bridge を作ります。さらに TL-SG108E の Web UI でアクセスポートとトランクポートを確認し、VLAN が L2 の分離であり、セグメントを越える通信は次章の L3 ルーティングで扱うことを切り分けます。

所要時間約 60 分
章タイプstandard
前提知識Part 1 全章 / Part 2 Chapter 1(ip a・CIDR・ip route)/ Chapter 2(MAC・ARP・tcpdump
使用機材workstation01ssh student@learner01、物理スイッチ: TL-SG108E Web UI
関連章前: Chapter 2「ARP と MAC」/ 次: Chapter 4「ルーティング / OSPF」

VLAN でネットワークを島に分ける

Chapter 2 では、ARP request が同じセグメント内にブロードキャストされる様子を見ました。この章の問いは、その 「同じセグメント」は誰が決めているのかです。答えは L2 スイッチです。Linux では、そのスイッチを bridge として自分で作れます。

VLAN は、1 台の物理スイッチを複数の島に分ける仕組みです。この教材では VLAN10 をオフィス側、VLAN20 をサーバ側として扱います。learner01 は VLAN10 にいる前提です。VLAN10 から VLAN20 へ直接ワープするわけではなく、セグメントを越える通信は Chapter 4 のルータが担当します。

learner01 の中 br-ch3 を作り、dummy IF と VLAN サブ IF を組み合わせてタグの付与を観察します。
TL-SG108E Web UI で VLAN10 / VLAN20、Untagged / Tagged、PVID を確認します。
Chapter 4 へ VLAN を越える通信は L3 ルータと経路表で扱います。この章では L2 までに留めます。
VLAN10オフィス側

172.16.10.0/24learner01 がいる受講者側セグメントです。Chapter 4 では 172.16.10.1 がデフォルトゲートウェイになります。

VLAN20サーバ側

172.16.20.0/24webserver01 172.16.20.10 がいるセグメントです。次章以降ではこの VLAN20 が ルータ間の接続区間(transit)も兼ねます。ここへ届かせる L3 の話は次章です。

この章のゴール: learner01 上で Linux bridge と VLAN サブインターフェースを作り、ip link / bridge link / tcpdump -e で 802.1Q タグを読めるようにします。最後に TL-SG108E の Web UI 上で、同じ概念が物理ポート設定として出てくることを確認します。

この章を終えるとできること

作る、つなぐ、タグを見る、ポート種別を読むの 4 動作を手に入れます。

$ ip link add
br-ch3 type bridge
sudo set up
① 作る
Linux bridge を
自分で立てる
ip link
dummy port
master br-ch3
bridge link
② つなぐ
仮想 NIC を
bridge 配下に置く
bridge link
802.1Q 0x8100
vlan 10
length +4B
③ 覗く
親 IF で
タグを見る
tcpdump -e
access untagged
trunk tagged
PVID 10
④ 読む
TL-SG108E の
表を読める
VLAN Web UI

Linux bridge と VLAN の考え方

1. Linux bridge はカーネルが作る仮想スイッチ

物理スイッチは、ポートに入ってきた Ethernet フレームを、MAC アドレスを見ながら必要なポートへ転送します。Linux bridge も同じです。どの MAC アドレスがどのポートから見えたかを学習し、未知の宛先やブロードキャストは複数ポートへ流します。

物理スイッチの言葉Linux bridge の言葉この章の例
スイッチ本体bridge デバイスbr-ch3
ポートbridge にぶら下がるインターフェースdummy-ch3a / dummy-ch3b
MAC アドレス表FDB(Forwarding Database)bridge fdb show br br-ch3
転送中state forwardingbridge link show で確認

2. VLAN tag は 4 バイトのラベル

VLAN は Ethernet フレームに 802.1Q タグを差し込みます。タグは 4 バイトで、前半 2 バイトの 0x8100 が「これは VLAN タグ付き」と示し、後半 2 バイトの TCI に VLAN ID などが入ります。

宛先 MAC
6B
送信元 MAC
6B
0x8100
2B
TCI
2B
Ethertype
2B

この 4 バイトがあるため、親インターフェースで tcpdump -e すると ethertype 802.1Q (0x8100), vlan 10 のように見えます。一方、VLAN サブインターフェース側ではタグが剥がれた後のフレームを見るので、ただの ARP に見えます。

3. アクセスポートとトランクポート

TL-SG108E の Web UI で一番混乱しやすいのが、Tagged / Untagged / PVID の組み合わせです。最初は次の対応だけ覚えます。

種類役割典型例見るポイント
アクセスポートタグを知らない機器を 1 つの VLAN に入れるPC、受講者 VM、単一セグメントのサーバUntagged + PVID が同じ VLAN
トランクポート複数 VLAN のタグ付きフレームをまとめて通すスイッチ間、ルータ、Proxmox ホストVLAN10 / VLAN20 が Tagged

4. 8021q モジュールと vlan_dev

Linux で ip link add link X name X.10 type vlan id 10 を実行すると、vlan_dev という仮想デバイスができます。送信時はタグを付け、受信時はタグを読んで剥がします。この処理を使うために、演習の最初で sudo modprobe 8021q を実行します。

範囲の線引き: この章は L2 の章です。bridge や VLAN は「同じ島の中でフレームをどう扱うか」を決めます。VLAN10 から VLAN20 へ IP パケットを運ぶ L3 ルーティングは、次の Chapter 4 で扱います。

演習:bridge を作り、VLAN tag を見て、TL-SG108E と対応させる

項目
接続方法workstation01 から ssh student@learner01
操作ホストlearner01ip link / bridge / tcpdump の一部に sudo を使います。
仮想構成br-ch3dummy-ch3adummy-ch3bdummy-ch3a.10 など。既存 NIC や SSH には触りません。
物理確認TL-SG108E Web UI で VLAN10 / VLAN20 の Tagged / Untagged / PVID を確認します。
安全範囲learner01 内の一時インターフェースは章末で削除できます。TL-SG108E は講師指定ポートだけを触り、一般受講環境では確認のみです。
開始前: まだ learner01 に入っていない場合は、workstation01 から ssh student@learner01 で入ります。以下の Linux コマンドは learner01 上で実行します。

STEP 01 · learner01 に入り、8021q をロードする

最初に learner01 へ入ります。その後、VLAN サブインターフェースを扱うための 8021q モジュールをロードします。

bash · workstation01 から接続
ssh student@learner01
bash · learner01
hostname
sudo modprobe 8021q
lsmod | grep 8021q || true
ip -br link

lsmod8021q が出ていれば OK です。出力が空でも、以降の ip link add ... type vlan が成功すれば読み込み済みとして進めます。

STEP 02 · Linux bridge と仮想ポートを作る

br-ch3 という仮想スイッチを作り、2 本の dummy インターフェースをポートとしてつなぎます。先頭の削除行は、前回の残りがあってもやり直せるようにするための安全策です。

bash · learner01
sudo ip link delete br-ch3 2>/dev/null || true
sudo ip link delete dummy-ch3a 2>/dev/null || true
sudo ip link delete dummy-ch3b 2>/dev/null || true
sudo ip link add br-ch3 type bridge
sudo ip link set br-ch3 up
sudo ip link add dummy-ch3a type dummy
sudo ip link add dummy-ch3b type dummy
sudo ip link set dummy-ch3a up
sudo ip link set dummy-ch3b up
sudo ip link set dummy-ch3a master br-ch3
sudo ip link set dummy-ch3b master br-ch3
bridge link show
ip -br link show type bridge

bridge link showmaster br-ch3state forwarding が見えれば、dummy ポートは bridge の配下に入っています。

STEP 03 · VLAN サブインターフェースを作る

dummy ポートの上に VLAN10 / VLAN20 のサブインターフェースを作ります。名前の .10.20 は慣習で、実際の VLAN ID は type vlan id 10 の部分で決まります。

bash · learner01
sudo ip link add link dummy-ch3a name dummy-ch3a.10 type vlan id 10
sudo ip link add link dummy-ch3a name dummy-ch3a.20 type vlan id 20
sudo ip link add link dummy-ch3b name dummy-ch3b.10 type vlan id 10
sudo ip link set dummy-ch3a.10 up
sudo ip link set dummy-ch3a.20 up
sudo ip link set dummy-ch3b.10 up
ip -br link show type vlan
ip -d link show dummy-ch3a.10

ip -d link showvlan protocol 802.1Q id 10 が出ます。これが、このサブインターフェースが VLAN10 を扱う vlan_dev である証拠です。

STEP 04 · IP を付け、タグが見える場所を分ける

VLAN10 のサブインターフェースに検証用 IP を付けます。その後、親 IF と VLAN サブ IF のどちらで tcpdump するかを分けます。タグが見えるのは親 IF 側です。

bash · learner01
sudo ip addr add 10.0.10.1/24 dev dummy-ch3a.10
sudo ip addr add 10.0.10.2/24 dev dummy-ch3b.10
ip -br addr show type vlan
ip route get 10.0.10.2 from 10.0.10.1
ping ではなく arping を使う理由: 同じ Linux ホスト内にある 2 つの IP は local ルートとして処理されることがあります。L2 フレームを確実に出してタグを見るため、この章では arping で ARP request を発生させます。なおこの章の目的は到達確認ではなく「タグの観察」です。arping の宛先(10.0.10.254)が実在しなくても、親 IF からタグ付きフレームが出る様子は確認できます(dummy-ch3b.10 に付けた 10.0.10.2 は「相手側にも VLAN10 がある」ことを示す配置で、応答自体はこの章では使いません)。

STEP 05 · tcpdump -e で 802.1Q tag を見る

ターミナルを 2 つ使います。先に親 IF で待ち受け、別ターミナルから arping を実行します。親 IF では ethertype 802.1Qvlan 10 が見えるはずです。

bash · learner01 ターミナルA(親 IF)
sudo tcpdump -e -n -i dummy-ch3a -c 5 vlan or arp
bash · learner01 ターミナルB(フレーム生成)
sudo arping -c 3 -I dummy-ch3a.10 10.0.10.254
期待する見え方
dummy-ch3a  : ethertype 802.1Q (0x8100), vlan 10, ethertype ARP
dummy-ch3a.10: ethertype ARP (0x0806) だけに見える

同じ ARP でも、親 IF ではタグ付き、VLAN サブ IF ではタグ剥離後として見えます。この差が vlan_dev の仕事です。

STEP 06 · TL-SG108E Web UI で VLAN10 / VLAN20 を読む

ここからはブラウザ操作です。コマンドではないため、コピー対象には入れません。講師指定の演習枠では設定を試し、通常の受講環境では確認だけにします。

TL-SG108E Web UI で見る順序
802.1Q VLAN VLAN10 と VLAN20 が存在することを確認します。VLAN10 は learner01 側、VLAN20 はサーバ側です。
Tagged アップリンクやルータ接続など、複数 VLAN を運ぶポートでは VLAN10 / VLAN20 が Tagged になっていることを確認します。
Untagged learner01 のアクセスポートは VLAN10 の Untagged、webserver01 側は VLAN20 の Untagged として読みます。
PVID タグなしフレームを受けたとき、どの VLAN として扱うかを決める値です。learner01 側なら PVID 10 が対応します。
🛰 ライブビューで見る

Web UI でやっていることは、STEP 03 の vlan_dev と同じ発想です。アクセスポートではタグなしの機器を特定 VLAN に入れ、トランクポートではタグ付きのまま複数 VLAN を通します。

STEP 07 · 後始末し、できたことを言葉にする

演習で作った一時インターフェースを削除します。削除対象が既にない場合はエラーを無視します。最後に br-ch3dummy-ch3 が残っていないことを確認します。

bash · learner01 リセット
sudo ip link delete dummy-ch3a.10 2>/dev/null || true
sudo ip link delete dummy-ch3a.20 2>/dev/null || true
sudo ip link delete dummy-ch3b.10 2>/dev/null || true
sudo ip link set dummy-ch3a nomaster 2>/dev/null || true
sudo ip link set dummy-ch3b nomaster 2>/dev/null || true
sudo ip link delete br-ch3 2>/dev/null || true
sudo ip link delete dummy-ch3a 2>/dev/null || true
sudo ip link delete dummy-ch3b 2>/dev/null || true
ip link show | grep -E 'br-ch3|dummy-ch3' || echo 'clean'
ゴール到達 ✓ Linux bridge を作り、VLAN サブインターフェースを作り、親 IF と VLAN サブ IF で 802.1Q タグの見え方が変わることを確認しました。TL-SG108E の Web UI では、この同じ考え方が Tagged / Untagged / PVID として表に出ます。

つまずきポイント

type vlan が作れない

RTNETLINK answers: Operation not supported や類似のエラーが出る場合は、まず 8021q モジュールを確認します。

bash · learner01
sudo modprobe 8021q
lsmod | grep 8021q || true
ip -d link show dummy-ch3a.10

ip -d link showvlan protocol 802.1Q id 10 が表示されれば、VLAN サブ IF は作れています。

File exists が出て作り直せない

前回の br-ch3dummy-ch3a が残っています。STEP 07 のリセットを実行してから、STEP 02 に戻ります。

ip link show | grep -E 'br-ch3|dummy-ch3' で何も出なければ、章の一時デバイスは残っていません。

tcpdump に ethertype 802.1Q が出てこない

一番多い原因は、監視している IF が VLAN サブ IF になっていることです。タグを見るなら dummy-ch3a.10 ではなく、親 IF の dummy-ch3a を監視します。

また、フレームを発生させる側は sudo arping -c 3 -I dummy-ch3a.10 10.0.10.254 のように、VLAN サブ IF を指定します。

Tagged / Untagged / PVID が混ざる

アクセスポートは「タグなしで入ってきたものを、PVID の VLAN に入れる」ポートです。learner01 側なら VLAN10 Untagged + PVID 10 と読めます。

トランクポートは「タグ付きのまま複数 VLAN を運ぶ」ポートです。VLAN10 と VLAN20 の両方が Tagged になっているポートは、複数の島を 1 本で運ぶ道です。

VLAN10 から VLAN20 に ping できない

この章だけでは正常です。VLAN は L2 の分離なので、VLAN10 と VLAN20 の間を IP で越えるには L3 ルータが必要です。次の Chapter 4 で l3router01 と経路表を使って扱います。

AI に相談

AI bridge / VLAN / TL-SG108E の見分け方を質問できます
この章の learner01 / TL-SG108E / VLAN10・20 構成を前提に説明します

修了確認

Linux bridge と VLAN の見え方を 2 問だけ確認します。

問 1 · 802.1Q tag が見える場所を説明する

sudo arping -I dummy-ch3a.10 10.0.10.254 を実行しました。dummy-ch3a で tcpdump すると ethertype 802.1Q が見え、dummy-ch3a.10 で見ると ARP だけに見えました。なぜですか?

解答を見る

dummy-ch3a.10 は VLAN サブインターフェースです。ここでは vlan_dev がタグを付ける前、または剥がした後のフレームを見ます。

親 IF の dummy-ch3a では、vlan_dev が 802.1Q の 4 バイトを付けた後のフレームを見るため、ethertype 802.1Q (0x8100), vlan 10 が表示されます。

問 2 · TL-SG108E のポート種別を読む

learner01 を VLAN10 に入れるポートは Untagged VLAN10PVID 10、アップリンクは Tagged VLAN10Tagged VLAN20 でした。この 2 つのポートは、それぞれアクセスポートとトランクポートのどちらですか?また VLAN10 から VLAN20 へ通信するには何が必要ですか?

解答を見る

learner01 側はアクセスポートです。タグなしフレームを VLAN10 として扱うため、Untagged VLAN10 + PVID 10 になります。

アップリンクはトランクポートです。VLAN10 と VLAN20 をタグ付きのまま運びます。ただし、VLAN10 から VLAN20 へ IP 通信するには L3 ルータが必要です。これは Chapter 4 の範囲です。

💡 修了確認の段階ヒント(問 1・問 2 共通)

💡 段階ヒント 1 段目:見る場所を分ける
タグを見るなら親 IF、アプリが見るフレームに近い姿を見るなら VLAN サブ IF です。.10 が付いた IF は、タグ処理後の入り口です。
💡 段階ヒント 2 段目:タグなし機器の扱いを見る
タグを知らない learner01 を VLAN10 に入れるなら、スイッチ側は Untagged + PVID 10 で受けます。これがアクセスポートの基本形です。
💡 段階ヒント 3 段目:L2 と L3 を混ぜない
VLAN は島を分ける L2 の仕組みです。島と島の間を IP で越えるにはルータが必要です。次章では l3router01 と OSPF を使って、その境界を扱います。

次はルーティングへ

この章で、VLAN は「L2 の島を分ける仕組み」だと確認しました。次の Chapter 4 では、その島と島の間をどう渡るかを扱います。learner01 がいる VLAN10 から、webserver01 がいる VLAN20 へ、どのゲートウェイを通り、どの経路表を読めばよいかを実機で確認します。

さらに後続の仮想化パートでは、Proxmox の vmbr を VLAN-aware にする設定が出てきます。そこで迷わないための土台が、この章の Linux bridge と 802.1Q タグです。

Chapter 4: ルーティング / OSPF:
  • ip route でデフォルトゲートウェイを読む
  • VLAN20 の二役(サーバ網 + ルータ間 transit)を整理する
  • OSPF neighbor が Full になり、手で書いていない経路が生える様子を見る