如何禁用 QEMU 来宾访问主机端口

Tim*_*ean 4 networking kvm qemu

我使用以下命令来运行 QEMU VM:

qemu-system-x86_64 -enable-kvm -m 1024 -smp 2 -hda disk.qcow2

默认情况下,来宾操作系统可以访问互联网,但也可以访问主机操作系统上的开放端口。如何防止来宾操作系统访问主机端口(但不限制其互联网访问)?

小智 5

如果您没有高级 iptables 操作经验以及 Linux 如何过滤本地进程流量的概述,这看起来有些问题。

在您的模式下,qemu 运行模拟 NAT:来自 guest 虚拟机的所有对 NIC 的调用都将被 qemu 进程本身转换为套接字/连接/发送/接收调用。这意味着连接是由机器本身从 127.0.0.1 建立的。此时,您可以作为另一个用户运行 qemu,并通过添加owner匹配来过滤该用户:

iptables -I OUTPUT -o lo -m owner --uid-owner username -m multiport --dports ports -j DROP
Run Code Online (Sandbox Code Playgroud)

其中username是要过滤的用户名,ports是要为该计算机禁用的端口的逗号分隔列表。要以其他用户身份运行 qemu,您需要通过或 以用户身份使用或sudo登录等工具来运行它。sulogin

如果没有这个,您最终会过滤自己,因此如果您添加通用规则来过滤端口,您也将被阻止访问这些端口。

另一种方法是改变 qemu 的网络方式。过滤流量的一个好方法是将 qemu 绑定到虚拟以太网设备:

  • 启用数据包转发。

  • 安装tunctl,添加虚拟网络接口,所有者是你:

tunctl -u yourname -t qemu

(记得将此命令添加到诸如rc.local使其永久化的命令中)

  • 配置 qemu 接口(使用ip/ifconfig或其他操作系统提供的工具)为其分配一个空闲的 /24 子网。该子网也需要在您的来宾操作系统中设置。然后使用 运行 qemu -net tap,ifname=qemu,script=off。再次配置来宾操作系统网络。

然后您可以轻松过滤由虚拟接口表示的来宾操作系统流量qemu

iptables -I FORWARD -i qemu -m multiport --dports ports -j DROP
Run Code Online (Sandbox Code Playgroud)

应该管用。

但 NAT 停止工作了。如果您需要使 NAT 再次工作,您应该添加一条规则来修补从您的计算机发出的 IP 地址。如果您有eth0所有流量都经过的接口,则为其启用 NAT:

iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)