37 votos

El reenvío de puertos para los huéspedes en libvirt / KVM

¿Cómo puedo reenviar los puertos de un servidor que ejecuta libvirt/KVM a los puertos especificados en VM, cuando el uso de NAT?

Por ejemplo, el host tiene una dirección IP pública de 1.2.3.4. Quiero redirigir el puerto 80 a la dirección 10.0.0.1 y el puerto 22 a 10.0.0.2.

Asumo que necesita para agregar reglas iptables, pero no estoy seguro de que es apropiado y lo que exactamente debe ser especificado.

Salida de iptables-L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.0.0.0/24         state RELATED,ESTABLISHED 
ACCEPT     all  --  10.0.0.0/24          anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

La salida de ifconfig

eth0      Link encap:Ethernet  HWaddr 00:1b:fc:46:73:b9  
          inet addr:192.168.1.14  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:fcff:fe46:73b9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:201 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31161 (31.1 KB)  TX bytes:12090 (12.0 KB)
          Interrupt:17 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

virbr1    Link encap:Ethernet  HWaddr ca:70:d1:77:b2:48  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::c870:d1ff:fe77:b248/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)

Estoy usando Ubuntu 10.04.

40voto

Ben Noland Puntos 10060

La última versión estable para libvirt para Ubuntu es la versión 0.7.5, que no tiene algunas de las características más recientes (es decir, la secuencia de comandos de los ganchos y los filtros de red) que hacen de la red automática de configuración fácil. Eso dicho, aquí es cómo habilitar el reenvío de puerto para libvirt 0.7.5 en Ubuntu 10.04 Lucid Lynx.

Estas reglas iptables debe hacer el truco:

iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

El valor predeterminado KVM NAT config proporciona una regla similar a la 3ª me dio anteriormente, pero omite el NUEVO estado, que es esencial para aceptar conexiones entrantes.

Si se escribe una secuencia de comandos de inicio para agregar estas reglas y usted no tiene cuidado, libvirt 0.7.5 anula ellos mediante la inserción de su propio. Así, con el fin de asegurarse de que estas reglas se aplican correctamente en el inicio, usted necesita para asegurarse de libvirt se ha inicializado antes de insertar sus reglas.

Agregue las siguientes líneas a /etc/rc.local, antes de la línea exit 0:

(
# Make sure the libvirt has started and has initialized its network.
while [ `ps -e | grep -c libvirtd` -lt 1 ]; do
        sleep 1
done
sleep 10
# Set up custom iptables rules.
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
) &

El sleep 10 de arriba es un hack para asegurarse de que el demonio libvirt ha tenido una oportunidad para inicializar sus reglas iptables antes de añadir los nuestros propios. No puedo esperar hasta que suelte libvirt la versión 0.8.3 para Ubuntu.

18voto

Adam Spiers Puntos 211

Se me ocurrió una manera de configurar la redirección de puertos en la marcha cuando el huésped está utilizando de modo de usuario de redes y blogs sobre ello aquí:

http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/

Usted puede ver los detalles, pero por conveniencia, aquí está la solución que se me ocurrió:

virsh qemu-monitor-command --hmp sles11 'hostfwd_add ::2222-:22'

Este one-liner es mucho más fácil que las otras respuestas, pero sólo funciona en algunos escenarios.

3voto

topdog Puntos 2793
iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
 iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 22 -j DNAT --to-destination 10.0.0.1

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: