犬でも分かるLinuxネットワーク設定(8):VLAN

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ポリシーにアクセス制限を設定する

コメント

タイトルとURLをコピーしました