主机有一个可用的外部 IP,因此我使用 NAT 设置了我的 KVM 客户机。
如何设置端口转发以将一些外部请求转发给客人?
我找不到任何关于此的文档。最接近的答案可能是这个答案,但随后还提到在 libvirt 0.8.3 中有更简单的方法可以做到这一点。有人知道更现代的方法来做到这一点吗?
答案1
这是设置端口转发的更好方法,使用钩子脚本(来源)。
在/etc/libvirt/hooks/qemu
:
#!/bin/sh
GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=
if [ "$1" = "$GUEST_NAME" ]; then
if [ "$2" = start ]; then
iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
-j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
--state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
elif [ "$2" = stopped ]; then
iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
-j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
--state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
fi
fi
您应该设置顶部的四个变量以适合您的 libvirt 设置。
您将需要重新启动 libvirt-bin,在 ubuntu 上执行此操作:
sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'
然后您需要重新启动客户机。在 Ubuntu 上,您需要进行调整/etc/apparmor.d/usr.sbin.libvirtd
以允许钩子脚本执行:
旁边
/usr/sbin/* PUx,
附加
/etc/libvirt/hooks/* PUx,
然后重新加载 apparmor:
sudo service apparmor reload
可能有一种方法可以$GUEST_IPADDR
使用 virsh / dumpxml / iface-dumpxml 进行自动配置,但我还没有找到。或者,可以在网络 xml 中静态设置 IP:文档。
据我所知,网络过滤器只能用于限制虚拟网络上发生的事情,并且它们对于端口转发没有用。
答案2
我的情况类似。我在私有 NATed 网络中的 KVM 中运行 Windows Server,该服务器通过接口 virbr0 连接到主机。我想通过远程桌面访问虚拟机。因此,我必须将流量转发到端口 3389 (RDP) 到虚拟机端口 3389。我已经使用一些 iptable 规则实现了这一点。
/sbin/iptables -t nat -A PREROUTING -p tcp -d 主机 IP --dport 3389 -j DNAT --to-destination 虚拟机 IP:3389
/sbin/iptables -I FORWARD -m state -d VM-NET/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
当然,必须采用 HOST-IP、VM-IP 和 VM-NET。但是,使用 iptables 和 libvirt 很棘手。现在,我正在寻找一种解决方案,以便在我的虚拟机上获得互联网访问权限,由于使用 iptable 规则,我失去了它 :-(
答案3
答案4
访客网络是如何设置的?如果是桥接的,您需要做的就是将端口转发到访客的 IP。如果您的访客位于另一个 NAT(libvirt 设置的 NAT)后面,那么情况就会变得复杂
但无论如何,在这里你只需将虚拟机视为物理机