LinuxでのVLAN設定:ネットワークの分離、セキュリティ強化、簡単な管理

Network tutorial - IT technology blog
Network tutorial - IT technology blog

問題の紹介:なぜVLANが必要なのか?

システム管理、特にネットワーク管理の仕事では、会社のネットワークを安全かつ効率的に保ちながら、新しい機器の購入コストを抑えるという課題に常に直面しています。私は50人規模のオフィスと小さなデータセンターのネットワークを管理しているため、これらの課題をよく理解しています。

ネットワークが5~10台のPCから50台以上へと大規模化すると、多くの問題が発生し始めます。第一にセキュリティです。経理部門のPCが開発サーバーに直接アクセスできないようにするにはどうすればよいでしょうか?また、IoTデバイスが主要なシステムに影響を与えないようにするにはどうすればよいでしょうか?

第二にパフォーマンスです。PCがブロードキャストメッセージ(例:プリンターの検索やDHCPサーバーからのIPアドレス要求)を送信すると、同じLAN内の他のすべてのデバイスがそれを処理しなければなりません。この状況はリソースの浪費であり、ネットワークを著しく遅くします。

以前は、この問題を解決するために、追加のスイッチを購入し、ケーブルを敷設し、各部門を物理的に分離されたネットワークに分割する必要がありました。しかし、この方法はコストがかかり、複雑で、柔軟性に欠けます。部門が移動したり、別のネットワークにPCを追加したい場合でも、ケーブルを再配線する必要がありました。これが、私がVLANに目を向けた理由です。

中核概念:VLANとは何か、どのように機能するのか?

VLANとは?

VLAN (Virtual Local Area Network)は、簡単に言えば、同じ物理ネットワークインフラ上に複数の仮想LANを作成する方法です。単一の物理スイッチが、VLANによって複数の独立した仮想スイッチに分割されると想像してみてください。同じVLANに属するデバイスは、たとえ同じスイッチの異なるポートに接続されていても、あるいは複数の異なる物理スイッチに接続されていても、あたかも同じ物理ネットワーク内にいるかのように通信できます。

なぜVLANを使用する必要があるのか?

  • セキュリティの強化: これが最大の利点です。VLANは、部門(例:経理、マーケティング、IT)やデバイス(サーバー、PC、監視カメラ)を個別のネットワークに分離するのに役立ちます。これにより、不正アクセスを防ぎ、ネットワーク攻撃のリスクを軽減します。
  • ネットワークパフォーマンスの向上: VLANはブロードキャストドメインのサイズを縮小します。PCがブロードキャストメッセージを送信すると、物理ネットワーク全体ではなく、同じVLAN内のメンバーのみに到達します。これにより、不要なトラフィックが削減され、ネットワークが高速化します。
  • 簡単な管理と柔軟性: 従業員が移動したり、部門が変更されたりした場合でも、物理的なケーブルを再配線する必要はなく、ソフトウェア(スイッチまたはLinuxサーバー上)でネットワークを再設定するだけです。これは、常に変動するネットワークインフラの管理にとって非常に便利です。
  • コスト削減: 各物理ネットワークのために複数のスイッチを購入する代わりに、VLANをサポートするいくつかのスイッチで十分です。

VLANの動作メカニズム:802.1Qタグ付け

スイッチやLinuxサーバーがどのVLANに属するパケットを識別するために、IEEE 802.1Q規格に基づくVLANタグ付けと呼ばれるメカニズムが使用されます。VLAN用に設定されたネットワークポートをイーサネットパケットが通過すると、そのパケットのヘッダーに「タグ」が追加されます。このタグには、VLAN ID(VLANの識別子)に関する情報が含まれており、1から4094までの番号です。

  • アクセスポート (Access Port): 通常、エンドデバイス(ユーザーPCなど)に接続されます。このポートに出入りするパケットにはVLANタグがありません。スイッチは、ポートの設定に基づいて、受信したパケットに自動的にVLAN IDを割り当て、送信時にはタグを削除します。
  • トランクポート (Trunk Port): 通常、スイッチ間、またはスイッチとサーバー(Linuxサーバーなど)間の接続に使用されます。トランクポートを通過するパケットはVLANタグを保持し、単一の物理回線で複数のVLANが通過できるようにします。

Linuxサーバーのコンテキストにおいて、VLANを設定するとき、実際にはサーバーのネットワークカードが802.1Qタグ付きパケットを理解し処理するのを助けています。これにより、ネットワークカードは一種のソフトウェア「トランクポート」になります。

