VLAN

出自 Arch Linux 中文维基

本文內容或本節內容已經過期。

原因: 請提供模板的第一個位置參數以概括原因。 (在Talk:VLAN討論)

本文或本節需要翻譯。要貢獻翻譯,請訪問簡體中文翻譯團隊

附註: 請提供模板的第一個位置參數以更詳細的指示。(在 Talk:VLAN# 中討論)

Virtual LANs give you the ability to sub-divide a LAN. Linux can accept VLAN tagged traffic and presents each VLAN ID as a different network interface (eg: eth0.100 for VLAN ID 100)

本文介紹如何通過 iproute2systemd-networkdnetctl 配置 VLAN 。

配置[編輯 | 編輯原始碼]

此前 Arch Linux 用 vconfig 命令設置 VLANs ,該命令已被 ip 命令取代。請確認 iproute2 已安裝。

下面的範例假定 網口eth0名字eth0.100vlan id100

創建 VLAN 設備[編輯 | 編輯原始碼]

用下列命令添加 VLAN 網口:

# ip link add link eth0 name eth0.100 type vlan id 100

執行 ip link 命令確認 VLAN 已創建。

這個 VLAN 網口就像一個普通的物理網口,所有流經這個網口的數據包將被加上 VLAN tag 並流經它關聯的物理網口(本例中的 eth0)。僅配置為相同 VLAN 的設備可接收這些數據包,否則將被丟棄。 Using a name like eth0.100 is just convention and not enforced; you can alternatively use eth0_100 or something descriptive like IPTV. To see the VLAN ID on an interface, in case you used an unconventional name:

# ip -d link show eth0.100

The -d flag shows full details on an interface:

# 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[編輯 | 編輯原始碼]

Now add an IPv4 address to the just created vlan link, and activate the link:

# ip addr add 192.168.100.1/24 brd 192.168.100.255 dev eth0.100
# ip link set dev eth0.100 up

關閉設備[編輯 | 編輯原始碼]

To cleanly shutdown the setting before you remove the link, you can do:

# ip link set dev eth0.100 down

移除設備[編輯 | 編輯原始碼]

ex Removing a VLAN interface is significantly less convoluted

# ip link delete eth0.100

開機啟動[編輯 | 編輯原始碼]

systemd-networkd[編輯 | 編輯原始碼]

Use the following configuration files:

/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

Then enable systemd-networkd.service. See systemd-networkd for details.

netctl[編輯 | 編輯原始碼]

You can use netctl for this purpose, see the self-explanatory example profiles in {{ic|/etc/netctl/examples/vlan-{dhcp,static} }}.

排錯[編輯 | 編輯原始碼]

udev 重命名虛擬設備[編輯 | 編輯原始碼]

An annoyance is that udev may try to rename virtual devices as they are added, thus ignoring the name configured for them (in this case eth0.100).

For instance, if the following commands are issued:

# ip link add link eth0 name eth0.100 type vlan id 100
# ip link show 

This could generate the following output:

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 has ignored the configured virtual interface name eth0.100 and autonamed it rename1.

The solution is to edit /etc/udev/rules.d/network_persistent.rules and append DRIVERS=="?*" to the end of the physical interface's configuration line.

For example, for the interface 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=="?*"

A reboot should mean that VLANs configure correctly with the names assigned to them.