问题描述
主机有一个可用的外部IP,因此我用NAT设置了KVM guest虚拟机。
如何设置端口转发以将某些请求从外部转发给来宾?
我找不到与此有关的任何文档。最接近的答案可能是this answer,但是在libvirt 0.8.3中也提到了更简单的方法。有谁知道更新的方法吗?
最佳办法
这是使用钩子脚本(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
您应该在顶部设置四个变量以适合您的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
可能有一种使用virsh /dumpxml /iface-dumpxml自动配置$GUEST_IPADDR
的方法,但我没有找到它。或者,可以在网络xml中静态设置IP:documentation。
据我所知,网络过滤器只能用于限制虚拟网络上发生的事情,它们对端口转发没有用。