LinuxサーバのNIC(ネットワークインターフェースカード)のport 1つに対して、IPアドレスは1つしか割り当てられないのでしょうか? いえ、そうではありません。1つのNIC portに対して複数のIPアドレスを割り当てる技術のひとつがVLANです。今回は、LinuxサーバのネットワークインターフェースにVLAN(タグVLAN)を設定して、複数のIPアドレスを割り当てる方法を解説します。
VLANって何?
VLAN(Virtual Local Area Network)は、主にネットワークスイッチを対象にした技術用語となります。VLANは、物理的に1台のネットワークスイッチを、論理的に複数のネットワークに分割して利用する技術です。VLANには、ポートVLANとタグVLAN(IEEE802.1Qという規格で標準化されたもの)があります。
ポートVLANとは..
例えば、48portを有するネットワークスイッチがあったとします。初期状態では当然、48個のportは全てネットワークで接続が可能です。でも、勿体ないから、48portを「24port x 2台分」とか「12port x 4台分」とか、そんなふうに分けて使いたいってことありますよね。このように、物理的に1台のネットワークスイッチを複数のportグループで分離して、論理的には複数のスイッチがあるように使う技術が、ポートVLANです。このとき異なるグループに属するport間では、通信することはできません。この技術はネットワークスイッチの技術で、ネットワークスイッチに接続するデバイスは、VLANに対応していなくてもOKです。初心者にも分かりやすいのが、ポートVLANです。
タグVLANとは..
タグVLANとは、ネットワークに流すデータ(フレーム)にVLANタグを付けて、ネットワークを識別する技術です。ポートVLANは、ネットワークスイッチの物理portでネットワークを分離していたのに対して、タグVLANは、データがVLANを識別するIDを持っている(VLANタグ)ので、同じ物理portを複数のネットワークで共有することができます。また、ネットワークスイッチに接続するデバイス(具体的に言うとサーバの物理的なEthernet port)も複数のネットワークで共有することができるということです。従って、ポートVLANと異なり、ネットワークスイッチに接続するデバイスもタグVLANに対応している必要があります。
前述の通り、タグVLANに対応したネットワークでは、タグ付きのデータ(タグ付きフレーム,tagged)が流れるのですが、通常のネットワークやポートVLANで分離したネットワークを流れるデータにはタグは付いていませんので、アンタグ(untagged)フレームと呼ばれたりもします。
VLANはIDで管理する
VLANは1~4094までの整数(VLAN ID)を指定して管理します。これはIEEE802.1Qで決められた規格です。ポートVLANもタグVLANも、VLAN IDで管理します。ネットワークスイッチを初期状態のまま使っていても、実はスイッチのport全てが「VLAN 1」に所属しています。VLAN ID=1は、ネットワークスイッチのデフォルトのVLAN(そしてこれは、アンタグです)として予約されています。
今回はLinuxサーバでVLAN対応のネットワークインターフェースを作成する方法を解説するよ
前置きが長くなりましたが、今回はネットワークスイッチ側のVLAN設定の話しではなく、Linuxサーバ側で、1つのNIC port(以下の図では「物理port」と記載)を複数のネットワークに接続して使うための設定を解説します。
普通のネットワーク接続(VLAN対応なし)
以下は、2台のLinuxサーバがごく普通にネットワークで接続しているという図です。192.168.2.0/24のサブネットに接続しており、それぞれ、192.168.2.200と192.168.2.210というIPアドレスを割り当てています。もちろん、それぞれのホストのネットワークインターフェースはVLANに対応していないので、このネットワークを流れるデータはアンタグ(タグ無し)フレームです。

VLAN(タグVLAN)でネットワークを分離
さて、それぞれのホストにおいて、VLAN対応のネットワークインターフェースを作成するとします。以下の例では、VLAN ID=100(VLAN 100)に対応した、ネットワークインターフェースを作成して、元のネットワークインターフェースとは異なるサブネットに接続しています。この例では、元(親)のネットワークインターフェース名が「enp3s0」なので、VLAN 100に対応したネットワークインターフェース(子)は「enp3s0.100」という名前で作成しています。

この例では、VLAN 100のネットワークアドレスを分かりやすく 192.168.100.0/24 としていますが、ネットワークアドレスの数字をVLAN IDに合わせる必要はありません。
それぞれのホストは、VLAN対応のネットワークインターフェースを追加したことにより、別のIPアドレスを持つことが可能になります(この例では、192.168.100.200と192.168.100.210)。VLAN 100を流れるデータは、VLAN ID=100のタグの付いたフレームとなり、物理的に同じネットワークであっても、元のネットワークとは論理的に分離されます。
Rocky9におけるVLAN対応インターフェースの作成方法
実際に、Rocky Linux 9のサーバで、VLAN対応のインターフェースを作成してみましょう。
方法はとても簡単です。VLANって敷居が高いイメージがありましたが、こんな簡単だったら、もっと早くから活用すればよかった。。
初期状態
ウチの環境ではミニPC 2台(ホスト名は base0とbase1)を使って、いろいろなテストをしていまして、以下のような感じで接続しています。ホストbase0のほうは、2つのネットワークインターフェースを使ってbondingし、更にそれを仮想ブリッジに接続しています。
(興味のある方はコチラをご覧ください)

