本記事には広告(アフィリエイトリンク)が含まれます。

VLAN入門 802.1Qタグで論理ネットワーク分割

Linuxエンジニア養成講座 第22回|全36回・フェーズ3「ネットワークとインフラ基盤」の7回目(7/12回目)です。
前回まで: 第16回でTCP/IPの基礎、第17回でnmcliによるIP設定と疎通確認、第18回でプロキシ・DNS・NTPのクライアント設定、第19回でパッケージ管理、第20回でfirewalldによる通信制御、第21回でNICボンディングによる冗長化を学びました。
今回学ぶこと: 1つのNIC上にVLANサブインターフェースを作成し、論理的にネットワークを分割する技術を体験します。

この回は発展トピックです。受講者のアサイン先によってはスキップ可能で、スキップしても第23回以降に支障はありません。

前回の予告で「1つのNIC上に論理的にネットワークを分割する技術を学びます」とお伝えしました。今回はその技術である VLAN を理解し、nmcli で VLAN サブインターフェースを作成・確認・削除する一連の操作を体験します。

この記事を読み終えると、以下のことができるようになります。

  • VLAN が必要な理由と、物理スイッチを増やさずにネットワークを分割する考え方を説明できる
  • 802.1Q タグVLAN の仕組み(フレームにタグを挿入する方式)を説明できる
  • nmcli で VLAN サブインターフェースを作成・起動・確認できる
  • VLAN サブインターフェースを削除して元の状態に戻せる

なぜ VLAN が必要か

オフィスや データセンターでは、1台のネットワークスイッチに多数の機器が接続されています。たとえば、営業部のPC、開発部のPC、本番サーバー、検証サーバーが同じスイッチにつながっている場合を考えてみてください。

これらがすべて同じネットワーク(同じブロードキャストドメイン)に属していると、いくつかの問題が起きます。

  • セキュリティ — 営業部のPCから本番サーバーに直接アクセスできてしまう
  • ブロードキャストの氾濫 — 全端末のブロードキャストパケットが全端末に届き、ネットワーク帯域を圧迫する
  • 障害の波及 — 1台がブロードキャストストーム(大量のブロードキャストを送出する異常状態)を起こすと、全端末に影響する

これを解決する手段の1つが VLAN(Virtual LAN)です。VLAN を使うと、1台の物理スイッチの中にあたかも複数の独立したスイッチがあるかのように、ポートをグループ分けできます。部署ごと、用途ごとにネットワークを分離でき、物理スイッチを増やす必要がありません。

VLANの概念。上段はVLANなしで全端末が同一ネットワーク、ブロードキャストが全員に届く。下段はVLANありで同じスイッチのポートがVLAN 100とVLAN 200に色分けされ、同じVLANのポート同士だけが通信可能になる

VLAN は主にスイッチ側で構成する技術

VLAN の設定は主にネットワークスイッチ側で行います。スイッチの各ポートに「このポートは VLAN 100」「このポートは VLAN 200」のように割り当てるのが基本です。

では、なぜ Linux サーバー側にも VLAN の設定が必要になることがあるのでしょうか。それは、物理サーバーがスイッチのトランクポート(複数の VLAN のトラフィックを1本のケーブルで流すポート)に接続される場合です。トランクポートから届くフレームには VLAN ID のタグが付いており、サーバー側でそのタグを解釈して「VLAN 100 のパケットはこのIPアドレスで処理する」「VLAN 200 のパケットはこのIPアドレスで処理する」と振り分ける必要があります。

VLAN サブインターフェースは物理サーバーで使う技術

前回のボンディングと同様に、Linux 上での VLAN サブインターフェース作成は主に物理サーバーで行う作業です。仮想化基盤(VMware、Hyper-V、VirtualBox など)の環境では、ハイパーバイザーの仮想スイッチ側で VLAN ID を割り当てます。VM から見ると、タグなしの通常のネットワークインターフェースに見えるため、ゲスト VM 内で VLAN サブインターフェースを作成する必要は通常ありません。

今回の演習は、物理サーバーでの VLAN 設定を検証環境の VM 上で体験するものです。仕組みとコマンドを学ぶための演習として理解してください。

VLAN の仕組み

タグ VLAN(802.1Q)

タグ VLAN は IEEE 802.1Q という標準規格で定義された方式です。通常のイーサネットフレーム(第16回で学んだレイヤー2のデータ単位)に、4バイトの VLAN タグを挿入します。このタグの中に VLAN ID(0〜4095、実用は 1〜4094)が含まれており、どの VLAN に属するフレームかを識別します。

