
Tengo una configuración de kvm con varias máquinas virtuales invitadas que ejecutan ubuntu.
Por alguna razón, ya no puedo enviar tráfico a través del puerto 80 desde los invitados hacia el exterior. Al revés, funciona bien: Apache entrega las páginas web alojadas como debería. Otros puertos como ssh también funcionan bien.
Aquí hay un ejemplo:
me@guest:~$ curl heise.de
curl: (7) Failed to connect to 2a02:2e0:3fe:100::8: Network is unreachable
Curl falla con la red inalcanzable después de un tiempo de espera bastante largo y parece intentar utilizar la dirección IPv6, lo que se supone que no debe hacer. Curl versus dominios alojados localmente funciona.
El ping funciona:
me@guest:~$ ping heise.de
PING heise.de (193.99.144.80) 56(84) bytes of data.
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=1 ttl=245 time=6.92 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=2 ttl=245 time=7.05 ms
Dado que les sucedió a todos mis invitados al mismo tiempo, creo que debe ser algo que le hice al anfitrión. Pero incluso cuando desactivo todas mis reglas de iptables caseras, todavía no funciona.
Entonces, en algún lugar dentro de la red kvm/libvirt, mis solicitudes http van a donde no deberían. Aquí está mi configuración de red para KVM
<network>
<name>network_nat</name>
<uuid>....</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:30:9B:D6'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.128' end='192.168.100.254' />
<host mac='52:54:00:e4:71:f5' name='web' ip='192.168.100.210' />
</dhcp>
</ip>
</network>
Mis invitados están configurados para usar esa red. Dhcp parece funcionar: al menos el invitado tiene la dirección IP que configuré.
Entonces, ¿por qué no puedo acceder a ningún sitio web de mis invitados?
Respuesta1
Parte del problema se resolvió después de reiniciar. Quizás sea eso seguir los consejos aquí:http://wiki.libvirt.org/page/Networkingayudó a arreglar la interfaz de red.
Agregué estas líneas a/etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
También cambié la definición de mi interfaz para /etc/network/interfaces
que se vea así:
auto br0
iface br0 inet static
address 176.9.xxx.xxx
broadcast 176.9.xxx.xxx
netmask 255.255.255.224
gateway 176.9.xxx.xxx
bridge_ports eth0
bridge_fd 0
bridge_maxage 0
bridge_stp off
Después de estos 2 cambios (que pueden haber ayudado o no) y un reinicio curl ya no presentaba un tiempo de espera y un error de "red irrecuperable", sino que producía un resultado de mi apache local. Quedó claro que la culpa era de mi propio reenvío de puertos en iptables. No había especificado una interfaz entrante para el reenvío de puertos 80 y 443. Agregué br0 y luego todo funcionó bien.
Aquí están mis reglas de iptables para el reenvío de puertos. Estoy usando esto en combinación con ufw como firewall, así que tengo estas líneas al final de/etc/ufw/before.rules
Este se agrega a la tabla de filtros:
-I FORWARD -m state -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
Y esta es mi mesa nat. El error fue omitir el --in-interface
parámetro:
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 12345 -j DNAT --to 192.168.100.210:22
-A PREROUTING -p tcp --in-interface br0 --dport 80 -j DNAT --to 192.168.100.210:80
-A PREROUTING -p tcp --in-interface br0 --dport 443 -j DNAT --to 192.168.100.210:443
-A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
COMMIT
(Nota: por alguna razón, ingresar estas mismas reglas manualmente mientras ufw está deshabilitado no produce una configuración de reenvío de puertos que funcione).