ホストbase1 でVLAN対応インターフェースを作成する
① 元のネットワークインターフェース名の確認
nmcliコマンドを以下の通り実行して、元のネットワークインターフェース名を確認しましょう。
# nmcli device status
DEVICE TYPE STATE CONNECTION
enp3s0 ethernet connected enp3s0
lo loopback connected (externally) lo
wlo1 wifi unmanaged --
ホストbase1では、enp3s0という名前が元(親)のネットワークインターフェースとなります。
② VLAN対応インターフェースを作成
nmcliコマンドを以下の通り実行して、enp3s0にVLAN対応インターフェースを追加します。この例では、VLAN ID=100で作成しています。コネクション名もVLAN対応インターフェース名と同じ、enp3s0.100としています。
# nmcli connection add type vlan con-name enp3s0.100 dev enp3s0 id 100
Connection 'enp3s0.100' (fb3db78b-f165-4334-854f-4bd44eaf78c6) successfully added.
③ 作成したVLAN対応インターフェースにIPアドレス設定等を行う
②で作成したVLAN対応インターフェースのコネクション(enp3s0.100)を指定して、nmcliコマンドで固定のIPアドレス(IPv4)を設定し、最後にコネクションをupして有効化します。
# nmcli connection modify enp3s0.100 ipv4.address 192.168.100.210/24
# nmcli connection modify enp3s0.100 ipv4.method manual
# nmcli connection modify enp3s0.100 ipv6.method ignore
# nmcli connection up enp3s0.100
# Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
④ 作成したVLAN対応インターフェースを確認
ネットワークインターフェースを確認します。デバイス(ネットワークインターフェース)として enp3s0.100 が追加されていることが分かります。
# nmcli device status
DEVICE TYPE STATE CONNECTION
enp3s0 ethernet connected enp3s0
enp3s0.100 vlan connected enp3s0.100
lo loopback connected (externally) lo
wlo1 wifi unmanaged --
コネクションを確認します。コネクションも同じ名前で追加されていることが分かります。
# nmcli connection show
NAME UUID TYPE DEVICE
enp3s0 45847cc1-c0a1-30e6-b76d-f952f692a734 ethernet enp3s0
enp3s0.100 fb3db78b-f165-4334-854f-4bd44eaf78c6 vlan enp3s0.100
lo 6787d06f-7c39-4cb0-850d-b4c5b451e333 loopback lo
ipコマンドでIPアドレスを確認します。
# ip a show enp3s0.100 5: enp3s0.100@enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:e0:4c:38:6c:39 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.210/24 brd 192.168.100.255 scope global noprefixroute enp3s0.100 valid_lft forever preferred_lft forever
inet6 fe80::83d3:6aef:c306:6f7e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
ホスト base0 でVLAN対応インターフェースを作成する
ホストbase0は、普通のネットワークインターフェースはbondingインターフェースに接続し、更にそれが仮想ブリッジに接続して、仮想ブリッジにIPアドレスが設定されています。このような状態の場合は、仮想ブリッジに対してだけ、VLAN対応インターフェースを追加するようにします。
① 元のネットワークインターフェース名の確認
# nmcli device status
DEVICE TYPE STATE CONNECTION
br1 bridge connected br1
br2 bridge connected br2
bond2 bond connected br-slave-bond2
enp0s21f0u2c2 ethernet connected br-slave-enp0s21f0u2c2
enp2s0 ethernet connected bond-slave-enp2s0
enp3s0 ethernet connected bond-slave-enp3s0
lo loopback connected (externally) lo
virbr0 bridge connected (externally) virbr0
wlp1s0 wifi unmanaged --
インターフェースがたくさんありますが、今回の対象は br2 です。
② VLAN対応インターフェースを作成
br2という元(親)のインターフェースに対してVLAN 100に対応したインターフェースを追加します。コネクション名もVLAN対応インターフェース名と同じ、br2.100としています。
# nmcli connection add type vlan con-name br2.100 dev br2 id 100
Connection 'br2.100' (69bd9ce3-931b-4bd6-8988-6c1beaab3dde) successfully added.
③ 作成したVLAN対応インターフェースにIPアドレス設定等を行う
②で作成したVLAN対応インターフェースのコネクション(br2.100)を指定して、nmcliコマンドで固定のIPアドレス(IPv4)を設定し、最後にコネクションをupして有効化します。
# nmcli connection modify br2.100 ipv4.address 192.168.100.200/24
# nmcli connection modify br2.100 ipv4.method manual
# nmcli connection modify br2.100 ipv6.method ignore
# nmcli connection up br2.100
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/59)
④ 作成したVLAN対応インターフェースを確認
ネットワークインターフェースを確認します。
# nmcli device status
DEVICE TYPE STATE CONNECTION
br1 bridge connected br1
br2 bridge connected br2
bond2 bond connected br-slave-bond2
enp0s21f0u2c2 ethernet connected br-slave-enp0s21f0u2c2
enp2s0 ethernet connected bond-slave-enp2s0
enp3s0 ethernet connected bond-slave-enp3s0
br2.100 vlan connecting (getting IP configuration) br2.100
lo loopback connected (externally) lo
virbr0 bridge connected (externally) virbr0
wlp1s0 wifi unmanaged --
コネクションを確認します。
# nmcli c s NAME UUID TYPE DEVICE
br1 0e4631f5-bb75-42f7-8c10-90e8e8e5e14c bridge br1
br2 13a08407-47b9-498a-b8ca-3dd5a23252ac bridge br2
br2.100 69bd9ce3-931b-4bd6-8988-6c1beaab3dde vlan br2.100
bond-slave-enp2s0 9ea8cad6-4153-4fcc-8374-ae6527b4b055 ethernet enp2s0
bond-slave-enp3s0 7398408b-f23c-4a8e-9773-2a12717df23e ethernet enp3s0
br-slave-bond2 679cc659-13a2-4e19-8277-50f5b593f403 bond bond2
br-slave-enp0s21f0u2c2 5b789464-996b-410e-8166-b8afd4eb7f66 ethernet enp0s21f0u2c2
lo a01cfad5-56ea-409c-a892-be800ebb1596 loopback lo
virbr0 13541e73-f7bc-4d94-8698-b2828238671d bridge virbr0
ipコマンドでIPアドレスを確認します。
# ip a show br2.100
38: br2.100@br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 84:47:09:18:c5:4f brd ff:ff:ff:ff:ff:ff
inet 192.168.100.200/24 brd 192.168.100.255 scope global noprefixroute br2.100
valid_lft forever preferred_lft forever
inet6 fe80::715c:4aea:1c2b:c721/64 scope link noprefixroute
valid_lft forever preferred_lft forever
VLAN対応インターフェース作成後の接続イメージ
ホストbase0のbr2とホストbase1のenp3s0に対して、VLAN対応インターフェースを追加した後の状態は、こんな感じになっています。

