KVM:专门为虚拟机分配以太网端口

KVM:专门为虚拟机分配以太网端口

我需要使用 KVM 虚拟化 pfSense。目前,pfSense 在裸机上运行。但是,我不确定如何操作才能不造成安全风险。

我运行 pfSense 的机器不支持 Vt-d/IOMMU,仅支持 Vt-x。如果我理解正确的话,这意味着我不能只将 PCI 设备的控制权交给 pfSense,而需要使用 virtio 来分配以太网接口。它有两个英特尔千兆以太网端口,一个连接到互联网提供商 (WAN),另一个连接到我的家庭网络 (LAN)。

我需要如何设置 Linux 和 KVM,以便虚拟机主机无法使用 WAN 端口?我想避免运行 KVM 的 Linux 直接访问 WAN 端口 - 它应该只使用 LAN 端口,并且到外部的流量应该通过 pfSense 运行。

答案1

您可以使用桥接网络,而桥接器(主机端)无需任何 IP 配置。

请注意,使用桥接网络时,您的虚拟机将暴露于桥接网卡连接到。就你的情况而言,互联网。VM 将直接从您的 ISP 获取 IP(无论是公共 IP 还是私有 IP 都取决于它)。

如何做到这一点实际上取决于您的偏好以及您使用的网络代理/管理器。因此,我将仅介绍一下这个概念ip


创建桥梁:

ip link add name br0 type bridge

将虚拟机的 NIC(“WAN 端口”)连接到网桥:

ip link set enp3s0 master br0

(替换enp3s0为您的“WAN 端口”的接口名称)

为虚拟机创建一个tap用于连接网桥的网桥:

ip tuntap add name tap0 mode tap

连接tap到桥:

ip link set tap0 master br0

为了避免任何 IPv6 自动配置,您可以使用 sysctl disable_ipv6

sysctl net.ipv6.conf.enp3s0.disable_ipv6=1
sysctl net.ipv6.conf.br0.disable_ipv6=1
sysctl net.ipv6.conf.tap0.disable_ipv6=1

启动接口:

ip link set enp3s0 up
ip link set br0 up
ip link set tap0 up

然后你就可以-net tap在 qemu 中使用了。例如,-net tap,ifname=tap0,script=no,downscript=no。(你也可以添加,vhost=on以获得更好的性能。)

实际上,您可以使用,script=someup.sh,downscript=somedown.sh它来告诉 qemu 在 VM/tap 启动和关闭时分别运行脚本。但是,恕我直言,这不是一个好方法,因为脚本可能需要以 root 身份运行,因此如果您使用这些参数,则 VM 也必须以 root 身份启动。因此,如果我想要一种类似的方法,我宁愿像这样包装 qemu:

#!/bin/bash
sudo /path/to/someup.sh
qemu-system-x86_64 ...
sudo /path/to/somedown.sh

如果您希望tap在虚拟机启动和关闭时动态创建和删除,您可能需要使用qemu-bridge-helper为此,请跳过上面涉及的步骤tap相反,您需要创建一个访问控制列表:

[tom@localhost ~]$ cat /etc/qemu/bridge.conf 
allow br0

显然,它是允许使用的桥梁列表qemu-bridge-helper

完成后,你就可以-net bridge在 qemu 中使用了。可能或不可能需要指定要使用的桥接器和/或 的路径qemu-bridge-helper。例如,-net bridge,br=br0,helper=/usr/lib/qemu/qemu-bridge-helper


请注意,除了-net tap 或者 -net bridge,您还需要添加一个-net nic。它与客户端的接口呈现有关。例如,-net nic,model=virtio。您可能还想使用指定 MAC 地址,macaddr=xx:xx:xx:xx:xx:xx。如果这样做,请不要使用主机端接口的任何 MAC 地址涉及(即本例中的 enp3s0、br0 和 tap0),否则它将不起作用。如果您不指定,qemu 将使用默认值52:54:00:12:34:56。因此,除非您要拥有多个互连的虚拟机,否则这是可选的。

相关内容