跳转到内容

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-4094

bridge-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 0

eno1.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 只负责把打好标签的帧送进去。

延伸阅读 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。