Cómo configurar el reenvío de puertos a la VM invitada usando iptables

Cómo configurar el reenvío de puertos a la VM invitada usando iptables

Estoy intentando hacer una prueba de concepto para el reenvío de puertos a un servidor invitado libvirt.

Las siguientes son las variables que uso para la generalización:

port=500                    # Arbitrary port, for proof of concept
public_if=wlp0s20f3         # My public interface, connected to the internet.
private_if=virbr0           # My private interface, through which the guest OS communicates
public_ip=192.168.0.11      # public interface's IP
private_ip=192.168.122.1    # private interface's IP
guest_ip=192.168.122.175    # Guest's IP

El invitado es solo un CD en vivo de Ubuntu con el comando sudo nc -l 500 -kejecutándose en una terminal. Pruebo mi configuración ejecutando nmap $public_ip -p $port. Cuando ejecuto nmap $guest_ip -p $port, muestra el puerto como "abierto".

Por supuesto, esto parece una tarea relativamente simple y bien documentada; sin embargo, ninguno de los tutoriales que he probado parece funcionar.

En primer lugar, en todos los casos ejecuto lo siguiente:echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Luego probé el siguiente conjunto de comandos, desdeeste tutorial:

sudo iptables -A FORWARD -i $public_if -o $private_if -p tcp --syn --dport $port -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i $public_if -o $private_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i $private_if -o $public_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -t nat -A PREROUTING -i $public_if -p tcp --dport $port -j DNAT --to-destination $guest_ip
sudo iptables -t nat -A POSTROUTING -o $private_if -p tcp --dport $port -d $guest_ip -j SNAT --to-source $private_ip

Esto no lo hace. Después sudo iptables -F, también probé los siguientes comandos, desdeesta respuesta:

sudo iptables -t nat -I PREROUTING -p tcp -d $public_ip --dport $port -j DNAT --to-destination $guest_ip:$port
sudo iptables -I FORWARD -m state -d $private_ip/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

Y tampoco funcionó. El puerto permanece cerrado el $public_ip.

Para obtener más contexto, estoy ejecutando estas reglas después de iniciar mi invitado y después de iniciar el servidor simulado en él.

¿Qué podría estar haciendo mal? ¿Alguna sugerencia sobre cómo podría depurar esto?

Actualizar:

Intenté ejecutar la captura de paquetes tanto en el host como en el invitado.

Sobre el anfitrión:

sudo tcpdump -i $private_if

Absolutamente no hay salida en nmap $public_ip -p $port, pero hay salida cuando nmap $guest_ip -p $port.

Sobre el invitado:

sudo tcpdump

Exactamente lo mismo que el anterior. Parece indicar que el anfitrión tiene la culpa.

Respuesta1

El problema es cómo se prueba.

Ejecutarlo nmap $public_ip -p $porten el host no es lo mismo que ejecutarlo en otra máquina de la red. Lo más importante aquí es que el paquete SYN no pasará por el gancho PREROUTING, que dirige el paquete al invitado. Solo pasará por los ganchos OUTPUT y POSTROUTING, en ese orden.

Para que conste, el primer conjunto de líneas no funciona. El segundo conjunto de líneas sí.

información relacionada