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 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 に参加できます。

今回の演習について
今回は 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@eth3 と eth3.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 nmcli や nmcli 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回)
- 第4回 Linuxとは何か+環境確認
- 第5回 SSH接続とターミナル操作
- 第6回 ファイルシステムとディレクトリ構造
- 第7回 基本コマンド(ファイル操作)
- 第8回 基本コマンド(テキスト処理・パイプとリダイレクト)
- 第9回 viエディタ
- 第10回 ユーザーとグループ管理
- 第11回 パーミッションと所有権
- 第12回 プロセス管理
- 第13回 systemd
- 第14回 シェルスクリプト入門
- 第15回 フェーズ2まとめ演習
フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)
- 第16回 ネットワーク基礎
- 第17回 ネットワーク設定と疎通確認
- 第18回 企業ネットワークの仕組み
- 第19回 パッケージ管理
- 第20回 ファイアウォール(firewalld)
- 第21回 ボンディング/チーミング
- 第22回 VLAN(この記事)
- 第23回 ログ管理
- 第24回 cron / systemd timer
- 第25回 ストレージ管理(LVM)
- 第26回 シェルスクリプト実践
- 第27回 SSH応用
フェーズ4: サーバー構築と運用(第28回〜第36回)
