外观
VLAN:VLAN-aware 网桥与 VLAN 接口
只有一根网线接到交换机,但想让「软路由」的 WAN 口、内网客户机、IoT 设备各自在独立的二层网络里,互不干扰——这就是 VLAN(虚拟局域网,Virtual LAN,IEEE 802.1Q)要解决的问题。这篇讲清楚 PVE 里两种实现方式该怎么选、怎么配。
改网络前必须先有退路
把网桥改成 VLAN-aware,或者新增 VLAN 接口,都需要改 /etc/network/interfaces 并重新应用。配错了同样会导致失联。开始前确认你有以下至少一条退路:物理控制台、IPMI/BMC,或者机器就在手边。失联后的自救步骤见改静态 IP 与失联自救。
为什么需要它
一台机器通常只有 1~2 个可用网口,但你可能想要:
- 给软路由/防火墙客户机的 WAN 口接一个单独的 VLAN(对应光猫或上级路由器的某个 VLAN)。
- 把 IoT、访客设备放进隔离的网段,即使它们和主力设备接在同一根网线上。
- 给存储、迁移流量划一个独立网段,和管理流量分开。
VLAN 靠给以太网帧打标签(tag)实现隔离,前提是交换机也支持并配置了对应的 VLAN/Trunk——这不是 PVE 单方面能决定的事,先确认你的交换机型号支持 802.1Q。
两种做法怎么选
| 做法 | 原理 | 适合 |
|---|---|---|
| VLAN-aware 网桥 | 一个网桥处理所有 VLAN,客户机网卡上直接打 Tag | 客户机数量多、VLAN 经常变动,管理最省心,官方推荐的默认做法 |
| 传统 VLAN 接口 | 每个 VLAN 单独建一个 ethX.N 接口和一个网桥 vmbrXvN | 只有一两个固定 VLAN,或者需要把某个 VLAN 单独配置网关/防火墙规则的场景 |
优先用 VLAN-aware 网桥
除非你有明确理由要给某个 VLAN 单独一块网桥(比如那个 VLAN 需要宿主机本身也接入并配 IP),否则用 VLAN-aware 网桥更简单:只需要维护一个网桥,新增 VLAN 不用再改宿主机网络配置,只需要在客户机网卡上填 Tag。
开始之前
- 交换机上对应端口要配置成 Trunk(放行多个 VLAN 标签),而不是 Access(只属于一个 VLAN)。具体操作因交换机品牌而异。
- 备份当前配置:
sh
# 宿主机 shell
cp /etc/network/interfaces /root/interfaces.bak- 先规划好 VLAN ID(1~4094,各厂商交换机可能保留个别 ID,如 1 常作为默认 VLAN),记录清楚每个 VLAN 的用途。
做法一:VLAN-aware 网桥
配置网桥
sh
nano /etc/network/interfaces把现有的 vmbr0 改成 VLAN-aware,管理 IP 可以留在不打标签的默认网络上:
text
auto vmbr0
iface vmbr0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
bridge-ports eno1
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094bridge-vlan-aware yes 打开网桥的 VLAN 处理能力;bridge-vids 2-4094 声明这个网桥允许经过哪些 VLAN ID(不包括默认的 untagged 流量)。
检查语法再应用
sh
ifup --no-act vmbr0确认无误后再执行 ifreload -a。当前 SSH 会话可能短暂断开,属于正常现象。
给客户机分配 VLAN
不需要再改宿主机配置。创建或编辑虚拟机/容器网卡时,在 VLAN Tag 字段填对应的 VLAN ID,客户机的流量会被自动打上这个标签再送进网桥。留空表示走 untagged(默认)网络。
如果某个客户机本身要同时处理多个 VLAN(例如跑软路由的虚拟机),把网卡设成 Trunk 模式(在 Web UI 网卡编辑里填 VLAN Trunk,列出允许通过的 VLAN ID),打标签的工作交给客户机内部处理。
做法二:传统 VLAN 接口
给 VLAN 5 单独建一个网桥,宿主机本身也需要挂在这个 VLAN 上时适用:
text
iface eno1.5 inet manual
auto vmbr0v5
iface vmbr0v5 inet static
address 10.5.0.1/24
bridge-ports eno1.5
bridge-stp off
bridge-fd 0eno1.5 是打了 VLAN 5 标签的物理接口,命名规则是「接口名 + 点号 + VLAN ID」。创建虚拟机时把网络选到 vmbr0v5,客户机自动处于 VLAN 5 里,不需要在网卡上再填 Tag。
Bond 上打 VLAN 的写法类似,把 eno1.5 换成 bond0.5,bridge-ports 也对应改成 bond0.5,前提是先按链路聚合 Bond配好 bond0。
打标签的位置越靠近物理网卡越好
无论是给网卡、Bond 还是网桥打 VLAN,官方建议把标签打在离物理网卡最近、抽象层级最少的设备上,配置更直观,排查问题时也更容易定位。
检查结果
sh
# 1. 网桥的 VLAN 感知状态和放行的 VID
bridge vlan show
# 2. 接口是否 up
ip -4 addr show vmbr0
# 3. 传统 VLAN 接口方式下,确认 vmbr0v5 存在并有 IP
ip -4 addr show vmbr0v5开一台测试客户机,网卡填对应 VLAN Tag(或接到对应的传统 VLAN 网桥),确认它能拿到该 VLAN 网段的 IP、能 ping 通该网段的网关,而且看不到其他 VLAN 里的设备——这才说明隔离真的生效了。
常见问题
客户机填了 VLAN Tag,但完全没有网络。 先确认网桥已经是 bridge-vlan-aware yes;再确认交换机对应端口配置成了 Trunk 并放行了这个 VLAN ID,很多问题出在交换机侧没配对。
能通但速度很慢或丢包。 检查交换机端口两端的协商速率是否一致,以及是不是把 Trunk 误配成了 Access(导致只有默认 VLAN 能通,其他 VLAN 靠错误的方式勉强转发)。
改成 VLAN-aware 之后,原来 untagged 的客户机断网了。 确认默认(untagged)流量对应的 VLAN 在交换机上仍然放通,且客户机网卡的 VLAN Tag 留空。
Trunk 模式的客户机里看不到 VLAN 接口。 VLAN 划分要在客户机操作系统内部再配置一层(例如 Linux 里建 ethX.N 子接口),PVE 只负责把打好标签的帧送进去。