iptables para NAT transparente

iptables para NAT transparente

Estoy intentando enrutar de forma transparente el tráfico de una máquina virtual Xen a través de otra, así:

-------      192.168.250.4          192.168.250.3     ---------
| VM1 |   <-----------------bridged---------------->  | VM2   |  <-----> Internet
-------                                               | with  |
                                                      | squid |
                                                      | proxy |
                                                      ---------

No preguntes por qué, solo experimenta con iptables. Puedo enrutar con éxito el tráfico HTTP a través del proxy Squid de VM2 (modo transparente) con

iptables -t nat -A PREROUTING -p tcp --dport 80 –s ! 192.168.250.3 -j REDIRECT --to-port 3128

pero ¿cómo puedo simplemente atravesar el resto del tráfico? Ya probé esta configuración pero me da errores de "Conexión rechazada" cuando intento acceder a Internet desde VM1 ( 192.168.250.4):

vm2:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
# route outgoing udp traffic
DNAT       udp  -- !192.168.250.3        0.0.0.0/0           udp dpt:!80 to:192.168.250.3
# route outgoing tcp traffic
DNAT       tcp  -- !192.168.250.3        0.0.0.0/0           tcp dpt:!80 to:192.168.250.3
# this is the working squid rule
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 3128

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
# route incoming traffic
SNAT       all  --  0.0.0.0/0            192.168.250.3       to:192.168.250.4 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

¿Que esta mal aquí? Ya leí muchos tutoriales pero la mayoría no funciona correctamente... (Por cierto: /proc/sys/net/ipv4/ip_forwardes 1)

Respuesta1

En lugar de utilizar REDIRECT, pruebe DNAT y SNAT. Prueba esto:

iptables -t nat -I PREROUTING -d 192.168.250.3 -j DNAT --to-destino 192.168.250.4 iptables -t nat -I POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.250.3

Respuesta2

Finalmente encontré la forma correcta de hacerlo:

Las conexiones salientes NAT (VM1 --> Internet/intranet) funcionan con reescritura de fuente (SNAT):

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j SNAT --to-source 192.168.2.125

¿Dónde 192.168.2.125está la IP externa actual de VM2 (debenoser la dirección interna). Como en mi caso esa IP la asigna DHCP, se debe cambiar la regla para hacer SNAT en la IP dinámica. Esto se hace mediante el comando MASQUERADE:

iptables -t nat -A POSTROUTING -s 192.168.250.4 -j MASQUERADE

La configuración final de iptables ahora se ve así (otras tablas/cadenas están vacías):

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.250.4        0.0.0.0/0

información relacionada