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) |
| 使用機材 | workstation01 → ssh 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 のルータが担当します。
br-ch3 を作り、dummy IF と VLAN サブ IF を組み合わせてタグの付与を観察します。
172.16.10.0/24。learner01 がいる受講者側セグメントです。Chapter 4 では 172.16.10.1 がデフォルトゲートウェイになります。
172.16.20.0/24。webserver01 172.16.20.10 がいるセグメントです。次章以降ではこの VLAN20 が ルータ間の接続区間(transit)も兼ねます。ここへ届かせる L3 の話は次章です。
ip link / bridge link / tcpdump -e で 802.1Q タグを読めるようにします。最後に TL-SG108E の Web UI 上で、同じ概念が物理ポート設定として出てくることを確認します。この章を終えるとできること
作る、つなぐ、タグを見る、ポート種別を読むの 4 動作を手に入れます。
自分で立てる
bridge 配下に置く
タグを見る
表を読める
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 forwarding | bridge link show で確認 |
2. VLAN tag は 4 バイトのラベル
VLAN は Ethernet フレームに 802.1Q タグを差し込みます。タグは 4 バイトで、前半 2 バイトの 0x8100 が「これは VLAN タグ付き」と示し、後半 2 バイトの TCI に VLAN ID などが入ります。
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 を実行します。
演習:bridge を作り、VLAN tag を見て、TL-SG108E と対応させる
| 項目 | 値 |
|---|---|
| 接続方法 | workstation01 から ssh student@learner01 |
| 操作ホスト | learner01。ip link / bridge / tcpdump の一部に sudo を使います。 |
| 仮想構成 | br-ch3、dummy-ch3a、dummy-ch3b、dummy-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 モジュールをロードします。
ssh student@learner01
hostname sudo modprobe 8021q lsmod | grep 8021q || true ip -br link
lsmod に 8021q が出ていれば OK です。出力が空でも、以降の ip link add ... type vlan が成功すれば読み込み済みとして進めます。
STEP 02 · Linux bridge と仮想ポートを作る
br-ch3 という仮想スイッチを作り、2 本の dummy インターフェースをポートとしてつなぎます。先頭の削除行は、前回の残りがあってもやり直せるようにするための安全策です。
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 show に master br-ch3 と state forwarding が見えれば、dummy ポートは bridge の配下に入っています。
STEP 03 · VLAN サブインターフェースを作る
dummy ポートの上に VLAN10 / VLAN20 のサブインターフェースを作ります。名前の .10 や .20 は慣習で、実際の VLAN ID は type vlan id 10 の部分で決まります。
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 show に vlan protocol 802.1Q id 10 が出ます。これが、このサブインターフェースが VLAN10 を扱う vlan_dev である証拠です。
STEP 04 · IP を付け、タグが見える場所を分ける
VLAN10 のサブインターフェースに検証用 IP を付けます。その後、親 IF と VLAN サブ IF のどちらで tcpdump するかを分けます。タグが見えるのは親 IF 側です。
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
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.1Q と vlan 10 が見えるはずです。
sudo tcpdump -e -n -i dummy-ch3a -c 5 vlan or arp
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 を読む
ここからはブラウザ操作です。コマンドではないため、コピー対象には入れません。講師指定の演習枠では設定を試し、通常の受講環境では確認だけにします。
Web UI でやっていることは、STEP 03 の vlan_dev と同じ発想です。アクセスポートではタグなしの機器を特定 VLAN に入れ、トランクポートではタグ付きのまま複数 VLAN を通します。
STEP 07 · 後始末し、できたことを言葉にする
演習で作った一時インターフェースを削除します。削除対象が既にない場合はエラーを無視します。最後に br-ch3 や dummy-ch3 が残っていないことを確認します。
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'
つまずきポイント
type vlan が作れない
RTNETLINK answers: Operation not supported や類似のエラーが出る場合は、まず 8021q モジュールを確認します。
sudo modprobe 8021q lsmod | grep 8021q || true ip -d link show dummy-ch3a.10
ip -d link show に vlan protocol 802.1Q id 10 が表示されれば、VLAN サブ IF は作れています。
File exists が出て作り直せない
前回の br-ch3 や dummy-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 に相談
修了確認
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 VLAN10 で PVID 10、アップリンクは Tagged VLAN10 と Tagged VLAN20 でした。この 2 つのポートは、それぞれアクセスポートとトランクポートのどちらですか?また VLAN10 から VLAN20 へ通信するには何が必要ですか?
解答を見る
learner01 側はアクセスポートです。タグなしフレームを VLAN10 として扱うため、Untagged VLAN10 + PVID 10 になります。
アップリンクはトランクポートです。VLAN10 と VLAN20 をタグ付きのまま運びます。ただし、VLAN10 から VLAN20 へ IP 通信するには L3 ルータが必要です。これは Chapter 4 の範囲です。
💡 修了確認の段階ヒント(問 1・問 2 共通)
💡 段階ヒント 1 段目:見る場所を分ける
.10 が付いた IF は、タグ処理後の入り口です。💡 段階ヒント 2 段目:タグなし機器の扱いを見る
💡 段階ヒント 3 段目:L2 と L3 を混ぜない
l3router01 と OSPF を使って、その境界を扱います。次はルーティングへ
この章で、VLAN は「L2 の島を分ける仕組み」だと確認しました。次の Chapter 4 では、その島と島の間をどう渡るかを扱います。learner01 がいる VLAN10 から、webserver01 がいる VLAN20 へ、どのゲートウェイを通り、どの経路表を読めばよいかを実機で確認します。
さらに後続の仮想化パートでは、Proxmox の vmbr を VLAN-aware にする設定が出てきます。そこで迷わないための土台が、この章の Linux bridge と 802.1Q タグです。