我有一个带有多个 eth N接口(我的“大防火墙”)的 Linux 防火墙路由器(专用机器)。所有转发的流量都由一组iptables
规则过滤(默认策略 DROP)。
还有另一台专用机器(“vmhost”)将使用 KVM / QEMU / libvirt / virsh 托管多个虚拟机。
防火墙路由器(物理服务器)和vm主机(另一台物理服务器)通过跳线直接连接(路由器的eth2 <-> vmhost的eth0)。
我不希望 vmhost 上的虚拟机能够通信
- 对彼此
- 或到 VM 主机
除了通过外部防火墙路由器。
因此,我在两侧(路由器和 vmhost)配置了多个 802.1q 标记的 VLAN:eth0.10、eth0.11 等(另一侧为 eth2.10、eth2.11、...),每个都有一个不同的/30
子网(一个主机 IP = 路由器,另一台主机 IP = VM)。因此,每个虚拟机都有自己的标记 VLAN 和自己的子网。
我想用它来将 VM 流量从属于中央防火墙路由器的 iptables 规则。VM 只能访问明确允许的 IP 地址和端口。
如何将 VM 配置为绑定到专用 VLAN 接口(例如eth0.10
)?关于net
, netdev
, nic
, ...
我明确不想在虚拟机的网络或虚拟机和主机之间架起桥梁。
// 稍后添加:两台服务器都使用 Debian 10 amd64。
一般有几种方法。请注意,其中一些不会让您四处桥接。尽管如此,配置仍然是安全的。
Linux 上桥接的基础知识在这里,例如:https ://developers.redhat.com/blog/2017/09/14/vlan-filter-support-on-bridge/
多座桥梁
这是旧方法,在非常旧的 Linux 中可用,一旦它同时支持网桥和 VLAN。它的缺点是配置相当混乱,但在某种程度上更容易理解和管理。
您在主机上为每个 VLAN 子接口配置一个网桥,如下所示:
等等。之后如果你把VM虚拟网卡放到这个
br100
里面,它的未标记数据包会出现在eth0之外,标记为VLAN 100,反之亦然,标记为VLAN100的数据包会到达这个VM。您在 vNIC 设置中指定到 VM 域文件中的此网桥。要将 VM 放入多个 VLAN,您需要为每个 VLAN 创建一个专用的虚拟 NIC。如果您不启用“bridge vlan_filtering”,Proxmox VE 也会使用此方法。您没有指定在哪个发行版上运行 libvirt,因此我无法建议在您的特定情况下如何达到此配置。你可以在这里看到它在 Debian 上的样子。
原则上,您可以使用“未标记的默认”VLAN 来管理主机。我不建议这样做,那样您将无法通过此 VLAN 进入任何 VM(不要将 master
eth0
放入任何网桥!)。最好定义一个管理 VLAN,为其创建一个网桥并将 IP 地址应用于主机上的管理网桥。假设这个 vlan 100 用于管理:单桥
这是“新”方法,一旦 Linux 桥代码支持 vlan 过滤就可以使用。它的主要优点是使 Linux 成为真正的 L2 交换机,配置不那么混乱 - 你只有一个网桥。当启用“bridge vlan_filtering”时,Proxmox VE 直接支持它。
不幸的是,根据他们的手册,libvirt 并不直接支持这种方法。我不知道为什么,他们似乎很懒惰,因为内核中的一切都在那里。我会在这里记录它,希望他们最终会支持它。
您创建一个桥:
现在添加 VLAN 并定义标记和未标记的 VLAN。请记住,
br0
它既是网桥名称,也是该网桥通往主机的端口名称。因此,您可能希望在已标记或未标记的主机上设置未标记的管理 VLANenp0s1
;对于这种设置,这不会有任何问题。假设它的 ID 是 100,并且它被标记在电线上:现在带有 IP 地址的数据包将从标记为 100 的 enp0s1 发出。
所有 VM vNIC 都将连接到此网桥。但是,现在您需要设置哪些 VLAN 在哪里。同样,libvirt 不知道如何做到这一点。您需要根据需要将它们的 VLAN 添加到物理接口(我希望标记)和 vNIC 接口(标记或未标记)。您必须手动执行此操作,就像对管理界面执行此操作一样。您可以将多个 vlan 传递给同一个 vNIC,只要确保其中不超过一个是未标记的。
其他方法
其他方法包括:
OpenVSwitch — libvirt 直接支持 vlan,但我不喜欢它,我认为它过于复杂。
VEPA — 一种很好的方法,支持在 libvirt 域文件中设置 VLAN,准确捕获您想要的内容。我不得不推荐它,但我从未使用 VLAN 配置它,所以我不能。也许其他人尝试过并会详细解释。一般来说,它具有与“单桥”相同级别的便利性,除了虚拟机之间或虚拟机与主机之间的通信即使需要,即使它们在同一个 VLAN 中也是不可能的。