UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

160 lines (104 loc) 5.29 kB
**翻译状态:** 本文是英文页面 [VLAN](/index.php/VLAN "VLAN") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)"),最后翻译时间:2015-04-28,点击[这里](https://wiki.archlinux.org/index.php?title=VLAN&diff=0&oldid=371497)可以查看翻译后英文页面的改动。 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`) 本文介绍如何通过 [iproute2](https://www.archlinux.org/packages/?name=iproute2) 和 [systemd-networkd](/index.php/Systemd-networkd "Systemd-networkd") 或 [netctl](/index.php/Netctl "Netctl") 配置 VLAN 。 ## Contents * [1 配置](#.E9.85.8D.E7.BD.AE) * [1.1 创建 VLAN 设备](#.E5.88.9B.E5.BB.BA_VLAN_.E8.AE.BE.E5.A4.87) * [1.2 添加 IP](#.E6.B7.BB.E5.8A.A0_IP) * [1.3 关闭设备](#.E5.85.B3.E9.97.AD.E8.AE.BE.E5.A4.87) * [1.4 移除设备](#.E7.A7.BB.E9.99.A4.E8.AE.BE.E5.A4.87) * [1.5 开机启动](#.E5.BC.80.E6.9C.BA.E5.90.AF.E5.8A.A8) * [1.5.1 systemd-networkd](#systemd-networkd) * [1.5.2 netctl](#netctl) * [2 排错](#.E6.8E.92.E9.94.99) * [2.1 udev 重命名虚拟设备](#udev_.E9.87.8D.E5.91.BD.E5.90.8D.E8.99.9A.E6.8B.9F.E8.AE.BE.E5.A4.87) ## 配置 此前 Arch Linux 用 `vconfig` 命令设置 VLANs ,该命令已被 `ip` 命令取代。请确认 [iproute2](https://www.archlinux.org/packages/?name=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 网口就像一个普通的物理网口,所有流经这个网口的数据包将被加上 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` ### 移除设备 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](/index.php/Enable "Enable") `systemd-networkd.service`. See [systemd-networkd](/index.php/Systemd-networkd "Systemd-networkd") for details. #### netctl You can use [netctl](/index.php/Netctl "Netctl") for this purpose, see the self-explanatory example profiles in `/etc/netctl/examples/vlan-{dhcp,static}` . ## 排错 ### udev 重命名虚拟设备 An annoyance is that [udev](/index.php/Udev "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.