在基于 CentOS 的 KVM 虚拟化环境中,配置 VLAN(虚拟局域网)是实现网络隔离、提升安全性和优化网络流量的关键技术,通过 VLAN,可以将一台物理服务器上的多个虚拟机划分到不同的逻辑网络中,即使它们共享同一块物理网卡,本文将详细介绍如何在 CentOS 系统上为 KVM 虚拟机配置 VLAN 网络。

核心概念理解
在开始配置之前,理解其工作原理至关重要,KVM 中的 VLAN 配置主要依赖于 Linux 网桥和 VLAN 子接口,基本流程如下:
- 物理网卡:作为连接外部物理网络的出口,需要连接到支持 VLAN 的交换机端口,且该端口通常需配置为 Trunk 模式。
- VLAN 子接口:在物理网卡上创建虚拟的子接口,每个子接口对应一个特定的 VLAN ID。
eth0.100代表在eth0上创建的 VLAN ID 为 100 的子接口。 - Linux 网桥:创建一个或多个网桥,将 VLAN 子接口作为其端口,虚拟机将直接连接到这个网桥。
- 虚拟机网卡:虚拟机的虚拟网卡(vNIC)被附加到相应的网桥上,从而使其能够与指定 VLAN 内的其他设备通信。
配置前提条件
- 一台已安装 KVM 环境(如 qemu-kvm、libvirt、virt-install)的 CentOS 7 或 CentOS 8 系统。
- 拥有 root 或 sudo 权限。
- 一块或多块支持 VLAN 标记(802.1q)的物理网卡。
- 物理交换机上的对应端口已配置为 Trunk 模式,并允许相应的 VLAN 通过。
详细配置步骤
假设我们的物理网卡为 eth0,需要为虚拟机配置 VLAN ID 为 100 和 200 的两个网络。
安装必要工具
确保系统已安装创建 VLAN 和网桥所需的工具。
# 对于 CentOS 7 sudo yum install -y vconfig bridge-utils # 对于 CentOS 8 sudo dnf install -y vconfig bridge-utils
创建 VLAN 子接口和网桥
我们将为每个 VLAN 创建一个子接口,并将其绑定到一个独立的网桥上。
配置 VLAN 100:
# 创建 VLAN 100 的子接口 sudo ip link add link eth0 name eth0.100 type vlan id 100 sudo ip link set dev eth0.100 up # 创建网桥 br-vlan100 sudo brctl addbr br-vlan100 sudo ip link set dev br-vlan100 up # 将 VLAN 子接口添加到网桥 sudo brctl addif br-vlan100 eth0.100
配置 VLAN 200:
# 创建 VLAN 200 的子接口 sudo ip link add link eth0 name eth0.200 type vlan id 200 sudo ip link set dev eth0.200 up # 创建网桥 br-vlan200 sudo brctl addbr br-vlan200 sudo ip link set dev br-vlan200 up # 将 VLAN 子接口添加到网桥 sudo brctl addif br-vlan200 eth0.200
配置虚拟机网络
您可以将虚拟机的网络接口连接到新创建的网桥,使用 virt-manager 图形界面或 virsh edit 命令修改虚拟机的 XML 配置。

在虚拟机的 XML 配置中,找到 <interface> 部分,将其修改为如下形式,以连接到 br-vlan100:
<interface type='bridge'> <mac address='52:54:00:xx:xx:xx'/> <source bridge='br-vlan100'/> <model type='virtio'/> </interface>
将 source bridge 的值改为 br-vlan200 即可让虚拟机接入 VLAN 200。
配置永久化
上述命令在系统重启后会失效,要使配置永久生效,需要创建网络配置脚本文件,以 VLAN 100 为例:
创建 /etc/sysconfig/network-scripts/ifcfg-eth0.100:
DEVICE=eth0.100 BOOTPROTO=none ONBOOT=yes IPADDR=0.0.0.0 # 网桥本身通常不需要IP NETMASK=255.255.255.0 USERCTL=no VLAN=yes
创建 /etc/sysconfig/network-scripts/ifcfg-br-vlan100:
DEVICE=br-vlan100 TYPE=Bridge BOOTPROTO=none ONBOOT=yes IPADDR=0.0.0.0 NETMASK=255.255.255.0 STP=off DELAY=0
按照同样的方式为 VLAN 200 创建对应的配置文件,完成后,重启网络服务或重启服务器即可。
验证与排错
使用以下命令验证配置:

brctl show:查看网桥状态及其连接的端口。ip addr show:检查eth0.100、br-vlan100等接口是否已正确创建并启用。- 在虚拟机内部配置好 IP 地址后,尝试 ping 同一 VLAN 内的其他设备,测试网络连通性。
下表小编总结了关键组件及其作用:
| 组件 | 示例名称 | 描述 |
|---|---|---|
| 物理网卡 | eth0 | 连接物理交换机的真实网络接口 |
| VLAN 子接口 | eth0.100 | 在物理网卡上创建的、承载特定VLAN流量的虚拟接口 |
| 网桥 | br-vlan100 | 连接VLAN子接口和虚拟机网卡的虚拟交换机 |
| 虚拟机网卡 | vnet0 | KVM虚拟机内部的虚拟网络接口 |
相关问答FAQs
问题 1:我的虚拟机无法访问网络,可能是什么原因?
解答: 这是一个常见问题,排查步骤如下:
- 物理交换机配置:确认连接宿主机的交换机端口已设置为 Trunk 模式,并且允许了目标 VLAN(如 100)的流量通过。
- 防火墙:检查 CentOS 宿主机和虚拟机内部的防火墙(如
firewalld或iptables)规则,确保没有阻止相关流量,可以临时关闭防火墙进行测试。 - VLAN ID 和网桥:再次确认
ip link或ifcfg脚本中的 VLAN ID 是否正确,以及虚拟机是否连接到了正确的网桥(br-vlan100而非br-vlan200)。 - IP 配置:确保虚拟机内部的 IP 地址、子网掩码和网关配置正确,且与该 VLAN 的网络规划一致。
- 驱动和模块:确保
8021q内核模块已加载(lsmod | grep 8021q)。
问题 2:我可以让单个虚拟机同时访问多个 VLAN 吗?
解答: 可以,这被称为“多网卡虚拟机”,您需要为虚拟机添加多个虚拟网络接口,在 virt-manager 中,可以通过“添加硬件”功能添加新的网络接口;在 virsh edit 中,则需要在 XML 中添加多个 <interface> 段落,每个新的网络接口分别连接到不同的网桥(一个连接 br-vlan100,另一个连接 br-vlan200),进入虚拟机操作系统后,系统会识别到多块网卡,您可以为它们分别配置不同网段的 IP 地址,从而实现同时访问多个 VLAN。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复