タグ VLAN が使われる代表的な場面は以下の通りです。

  • スイッチ間の接続(トランクリンク) — 2台のスイッチを1本のケーブルで接続し、複数の VLAN のトラフィックをタグ付きで流す
  • サーバーとスイッチのトランク接続 — 1本のケーブルで複数の VLAN の IP アドレスをサーバーに持たせる

ポート VLAN(補足)

ポート VLAN(アクセスポートとも呼ばれます)は、スイッチのポートごとに1つの VLAN を割り当てる方式です。接続された機器はタグを意識する必要がなく、一般的なPCやプリンターはこちらで接続されます。ポート VLAN の設定はスイッチ側のみで完結するため、今回の Linux サーバー側の設定としては扱いません。

Linux サーバーでの VLAN の役割

Linux サーバーがスイッチのトランクポートに接続される場合、カーネルの 8021q モジュールがフレームの VLAN タグを解釈します。物理 NIC(例: eth3)の上に VLAN サブインターフェース(例: eth3.100、eth3.200)を作成し、各サブインターフェースに異なる IP アドレスを割り当てることで、1枚の NIC で複数の VLAN に参加できます。

LinuxサーバーでのVLAN構成。スイッチのトランクポートからタグ付きフレームが1本のケーブルで届き、Linux側では物理NIC eth3の上にサブインターフェースeth3.100とeth3.200を作成して各VLANに異なるIPアドレスを割り当てる

今回の演習について

今回は alma-main 単体の自己完結型演習です。対向のネットワークスイッチや対向 VM は使いません。eth3(10.0.2.1、VLAN 演習専用)の上に VLAN サブインターフェースを作成し、状態の確認方法を学んだ後、削除して元に戻すところまでを体験します。

対向スイッチがないため、VLAN 越しの他機器との通信確認はできませんが、サブインターフェースの作成・IP 割り当て・VLAN ID の確認・自分自身への ping(self ping)で動作を確認します。

現在の eth3 の状態を確認する

VLAN を作成する前に、eth3 の現在の状態を確認しておきます。以下のコマンドはすべて alma-main で実行します。

実行コマンド:

$ ip addr show eth3

実行結果:

5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:01:63:3d brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.1/24 brd 10.0.2.255 scope global noprefixroute eth3
       valid_lft forever preferred_lft forever
    inet6 fe80::77cc:73f5:6d05:1ec5/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

eth3 は 10.0.2.1/24 が割り当てられた状態です。この NIC の上に VLAN サブインターフェースを作成していきます。

次に、NetworkManager の接続名を確認します。

実行コマンド:

$ nmcli connection show | grep -E 'NAME|intersystem|eth3'

実行結果:

NAME         UUID                                  TYPE      DEVICE
intersystem  79194ae0-4736-4e72-993e-f2f682c476fb  ethernet  eth3
eth3         a594a6c6-edcd-4eda-b248-eb8a3787b987  ethernet  --     

eth3 デバイスには「intersystem」という接続名がアクティブになっています。UUID は環境によって異なります。

実行コマンド:

$ nmcli device status

実行結果:

DEVICE  TYPE      STATE            CONNECTION
eth0    ethernet  接続済み         eth0
eth1    ethernet  接続済み         internal1
eth2    ethernet  接続済み         internal2
eth3    ethernet  接続済み         intersystem
lo      loopback  接続済み (外部)  lo          

現時点では VLAN デバイスは存在しません。

最後に、8021q カーネルモジュールの状態を確認します。

実行コマンド:

$ lsmod | grep 8021q

実行結果:

何も表示されません。8021q モジュールはまだロードされていない状態です。VLAN サブインターフェースを作成すると自動的にロードされます。

VLAN サブインターフェースを作成する

nmcli で VLAN サブインターフェースを2つ作成します。以下のコマンドはすべて alma-main で実行します。

VLAN 100(10.0.100.1/24)を作成する

実行コマンド:

$ sudo nmcli connection add type vlan con-name vlan100 ifname eth3.100 dev eth3 id 100 ipv4.addresses 10.0.100.1/24 ipv4.method manual

実行結果:

接続 'vlan100' (f0dfa5c4-db22-4328-b928-20ecf81167ba) が正常に追加されました。

