我需要使用 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
。因此,除非您要拥有多个互连的虚拟机,否则这是可选的。