Answers:
这是使用钩子脚本(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
可能有一种$GUEST_IPADDR
使用virsh / dumpxml / iface-dumpxml 进行自动配置的方法,但是我没有找到它。或者,可以在网络xml:documentation中静态设置IP 。
据我所知,网络过滤器只能用于限制虚拟网络上发生的事情,它们对端口转发没有用。
/etc/libvirt/hooks/** rmix,
默认情况下在apparmor配置文件中有一行,并且似乎具有相同的效果。我可以运行脚本而无需修改apparmor配置。
我也有类似情况。我有一个Windows Server在专用NATed网络中的KVM中运行,该Windows Server通过接口virbr0连接在主机上。我想通过远程桌面访问VM。因此,我必须将流量从端口3389(RDP)转发到VM端口3389。我已经通过一些iptable规则实现了这一点。
/ sbin / iptables -t nat -A路由-p tcp -d HOST-IP --dport 3389 -j DNAT --to-目的地VM-IP:3389
/ sbin / iptables -I FORWARD -m状态-d VM-NET / 24 --state新,相关,已确定-j接受
当然必须采用HOST-IP,VM-IP和VM-NET。但是,将iptables和libvirt弄混是很棘手的。现在,我正在寻找一种解决方案,以便在我的VM上获得Internet访问权限,由于弄乱了iptable规则,我已经丢失了它:-(
访客网络如何设置?如果是桥接的,则只需将端口转发到来宾的IP。如果您的访客位于另一个NAT后面,则设置一个libvirt,那么它将变得很复杂
但是无论如何,在这里您只需要像对待物理机一样对待虚拟机