実践的な詳細:LinuxでのVLAN設定

さて、最も重要な部分です。これらの知識をLinuxサーバーで実際に適用する方法です。これらの経験はすべて、私が小さなデータセンターで導入した実体験に基づいています。そこでは、Linuxサーバーをゲートウェイ、ファイアウォール、または複数の異なる仮想ネットワークに参加する必要がある仮想化ホストとして使用しました。

1. カーネルサポートの確認とツールのインストール

ほとんどのモダンなLinuxディストリビューションには、VLAN用のカーネルモジュールがすでに含まれています。以下のコマンドで確認できます。

lsmod | grep 8021q

出力がある場合、モジュールがロードされていることを意味します。ない場合は、手動でロードできます。

sudo modprobe 8021q

必要なツールは通常iproute2ipコマンドを提供)で、場合によってはvlanvconfigコマンドを提供)ですが、ipがより現代的で推奨される方法です。

# Debian/Ubuntuの場合
sudo apt update
sudo apt install iproute2 vlan

# CentOS/RHELの場合
sudo yum install iproute vlan

2. VLANを一時的に管理するための基本コマンド (runtime)

ipコマンドを使用してVLANインターフェースを作成および管理します。

既存のネットワークカード情報の表示

物理ネットワークカードがeth0またはenpXsXであると仮定します。以下のコマンドで確認します。

ip a

例として、私はenp0s3を次のステップの物理ネットワークカードとして使用します。

新しいVLANインターフェースの作成

enp0s3カード上にID 10を持つVLANインターフェースを作成したいとします。一般的な規則に従って、名前をenp0s3.10とします。

sudo ip link add link enp0s3 name enp0s3.10 type vlan id 10
  • link enp0s3: このVLANが動作する物理インターフェースを指定します。
  • name enp0s3.10: 新しいVLANインターフェースの名前。
  • type vlan id 10: ID 10のVLANインターフェースであることを宣言します。

VLANインターフェースへのIPアドレスの割り当て

sudo ip addr add 192.168.10.100/24 dev enp0s3.10

ここでは、enp0s3.10インターフェースにIPアドレス192.168.10.100とサブネットマスク/24を割り当てます。

VLANインターフェースの有効化

sudo ip link set dev enp0s3.10 up

設定の再確認

設定後、VLANインターフェースが作成され、IPアドレスが割り当てられているかを確認できます。

ip a show enp0s3.10

または、-dフラグを使用してVLAN情報をより詳細に表示します。

ip -d link show enp0s3.10

VLANインターフェースの削除

一時的なVLANインターフェース(再起動までのみ有効)を削除したい場合は、以下のコマンドを使用します。

sudo ip link delete enp0s3.10

3. 再起動後もVLAN設定を維持する (Persistence Configuration)

上記のipコマンドは、現在のセッションでのみ有効です。サーバーを再起動すると、設定は失われます。設定を永続化するには、オペレーティングシステムのネットワーク設定ファイルを編集する必要があります。

各Linuxディストリビューションには異なる設定方法があります。最も一般的な2つの方法を提示します。

方法1:Netplanでの設定 (Ubuntu Server 18.04+およびDebian 10+の場合)

NetplanはYAMLファイルを使用してネットワークを設定します。これは私がUbuntuサーバーでよく使用する方法です。

/etc/netplan/ディレクトリに設定ファイルを作成または編集します。例:/etc/netplan/01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
  vlans:
    enp0s3.10:
      id: 10
      link: enp0s3
      addresses: [192.168.10.100/24]
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 192.168.10.1
    enp0s3.20:
      id: 20
      link: enp0s3
      addresses: [192.168.20.100/24]
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      routes:
        - to: default
          via: 192.168.20.1

説明:

  • ethernets: enp0s3:: 物理カードを宣言します。物理カードはVLANの「伝送路」としてのみ使用されるため、DHCPを無効にしています。
  • vlans:: VLANインターフェースを定義するセクション。
  • enp0s3.10:: VLANインターフェースの名前。
  • id: 10: VLAN ID。
  • link: enp0s3: 親物理インターフェースを指定します。
  • addresses: [192.168.10.100/24]: IPアドレスとサブネットマスク。
  • routes:nameservers:: このVLANのゲートウェイとDNSサーバーを設定します。

ファイルを編集した後、設定を適用します。

sudo netplan try # 永続的に適用する前に設定を確認するために、このコマンドを使用することをお勧めします
sudo netplan apply

方法2:NetworkManagerとifcfgファイルでの設定 (CentOS/RHELの場合)