括弧内の UUID は環境によって異なります。各オプションの意味は以下の通りです。

  • type vlan — VLAN タイプの接続を作成する
  • con-name vlan100 — NetworkManager 上の接続名(任意の名前)
  • ifname eth3.100 — 作成されるインターフェース名(「親デバイス.VLAN ID」の命名が慣例)
  • dev eth3 — 親デバイス(VLAN タグを付与する物理 NIC)
  • id 100 — VLAN ID(1〜4094)
  • ipv4.addresses 10.0.100.1/24 — このサブインターフェースに割り当てる IP アドレス
  • ipv4.method manual — IP アドレスを手動設定する(DHCP を使わない)

VLAN 200(10.0.200.1/24)を作成する

実行コマンド:

$ sudo nmcli connection add type vlan con-name vlan200 ifname eth3.200 dev eth3 id 200 ipv4.addresses 10.0.200.1/24 ipv4.method manual

実行結果:

接続 'vlan200' (5d0d3326-2fb8-4b55-b244-fb72ce6726c4) が正常に追加されました。

VLAN サブインターフェースを起動する

接続を追加しただけでは自動起動しない場合があります。明示的に起動します。

実行コマンド:

$ sudo nmcli connection up vlan100

実行結果:

接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/10)

実行コマンド:

$ sudo nmcli connection up vlan200

実行結果:

接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/11)

状態を確認する

VLAN サブインターフェースが正しく作成されたか確認していきます。

実行コマンド:

$ ip -br link show

実行結果:

lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0             UP             00:15:5d:01:63:34 <BROADCAST,MULTICAST,UP,LOWER_UP>
eth1             UP             00:15:5d:01:63:35 <BROADCAST,MULTICAST,UP,LOWER_UP>
eth2             UP             00:15:5d:01:63:36 <BROADCAST,MULTICAST,UP,LOWER_UP>
eth3             UP             00:15:5d:01:63:3d <BROADCAST,MULTICAST,UP,LOWER_UP>
eth3.100@eth3    UP             00:15:5d:01:63:3d <BROADCAST,MULTICAST,UP,LOWER_UP>
eth3.200@eth3    UP             00:15:5d:01:63:3d <BROADCAST,MULTICAST,UP,LOWER_UP> 

eth3.100@eth3eth3.200@eth3 が新たに表示されています。@eth3 は「eth3 の上に作られたサブインターフェース」であることを示しています。MAC アドレスが親の eth3 と同じである点にも注目してください。物理的には同じ NIC ですが、VLAN ID によって論理的に分離されています。

各サブインターフェースの IP アドレスを確認します。

実行コマンド:

$ ip addr show eth3.100

実行結果:

6: eth3.100@eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:15:5d:01:63:3d brd ff:ff:ff:ff:ff:ff
    inet 10.0.100.1/24 brd 10.0.100.255 scope global noprefixroute eth3.100
       valid_lft forever preferred_lft forever
    inet6 fe80::195b:e375:3248:ecf6/64 scope link tentative noprefixroute
       valid_lft forever preferred_lft forever

実行コマンド:

$ ip addr show eth3.200

実行結果:

7: eth3.200@eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:15:5d:01:63:3d brd ff:ff:ff:ff:ff:ff
    inet 10.0.200.1/24 brd 10.0.200.255 scope global noprefixroute eth3.200
       valid_lft forever preferred_lft forever
    inet6 fe80::12ed:db4:5c8f:bbfc/64 scope link tentative noprefixroute
       valid_lft forever preferred_lft forever

eth3.100 に 10.0.100.1/24、eth3.200 に 10.0.200.1/24 が割り当てられています。

NetworkManager のデバイス一覧でも確認します。

実行コマンド:

$ nmcli device status

実行結果:

DEVICE    TYPE      STATE            CONNECTION
eth0      ethernet  接続済み         eth0
eth1      ethernet  接続済み         internal1
eth2      ethernet  接続済み         internal2
eth3      ethernet  接続済み         intersystem
eth3.100  vlan      接続済み         vlan100
eth3.200  vlan      接続済み         vlan200
lo        loopback  接続済み (外部)  lo          

TYPE 列が vlan になっている eth3.100 と eth3.200 が追加されています。

8021q モジュールの状態を再確認します。

実行コマンド:

$ lsmod | grep 8021q

実行結果:

8021q                  53248  0
garp                   16384  1 8021q
mrp                    20480  1 8021q

