在 Ubuntu 上使用 KVM 通过 libvirt 0.8.3 实现从主机到客户的端口转发

在 Ubuntu 上使用 KVM 通过 libvirt 0.8.3 实现从主机到客户的端口转发

主机有一个可用的外部 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

我相信您引用的答案仍然显示了适当的 iptables 规则。但是,现在您可以使用脚本钩子在虚拟机启动和停止时创建和销毁规则。正如 Isaac 在上一个回答中所说,还有网络过滤器在当前的 libvirt 中,但我不确定如何或者是否可以用它们来为 NATed 客户机打开端口。

答案4

访客网络是如何设置的?如果是桥接的,您需要做的就是将端口转发到访客的 IP。如果您的访客位于另一个 NAT(libvirt 设置的 NAT)后面,那么情况就会变得复杂

但无论如何,在这里你只需将虚拟机视为物理机

相关内容