Reenvío de puertos con IPTABLES y VBox

Reenvío de puertos con IPTABLES y VBox

Tengo un pequeño problema para obtener una configuración adecuada de iptables en Ubuntu. Pero antes, déjame describirte la configuración de la red:

Estoy usando una línea xDSL terminada con módem+enrutador+DHCP que sirve a la subred 192.168.1.0/24. Mi computadora portátil y mi PC están conectadas a esta red y obtienen las direcciones 192.168.1.6 y 192.168.1.3 respectivamente. En la PC, tengo Ubuntu ejecutándose con VBox y 2 máquinas virtuales (ambas también Ubuntu). A la interfaz vboxnet0 en la PC se le asigna la IP 10.10.10.1 y las máquinas virtuales individuales obtienen 10.10.10.10 y 10.10.10.11. VM1 ejecuta el servidor web Apache con fines de prueba.

Ahora, desde mi PC (192.168.1.3), puedo acceder al sitio web alojado en VM1 Apache en 10.10.10.10 escribiendo la dirección en el navegador. No hay problemas ahí.

Sin embargo, me gustaría poder acceder al mismo sitio web desde mi computadora portátil (192.168.1.6), escribiendo el mismo 10.10.10.10 en la barra de direcciones del navegador. Sin embargo, esto no funciona. Por algún motivo no puedo acceder a la red. Parece que la dirección IP simplemente se desconoce en la red 192.168.1.x. Si hay una manera de configurarlo de manera sencilla a través de iptables, sería un gran comienzo.

Ahora, si ese paso es posible, me gustaría además poder configurar una configuración más compleja. Usando la dirección 192.168.1.3 y la dirección de puerto adecuada, me gustaría poder reenviar solicitudes de servicio específicas a la instancia de VM adecuada. Por ejemplo, 192.168.1.3:80 debería ir a VM1 y buscar el sitio web alojado en Apache. 192.168.1.3:4000 (por ejemplo), debe ir a VM2 y alojar allí el servicio SFTP. En resumen, me gustaría realizar un enrutamiento específico del puerto de destino en la PC para permitir la comunicación bidireccional entre las computadoras conectadas a redes 192.168.1.x y las máquinas virtuales que se ejecutan en la red 10.10.10.x. ¿Existe una solución sencilla para esto utilizando iptables?

Aquí hay un ejemplo que ya he preparado, pero no he podido hacer que el reenvío funcione correctamente. Estoy seguro de que hay toneladas de errores aquí: es el primer día que paso en iptables.

clear
# cleaning Firewall Rules , change ACCEPT to DROP if you want to shield
# the server, then you open ports as you need
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Accepts all established inbound connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# opening INPUT ports (22,80,8080)
iptables -A INPUT --protocol tcp --dport 22 -j ACCEPT && echo "rule input 22 ok"
iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT && echo "rule input 80 ok"
iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT && echo "rule input 443 ok"
iptables -A INPUT --protocol tcp --dport 8080 -j ACCEPT && echo "rule input 8080 ok"

#allow Loopback and networks
iptables -A INPUT -i lo -j ACCEPT  && echo "rule 7 ok"
#Accept any input from 10.10.10.0 network in vboxnet0 interface
iptables -A INPUT -s 10.10.10.0/24  -i vboxnet0 -j ACCEPT  && echo "rule 8 ok"

#enable Port forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Opening PREROUTING - Filtering : this make the port forwarding trick.
# Forward as many ports you want to certain machines of the network to provide services such web server, ftp server, etc...
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 192.168.1.0/24 --dport 8080 -j DNAT --to 10.10.10.10:80  && echo "rule 9 ok"
#iptables -t nat -A PREROUTING -p tcp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53  && echo "rule 10 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53  && echo "rule 11 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 21 -j DNAT --to 10.10.10.16:21  && echo "rule 12 ok"

#Opening FORWARD ports for network services on vlan
iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 80 -j ACCEPT && echo "rule 13 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 21 -j ACCEPT  && echo "rule 14 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 68 -j ACCEPT  && echo "rule 15 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 22 -j ACCEPT  && echo "rule 16 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 53 -j ACCEPT && echo "Rule 17 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p udp --dport 53 -j ACCEPT && echo "Rule 18 ok"

# Opening POSTROUTING PROCESSES
# Netmasking is absolutelly necesary to protect vlan from attacks, only it hides their ip....
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE  && echo "rule 19 ok"

# Reject all other inbound - default deny unless explicitly allowed policy
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT

# test and display the rules if runs properly
iptables -L

Gracias por cualquier ayuda

marek

Respuesta1

En primer lugar, debería considerar la configuración más sencilla de utilizar redes puenteadas en VirtualBox. Básicamente, esto colocará las máquinas virtuales directamente en la LAN, por lo que obtendrán direcciones 192.168.1.0/24 y se podrá acceder a ellas directamente desde otras máquinas en la LAN.

Su regla DNAT parece correcta, pero sospecho que está bloqueada en la cadena ADELANTE. Los paquetes NAT todavía necesitan atravesar la cadena FORWARD, por lo que deben ser aceptados allí, con algo como esto:

iptables --append FORWARD --in-interface eth1 --out-interface vboxnet0 --destination 10.10.10.10 --protocol tcp --dport 80 --jump ACCEPT

Sin embargo, le sugeriría que configure la cadena FORWARD para ACEPTAR de forma predeterminada mientras hace funcionar las reglas NAT. Una vez que NAT esté funcionando, comience a restringir la cadena ADELANTE.

información relacionada