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


14

主机有一个可用的外部IP,因此我用NAT设置了KVM guest虚拟机。

如何设置端口转发以将某些请求从外部转发给来宾?

我找不到与此有关的任何文档。最接近的答案可能就是这个答案,但是在libvirt 0.8.3中也提到了更简单的方法。有谁知道更新的方法吗?


外部的-您的意思是互联网IP?或只是您的LAN(VM外部)?您可以将这些外部地址分配给您的VM来建立桥接网络吗?
Art Shayderov

我只能获得一个Internet IP地址,这就是为什么我不使用桥接网络模式的原因。

Answers:


12

这是使用钩子脚本(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 。

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


1
Trusty /etc/libvirt/hooks/** rmix,默认情况下在apparmor配置文件中有一行,并且似乎具有相同的效果。我可以运行脚本而无需修改apparmor配置。
阿米尔·阿里·阿克巴里

2

我也有类似情况。我有一个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规则,我已经丢失了它:-(


我知道它已有几年历史了,但是这个答案对我有用。谢谢!
mttdbrd 2014年

1

我相信您引用的答案仍然显示适当的iptables规则。但是,现在可以在启动和停止虚拟机时使用脚本钩子来创建和销毁规则。就像Isaac在上一个答案中所说的那样,当前的libvirt 中也有网络过滤器,但是我不确定如何甚至可以将它们用于为NAT来宾打开端口。


0

访客网络如何设置?如果是桥接的,则只需将端口转发到来宾的IP。如果您的访客位于另一个NAT后面,则设置一个libvirt,那么它将变得很复杂

但是无论如何,在这里您只需要像对待物理机一样对待虚拟机


我想我没有说清楚。主机不在NAT中,它具有一个外部IP地址。不幸的是,来宾网络位于libvirt建立的NAT的背后。

啊,那是另一回事。基本上libvirt管理它自己的NAT解决方案,该解决方案可以编辑。
dyasny 2011年

是的,这就是我所知道的,可以对其进行编辑。但是我只是找不到任何参考,nwfilter xml配置文件对我来说似乎很奇怪,libvirt网站上的文档也没有太大帮助。
wei

如果桥接网络,则可以放弃默认的libvirt NAT并设置所需的任何内容。如dyasny所说,将VM视为物理机。我有KVM主机,并且将具有外部IP的接口分配给配置为网关的VM。如果适合您的需求,我可以发布配置(ubuntu风格)。
Art Shayderov'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.