VLAN サブインターフェースを作成したことで、8021q モジュールが自動的にロードされました。garp と mrp は 8021q が依存するモジュールです。VLAN タグの処理はこの 8021q カーネルモジュールが担っています。

nmcli のオプションを詳しく知りたい場合は man nmclinmcli connection add type vlan --help で確認できます。

VLAN の設定内容を確認する

作成した VLAN サブインターフェースの詳細設定を確認する方法を学びます。以下のコマンドはすべて alma-main で実行します。

nmcli で接続プロパティを確認する

実行コマンド:

$ nmcli connection show vlan100 | grep -E 'connection.type|vlan.parent|vlan.id|ipv4.addresses'

実行結果:

connection.type:                        vlan
ipv4.addresses:                         10.0.100.1/24
vlan.parent:                            eth3
vlan.id:                                100

vlan.parent が親デバイス、vlan.id が VLAN ID です。トラブル時にはこの情報を確認して、意図した親デバイスと VLAN ID が設定されているかを検証します。

/proc/net/vlan/config で確認する

カーネルが認識している VLAN 情報は /proc/net/vlan/config でも確認できます。

実行コマンド:

$ sudo cat /proc/net/vlan/config

実行結果:

VLAN Dev name	 | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth3.100       | 100  | eth3
eth3.200       | 200  | eth3

nmcli(NetworkManager)の設定だけでなく、カーネルレベルでも VLAN が認識されていることが分かります。

self ping で疎通を確認する

サブインターフェースに割り当てた IP アドレスに自分自身から ping を送り、IP アドレスが正しく機能していることを確認します。

実行コマンド:

$ ping -c 1 10.0.100.1

実行結果:

PING 10.0.100.1 (10.0.100.1) 56(84) bytes of data.
64 バイト応答 送信元 10.0.100.1: icmp_seq=1 ttl=64 時間=0.019ミリ秒
--- 10.0.100.1 ping 統計 ---
送信パケット数 1, 受信パケット数 1, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.019/0.019/0.019/0.000 ms

実行コマンド:

$ ping -c 1 10.0.200.1

実行結果:

PING 10.0.200.1 (10.0.200.1) 56(84) bytes of data.
64 バイト応答 送信元 10.0.200.1: icmp_seq=1 ttl=64 時間=0.026ミリ秒
--- 10.0.200.1 ping 統計 ---
送信パケット数 1, 受信パケット数 1, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.026/0.026/0.026/0.000 ms

どちらも応答が返ってきました。VLAN サブインターフェースが正しく機能しています。

ヒヤリハット: VLAN ID の不一致で通信できない

現場エピソード

データセンターでサーバーを増設したとき、サーバー側の VLAN 設定は設計書通りに VLAN 100 で構成しました。しかし、ネットワーク担当者がスイッチ側のトランクポートに許可する VLAN を追加し忘れていて、VLAN 100 のタグ付きフレームがスイッチで破棄されていました。

別のケースでは、サーバー担当が VLAN ID を 100 で設定したのに、スイッチ側は VLAN 200 で設定されていたこともあります。タグが一致しないフレームは通信相手に届きません。

VLAN の設定は「サーバー側」と「スイッチ側」の両方が一致して初めて通信できます。構成変更時は設計書の VLAN ID とコマンドで設定した VLAN ID をダブルチェックし、サーバー担当とネットワーク担当の間で VLAN ID を突き合わせることが重要です。

やってみよう

ここまでの内容を踏まえて、以下の課題に挑戦してください。

課題: VLAN 300 を作成・確認・削除する

eth3 の上に VLAN 300(IP アドレス: 10.0.30.1/24)のサブインターフェースを作成してください。作成後、以下の確認を行い、最後に削除して元に戻してください。

  • 接続名は vlan300、インターフェース名は eth3.300 とする
  • nmcli device status で vlan300 が表示されることを確認する
  • nmcli connection show vlan300 で vlan.id が 300 であることを確認する
  • ping -c 1 10.0.30.1 で self ping が成功することを確認する
  • 確認が済んだら nmcli connection delete vlan300 で削除する
  • 削除後、nmcli device status で vlan300 が消えたことを確認する

ヒント: VLAN 100 の作成コマンドを参考にしてください。変更するのは接続名(con-name)、インターフェース名(ifname)、VLAN ID(id)、IP アドレス(ipv4.addresses)の4箇所です。

VLAN サブインターフェースを削除する(クリーンアップ)

