Networking

如何禁用 QEMU 訪客對主機埠的訪問

  • May 1, 2021

我正在使用以下命令來執行 QEMU VM:

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

預設情況下,客戶作業系統可以訪問網際網路,但也可以訪問主機作業系統上的開放埠。如何防止來賓作業系統訪問主機埠(但不限制其網際網路訪問)?

如果您沒有高級 iptables 操作的經驗和 Linux 如何過濾本地程序流量的概述,這看起來有些問題。

在您的模式下,qemu 執行一個模擬的 NAT:所有來自 guest 的對 NIC 的呼叫都將被 qemu 程序本身轉換為 socket/connect/send/recv 呼叫。這意味著連接是由機器本身從 127.0.0.1 建立的。此時,您可以以另一個使用者身份執行 qemu,並通過添加owner匹配項來過濾該使用者:

iptables -I OUTPUT -o lo -m owner --uid-owner username -m multiport --dports ports -j DROP

whereusername是您要過濾的使用者名,並且ports是您希望為該機器禁用的埠的逗號分隔列表。要以其他使用者身份執行 qemu,您需要通過類似工具執行它,或者使用或sudo以使用者身份登錄。su``login

沒有這個,你最終會過濾自己,所以如果你要添加一個通用規則來過濾埠,你也將被阻止訪問這些埠。

另一種方法是改變 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

應該管用。

但是 NAT 停止工作。如果您需要讓 NAT 再次工作,您應該添加一條規則來修補從您的機器發出的 IP 地址。如果您有eth0所有流量流向的介面,請為其啟用 NAT:

iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

引用自:https://unix.stackexchange.com/questions/251721