CentOS/RHELシステムでは、/etc/sysconfig/network-scripts/ディレクトリ内のifcfg-ファイルと共にNetworkManagerをよく使用します。

まず、NetworkManagerが実行されており、物理ネットワークカードが直接IPを受け取らないように設定されていることを確認します。

物理ネットワークカードifcfg-enp0s3の設定ファイルを作成:

sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE="Ethernet"
BOOTPROTO="none"
NAME="enp0s3"
DEVICE="enp0s3"
ONBOOT="yes"

VLAN 10インターフェース (ifcfg-enp0s3.10) の設定ファイルを作成:

sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.10
VLAN="yes"
TYPE="Vlan"
DEVICE="enp0s3.10"
PHYSDEV="enp0s3"
VID="10"
BOOTPROTO="static"
IPADDR="192.168.10.100"
NETMASK="255.255.255.0"
GATEWAY="192.168.10.1"
ONBOOT="yes"

VLAN 20インターフェース (ifcfg-enp0s3.20) の設定ファイルを作成:

sudo vi /etc/sysconfig/network-scripts/ifcfg-enp0s3.20
VLAN="yes"
TYPE="Vlan"
DEVICE="enp0s3.20"
PHYSDEV="enp0s3"
VID="20"
BOOTPROTO="static"
IPADDR="192.168.20.100"
NETMASK="255.255.255.0"
GATEWAY="192.168.20.1"
ONBOOT="yes"

作成または編集後、NetworkManagerを再起動します。

sudo systemctl restart NetworkManager

または、NetworkManagerを使用しない場合は、古いネットワークサービスを再起動します。

sudo systemctl restart network

4. 実践例:複数のVLANに参加するLinuxサーバー

仮想化ホストとして機能し、その上の仮想マシンが2つの異なるネットワーク(Webサーバー用のVLAN 10とデータベースサーバー用のVLAN 20)にアクセスする必要があるサーバーを想像してみてください。物理サーバーにはenp0s3という1つのネットワークカードしかありません。

これを実現するには、次のように設定します(例としてNetplanを使用):

  1. Linuxサーバーが接続されているポートが、VLAN 10とVLAN 20を通過させるトランクポートとして設定されていることを確認します。
  2. 上記で説明したように、enp0s3.10enp0s3.20の2つのVLANインターフェースを持つNetplan設定ファイルを作成します。
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
  vlans:
    enp0s3.10:
      id: 10
      link: enp0s3
      addresses: [192.168.10.100/24]
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: 192.168.10.1
    enp0s3.20:
      id: 20
      link: enp0s3
      addresses: [192.168.20.100/24]
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: 192.168.20.1

sudo netplan applyを実行した後、私のサーバーには、それぞれ異なるVLANに属し、独自のIPアドレスとゲートウェイを持つ2つの仮想ネットワークインターフェースが作成されます。

ip a show enp0s3.10
# 以下のような出力:
# 4: enp0s3.10@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
#     link/ether 08:00:27:1c:1d:9e brd ff:ff:ff:ff:ff:ff
#     inet 192.168.10.100/24 brd 192.168.10.255 scope global enp0s3.10
#        valid_lft forever preferred_lft forever

ip a show enp0s3.20
# 以下のような出力:
# 5: enp0s3.20@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
#     link/ether 08:00:27:1c:1d:9e brd ff:ff:ff:ff:ff:ff
#     inet 192.168.20.100/24 brd 192.168.20.255 scope global enp0s3.20
#        valid_lft forever preferred_lft forever

この設定により、Linuxサーバーは、単一の物理ネットワークポート上でVLAN 10とVLAN 20の両方と独立して通信できるようになります。これは、仮想化やネットワークの分離を必要とするサービスを展開する際に非常に有用であり、効率性とセキュリティを保証します。

結論

VLANは、現代のネットワーク設計と管理において強力かつ不可欠な技術です。私の経験からすると、小規模オフィスネットワークであろうとデータセンターであろうと、VLANを適用することで、セキュリティ、パフォーマンス、拡張性の面で明確な利点が得られます。

Linuxでは、ipのようなツールや、NetplanやNetworkManagerのような永続化設定方法を使えば、VLANの設定は非常に簡単です。VLANの設定方法を習得することは、堅牢で管理しやすいネットワークインフラを構築するのに大いに役立つでしょう。

仮想マシンやテスト環境でVLAN設定を試して慣れ親しみ、実際のプロジェクトに適用してみてください。成功を祈ります!

Share: