VLAN
仮想 LAN を使うことで LAN を細分化することができます。Linux は VLAN のタグが付属したトラフィックを扱うことができ、VLAN ID で異なるネットワークインターフェイスを表します (例: VLAN ID 100
ならば eth0.100
)。
この記事では iproute2 と systemd-networkd あるいは netctl を使用して VLAN を設定する方法を説明します。
目次
設定
以前は VLAN を設定するときは Arch Linux では vconfig
コマンドが使われていました。今では ip
コマンドに置き換わっています。iproute2 がインストールされていることを確認してください。
以下の例では、インターフェイスを eth0
、割り当てる名前を eth0.100
、vlan id を 100
とします。
VLAN デバイスの作成
以下のコマンドで VLAN を追加します:
# ip link add link eth0 name eth0.100 type vlan id 100
ip link
を実行して VLAN が作成されたことを確認してください。
作成したインターフェイスは通常のインターフェイスと同じように振る舞います。VLAN に転送されるトラフィックは全てマスターインターフェイス (上記の例では eth0
) を通りますが VLAN タグが付属します。VLAN に対応するように正しく設定されたデバイスだけがトラフィックを受け取ることができ、それ以外の場合はトラフィックはドロップされます。
eth0.100
などの名前はあくまで慣習的な名前であり強制ではありません。eth0_100
などとしてもかまいませんし、あるいは分かりやすいように IPTV
のように名前をつけることもできます。慣習的な名前を使わなかったときに、インターフェイスの VLAN ID を確認したいときは:
# ip -d link show eth0.100
-d
フラグを使うことでインターフェイスに関する詳しい情報が表示されます:
# ip -d addr show 4: eno1.100@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 96:4a:9c:84:36:51 brd ff:ff:ff:ff:ff:ff promiscuity 0 vlan protocol 802.1Q id 100 <REORDER_HDR> inet6 fe80::944a:9cff:fe84:3651/64 scope link valid_lft forever preferred_lft forever
IP を追加
作成した vlan リンクに IPv4 アドレスを追加して、リンクを有効化:
# ip addr add 192.168.100.1/24 brd 192.168.100.255 dev eth0.100 # ip link set dev eth0.100 up
デバイスを落とす
リンクを削除する前に設定を安全にシャットダウンしたい場合、次を実行:
# ip link set dev eth0.100 down
デバイスを削除
VLAN インターフェイスの削除は簡単です:
# ip link delete eth0.100
ブート時に起動
systemd-networkd
以下の設定ファイルを使ってください:
/etc/systemd/network/eno1.network
[Match] Name=eno1 [Network] DHCP=v4 VLAN=eno1.100 VLAN=eno1.200
/etc/systemd/network/eno1.100.netdev
[NetDev] Name=eno1.100 Kind=vlan [VLAN] Id=100
/etc/systemd/network/eno1.200.netdev
[NetDev] Name=eno1.200 Kind=vlan [VLAN] Id=200
そして systemd-networkd.service
を有効化してください。詳しくは systemd-networkd を参照。
netctl
netctl を使うこともできます。サンプルプロファイルの {{ic|/etc/netctl/examples/vlan-{dhcp,static} }} を見てください。
トラブルシューティング
udev が仮想デバイスの名前を変更してしまう
厄介なことに、仮想デバイスを追加すると、設定した名前 (上記の例なら eth0.100
) を無視して udev が仮想デバイスの名前を変更しようとすることがあります。
例えば、以下のコマンドを実行した場合:
# ip link add link eth0 name eth0.100 type vlan id 100 # ip link show
以下のような出力がされることがあります:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff 3: rename1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
上記の場合 udev は設定された仮想インターフェイス名 eth0.100
を無視して自動的に rename1 に名前を変更しています。
/etc/udev/rules.d/network_persistent.rules
を編集して物理インターフェイスの設定行の一番後ろに DRIVERS=="?*"
を追加することで問題は解決します。
例えば、インターフェイスが aa:bb:cc:dd:ee:ff (eth0) の場合:
/etc/udev/rules.d/network_persistent.rules
SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0", DRIVERS=="?*"
再起動すれば VLAN が設定した名前に正しくなっているはずです。