演習で作成した VLAN サブインターフェースを削除します。以下のコマンドは alma-main で実行します。

実行コマンド:

$ sudo nmcli connection delete vlan100

実行結果:

接続 'vlan100' (f0dfa5c4-db22-4328-b928-20ecf81167ba) が正常に削除されました。

実行コマンド:

$ sudo nmcli connection delete vlan200

実行結果:

接続 'vlan200' (5d0d3326-2fb8-4b55-b244-fb72ce6726c4) が正常に削除されました。

nmcli connection delete を実行すると、接続設定の削除と同時にインターフェース自体も削除されます。

削除されたことを確認します。

実行コマンド:

$ nmcli device status

実行結果:

DEVICE  TYPE      STATE            CONNECTION
eth0    ethernet  接続済み         eth0
eth1    ethernet  接続済み         internal1
eth2    ethernet  接続済み         internal2
eth3    ethernet  接続済み         intersystem
lo      loopback  接続済み (外部)  lo          

eth3.100 と eth3.200 が消え、VLAN 作成前の状態に戻りました。

SP4 への復元

第21回(ボンディング)と今回(第22回 VLAN)の演習がすべて完了したら、SP4 スナップショットに復元してから第23回に進んでください。ホストPC の PowerShell で以下を実行します。

ホストPCで実行:

PS> Stop-VM -Name 'alma-main' -Force
PS> Restore-VMSnapshot -VMName 'alma-main' -Name 'SP4_pre-bonding' -Confirm:$false
PS> Start-VM -Name 'alma-main'

復元後は第21回・第22回で行った変更(ボンディング、VLAN)がすべて消え、SP4 取得時のクリーンな状態に戻ります。

まとめ

  • VLAN は物理スイッチを増やさずにネットワークを分割する技術 — 部署別・用途別にブロードキャストドメインを分離し、セキュリティと管理性を向上させる
  • 802.1Q タグVLAN はフレームに VLAN ID を挿入する方式 — スイッチのトランクポートやサーバーとの接続で使われ、1本のケーブルで複数の VLAN を流せる
  • Linux では nmcli で VLAN サブインターフェースを作成する — 親デバイスの上に eth3.100 のようなサブインターフェースを作り、各 VLAN に IP アドレスを割り当てる

VLAN の考え方はクラウド環境にも通じています。AWS の VPC(Virtual Private Cloud)やサブネット、Azure の VNet も「論理的にネットワークを分割する」という点では VLAN と同じ発想です。オンプレミスで VLAN の概念を理解しておくと、クラウドのネットワーク設計も理解しやすくなります。

次回の第23回「ログ管理」では通常回に戻り、journalctl、rsyslog、logrotate を使ったログの管理方法を学びます。システムで何が起きているかを記録・確認するための基本技術です。

理解度チェック

以下の文が正しければ「○」、誤りなら「×」と答えてください。

Q1. VLAN を使うと、1台の物理スイッチで複数の独立したネットワークを構成できる。

Q2. 802.1Q タグ VLAN では、イーサネットフレームに VLAN ID を含むタグが挿入される。

Q3. Linux で VLAN サブインターフェースを作成するには、事前に手動で 8021q モジュールをロードする必要がある。

Q4. サーバー側の VLAN ID とスイッチ側の VLAN ID が一致しない場合、通信できない。

Q5. nmcli connection delete で VLAN 接続を削除すると、サブインターフェースも同時に削除される。

以下、解答です。

Q1. ○ — VLAN はスイッチのポートをグループ分けし、ブロードキャストドメインを分離します。物理スイッチを増やさずに複数の独立したネットワークを構成できます。

Q2. ○ — 802.1Q では通常のイーサネットフレームに4バイトの VLAN タグを挿入し、その中に VLAN ID を格納します。

Q3. × — nmcli で VLAN サブインターフェースを作成すると、8021q モジュールは自動的にロードされます。手動でのロードは不要です。

Q4. ○ — VLAN ID が一致しないタグ付きフレームは通信相手に届きません。サーバー側とスイッチ側の VLAN ID を突き合わせることが重要です。

Q5. ○ — nmcli connection delete は接続設定の削除と同時に、対応するインターフェースも削除します。

シリーズ一覧

フェーズ1: エンジニアのいろは(第1回〜第3回)

フェーズ2: Linux基礎(第4回〜第15回)

フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)

フェーズ4: サーバー構築と運用(第28回〜第36回)