Reenvío de puertos del host al invitado con libvirt 0.8.3 Uso de KVM en Ubuntu


14

El host tiene una única IP externa disponible, por lo que configuré a mis invitados KVM con NAT.

¿Cómo configuro un reenvío de puertos para reenviar algunas de las solicitudes desde el exterior a los invitados?

No pude encontrar ninguna documentación sobre esto. La respuesta más cercana es probablemente esta respuesta , pero también se menciona que hay una manera más fácil de hacerlo en libvirt 0.8.3. ¿Alguien sabe de una forma más actual de hacer esto?


externo: ¿te refieres a IP de internet? o solo su LAN (externa a las máquinas virtuales)? ¿Puede asignar esas direcciones externas a sus máquinas virtuales para configurar redes en puente?
Art Shayderov

Solo puedo obtener una dirección IP de Internet, por eso no utilicé el modo de red en puente.
wei

Respuestas:


12

Aquí hay una mejor manera de configurar el reenvío de puertos, utilizando un script de enlace ( fuente ).

En /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

Debe configurar las cuatro variables en la parte superior para que se ajusten a su configuración de libvirt.

Deberá reiniciar libvirt-bin, que en ubuntu se hace con:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

entonces deberá reiniciar el invitado. En Ubuntu, deberá ajustar /etc/apparmor.d/usr.sbin.libvirtdpara permitir que se ejecute el script de enlace:

Cerca de

/usr/sbin/* PUx,

adjuntar

/etc/libvirt/hooks/* PUx,

Luego vuelva a cargar apparmor:

sudo service apparmor reload

Probablemente haya una manera de autoconfigurarse $GUEST_IPADDRusando virsh / dumpxml / iface-dumpxml, pero no la he encontrado. Alternativamente, la IP puede establecerse estáticamente en la red xml: documentación .

Por lo que puedo decir, los filtros de red solo se pueden usar para restringir lo que sucede en la red virtual, y no son útiles para el reenvío de puertos.


1
Trusty tiene una línea /etc/libvirt/hooks/** rmix,en el archivo de configuración de apparmor de forma predeterminada, y parece tener el mismo efecto. Podría ejecutar el script sin modificar la configuración de apparmor.
Amir Ali Akbari

2

Estoy en una situación similar Tengo un servidor de Windows ejecutándose en KVM en la red privada NAT que está conectada al host a través de la interfaz virbr0. Quiero acceder a la VM a través del escritorio remoto. Así que tengo que reenviar el tráfico al puerto 3389 (RDP) al puerto VM 3389. He logrado esto con algunas reglas iptable.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --dport 3389 -j DNAT --to-destination VM-IP: 3389

/ sbin / iptables -I ADELANTE -m estado -d VM-NET / 24 - estado NUEVO, RELACIONADO, ESTABLECIDO -j ACEPTAR

HOST-IP, VM-IP y VM-NET tienen que ser adoptados, por supuesto. Sin embargo, jugar con iptables y libvirt es complicado. En este momento estoy buscando una solución para obtener acceso a Internet en mi máquina virtual que he perdido debido a un error con las reglas de iptable :-(


Sé que tiene algunos años, pero esta respuesta funcionó para mí. ¡Gracias!
mttdbrd

1

Creo que la respuesta a la que hace referencia todavía muestra las reglas apropiadas de iptables. Sin embargo, ahora podría usar un enlace de secuencia de comandos para crear y destruir reglas cuando las máquinas virtuales se inician y se detienen. Como Isaac dijo en la respuesta anterior, también hay filtros de red en libvirt actual, pero no estoy seguro de cómo o incluso si se pueden usar para abrir puertos para invitados NAT.


0

¿Cómo se configura la red de invitados? Si está puenteado, todo lo que necesita hacer es reenviar los puertos a las direcciones IP de los invitados. Si sus invitados están detrás de otro NAT, el que libvirt configura, entonces se complica

pero en cualquier caso, aquí simplemente trata las máquinas virtuales como lo haría con una máquina física


Supongo que no lo dije muy claramente. El host no está en un NAT, tiene una dirección IP externa. Desafortunadamente, la red de invitados está detrás del NAT configurado por libvirt.
wei

ah, entonces es otro asunto. Básicamente, libvirt gestiona su propia solución NAT, que se puede editar.
dyasny

Sí, eso es lo que me han dicho, se puede editar. Pero no puedo encontrar ninguna referencia al respecto, los archivos de configuración xw de nwfilter me parecen extraños, la documentación en el sitio web de libvirt tampoco es muy útil.
wei

Si ha conectado en red, puede abandonar el libvirt NAT predeterminado y configurar lo que desee. Como dijo dyasny, trate a VM como lo haría con una máquina física. Tengo un host KVM y la interfaz con IP externa se asigna a una VM configurada como puerta de enlace. Si eso se adapta a sus necesidades, puedo publicar la configuración (estilo ubuntu).
Art Shayderov
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.