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

wei*_*wei 14 ubuntu libvirt kvm-virtualization

主机有一个可用的外部 IP,因此我使用 NAT 设置了我的 KVM 来宾。

如何设置端口转发来转发一些来自外部的请求给客人?

我找不到任何关于此的文档。最接近的答案可能是这个答案,但也提到在 libvirt 0.8.3 中有更简单的方法来做到这一点。有谁知道更现代的方法来做到这一点?

Tob*_*obu 15

这是使用钩子脚本(source)设置端口转发的更好方法。

/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
Run Code Online (Sandbox Code Playgroud)

您应该在顶部设置四个变量以适合您的 libvirt 设置。

您将需要重新启动 libvirt-bin,这在 ubuntu 上是通过以下方式完成的:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'
Run Code Online (Sandbox Code Playgroud)

那么您将需要重新启动来宾。在 Ubuntu 上,您需要进行调整/etc/apparmor.d/usr.sbin.libvirtd以允许钩子脚本执行:

旁边

/usr/sbin/* PUx,
Run Code Online (Sandbox Code Playgroud)

附加

/etc/libvirt/hooks/* PUx,
Run Code Online (Sandbox Code Playgroud)

然后重新加载apparmor:

sudo service apparmor reload
Run Code Online (Sandbox Code Playgroud)

可能有一种$GUEST_IPADDR使用 virsh / dumpxml / iface-dumpxml进行自动配置的方法,但我还没有找到。或者,可以在网络 xml:文档中静态设置 IP 。

据我所知,网络过滤器只能用于限制虚拟网络上发生的事情,它们对端口转发没有用。