晚上好,
我有一个棘手的问题,因为我需要创建一个与虚拟机一起使用的虚拟接口,但它只能是第 2 层:虚拟机将与预先设置的 MAC 地址进行通信(可以为该地址设置一个)适配器,VM 将使用该适配器,否则 VM 将伪装另一个预设的 MAC 地址。)
我已经找到的大多数解决方案都与使用第 3 层(即 IP 地址)有关,不幸的是,这些解决方案对我不起作用:第 3 层配置必须在 VM 内部完成,并且虚拟 NIC 和虚拟交换机必须仅针对 L2 流量进行配置。
出于安全和操作原因,我根本不需要 IP 地址配置(即仅适用于 IPv4 和 IPv6 的链路本地,或完全禁用第 3 层。)
简而言之,我需要这样的拓扑:
My VM <-> vnic0 <-> vbr0 <-> eth0 <-> external network
我需要创建一个名为 vnic0 的虚拟适配器,它(与真实适配器 eth0 一起)连接到名为 vbr0 的虚拟网桥。最好是,我正在寻找 RHEL 7.4 / CentOS 7.4 的配置文件,这些文件将允许配置在重新启动后自动工作,无需系统管理员的交互。将来我可能还需要创建 vnic1、vnic2、vnic3 等,所有这些都连接到 vbr0。
使用 VLAN 并不是绝对必要的(可以假设所有内容都在非 VLAN/本机 VLAN 上),但如果有天才可以向我展示如何配置(例如,使用本机 VLAN 50 启用标记的 dot1q 流量) vnic0、vnic1 上的本机 VLAN 51 等等,以及 eth0 作为中继(允许所有或部分 VLAN 沿其传输),严重的布朗尼分数将归功于您。 :)
我已经尝试过以下操作:
modprobe dummy
ip link set name vnic0 dev dummy0
ip link add vbr0 type bridge
ip link eth0 down
ip link set dev eth0 master vbr0
ip link set dev vnic0 master vbr0
ip link set vbr0 up
ip link set vnic0 up
ip link set eth0 up
最大的问题是我的 vnic0 网络广播数据包,但从未接收到它们。我的网络不是很活跃,但我希望至少能看到 vnic0 通过 vbr0 接收到的一些广播数据包。然而,这并没有发生。尽管有一个连接到 eth0 的功能完美的 DHCP 服务器,但尝试在连接到 vnic0 的虚拟机内运行 DHCP 会导致超时。
答案1
不要使用虚拟设备
这种情况经常出现,我不知道为什么人们坚持使用它们。虚拟设备仅有用允许长期存在的应用程序绑定到特定的 IP 地址,因此如果需要,可以移动虚拟设备并桥接到其他寿命较短的设备。
你想要的是麦克夫兰或几个替换您的vnic*
.尽管有这个名称,macvlan 与 VLAN 标记无关。 macvlan 将在第 2 层上运行,已经桥接到主接口 ( eth0
),如果需要,您可以选择可能限制桥接设备交互的多种模式之一。
答案2
虚拟以太网接口是成对创建的虚拟接口,其作用类似于跳线:
ip link add name nic0 type veth peer name vnic0 address 00:11:22:33:44:55
ip link set dev eth-VM master vbr0
ip link set nic0 up
ip link set vnic0 up
您最终应该得到一个vnic0
可以分配给虚拟机的松散的 00:11:22:33:44:55 MAC 地址。它们在麦克夫兰上面提到的页面。我对 macvlan 不太了解,但这应该也能工作,而且你不会使用bridge vbr0
。
ip link add link eth0 name vnic0 address 00:11:22:33:44:55 type macvlan mode bridge
ip link set vnic0 up