疎通を確認する
ホストbase0からホストbase1にVLAN 100での疎通を確認します。
[root@base0 base0]# ping 192.168.100.210
PING 192.168.100.210 (192.168.100.210) 56(84) bytes of data.
64 bytes from 192.168.100.210: icmp_seq=1 ttl=64 time=0.868 ms
64 bytes from 192.168.100.210: icmp_seq=2 ttl=64 time=0.850 ms
~
疎通OKですね。
今度は逆に、ホストbase1からホストbase0にVLAN 100での疎通を確認します。
[root@base1 base1]# ping 192.168.100.200
PING 192.168.100.200 (192.168.100.200) 56(84) bytes of data.
64 bytes from 192.168.100.200: icmp_seq=1 ttl=64 time=0.834 ms
64 bytes from 192.168.100.200: icmp_seq=2 ttl=64 time=0.602 ms
~
こちらも疎通OKですね。めでたしめでたし。。
広告主へのリンク
オイラが今回のテストに使っているのは、高価なサーバではなくて、安価なミニPC MINISFORUM GK41 というマシンです。LANポートが2つ付いているので、PXEブートのテストにも便利です。
更に、このMINISFORUM GK41のUSBポートに以下のUSB-LAN変換アダプタを付けて、LANポートを合計3つにして運用しています。
このブログにおける関連リンク
犬でも分かるLinuxネットワーク
・犬でも分かるLinuxネットワーク設定(1): nmcliコマンドの使い方
・犬でも分かるLinuxネットワーク設定(2): ボンディング(bonding)
・犬でも分かるLinuxネットワーク設定(3): 仮想ブリッジ
・犬でも分かるLinuxネットワーク設定(4): ボンディング+仮想ブリッジ
・犬でも分かるLinuxネットワーク設定(5):定義ファイルの修正
・犬でも分かるLinuxネットワーク設定(6): ルーティングとNAT
・犬でも分かるLinuxネットワーク設定(7):firewalldによるアクセス制限
・犬でも分かるLinuxネットワーク設定(8):VLAN
・犬でも分かるLinuxネットワーク設定(9):IPエイリアス
・犬でも分かるLinuxネットワーク設定(10):outboundのアクセス制限
・犬でも分かるLinuxネットワーク設定(11):NATポリシーにアクセス制限を設定する


コメント