主机有一个可用的外部IP地址,所以我使用NAT来设置我的KVM访客。
如何设置一个端口转发来将来自外部的某些请求转发给客户端?
我找不到任何文件。 最接近的答案可能是这个答案 ,但是也提到在libvirt 0.8.3中有更简单的方法来做到这一点。 有谁知道更新的方式来做到这一点?
这是使用钩子脚本( 源代码 )设置端口转发的更好方法。
在/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
您应该在顶部设置四个variables以适应您的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来自动configuration$GUEST_IPADDR GUEST_IPADDR,但是我还没有find它。 或者,可以在networkingxml: 文档中静态设置IP。
据我所知,networkingfilter只能用来限制在虚拟networking上发生的事情,而对端口转发没有用处。
我处于类似的情况。 我有一个运行在私有NATnetworking中的KVM上的Windows Server,它通过接口virbr0连接到主机上。 我想通过远程桌面访问虚拟机。 所以我必须转发stream量到端口3389(RDP)的VM端口3389.我已经实现了一些iptable规则。
/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP –dport 3389 -j DNAT – 目标VM-IP:3389
/ sbin / iptables -I FORWARD -m状态-d VM-NET / 24 – 状态NEW,RELATED,ESTABLISHED -j ACCEPT
HOST-IP,VM-IP和VM-NET当然是必须采用的。 然而搞乱iptables和libvirt是棘手的。 现在,我正在寻找一种解决scheme,以获得互联网访问我的虚拟机,由于与iptable规则搞乱我已经失去了:-(
我相信你引用的答案仍然显示适当的iptables规则。 但是,现在,您可以使用脚本挂钩在虚拟机启动和停止时创build和销毁规则。 就像Isaac在前面的回答中所说的那样,在当前的libvirt中也有networkingfilter ,但是我不知道如何甚至是否可以用来为NAT客户端打开端口。
访客联网如何设置? 如果桥接,您只需将端口转发到访客的IP。 如果你的客人在另一个NAT之后,那么一个libvirt就build立起来了,然后就变得复杂了
但无论如何,在这里你只要像处理物理机一样对待虚拟机
您可以通过使用ssh tcp转发为自己授予对正在运行的VM的临时访问权限
例如,你有一个Windows VM,并希望访问其RDP端口:
主机ip:10.10.10.10
vm ip:192.168.180.5
rdp端口:3389
第一步:ssh -f 10.10.10.10 -L 3389:192.168.180.5:3389-N
第二步:使用你的rdp客户端连接到localhost:3389
而已。