NAT con iptables


iptables realiza dos funciones principalmente, filtrado de paquetes y traducción de direcciones de red (network address translation (NAT)); habitualmente los manuales de iptables tratan estas dos funciones de forma simultánea lo que resulta confuso para las personas que se introducen en el tema. En esta entrada explicaremos desde cero los rudimentos de NAT bajo GNU/Linux con iptables y dejaremos para un artículo posterior el filtrado de paquetes y la construcción de un cortafuegos.

Actualización:La construcción de un cortafuegos de filtrado de paquetes con iptables se puede encontrar en: Cortafuegos con iptables de este mismo blog.

iptables

iptables es el componente más conocido del proyecto netfilter y es una herramienta que funciona en el espacio de usuario y que permite definir reglas para el filtrado y la modificación de paquetes TCP/IP que pasen por cualquiera de las interfaces de red de un equipo.

NAT

NAT son las siglas del inglés network address translation o traducción de direcciones de red y es un mecanismo que se usa ampliamente hoy en día, fundamentalmente porque permite compartir una dirección IP pública por muchos equipos y esto es imprescindible en muchas situaciones por la escasez de direcciones IPv4.

Existen diferentes tipos de NAT, dependiendo de si se cambia la dirección IP origen o la dirección IP destino del paquete que abre la conexión, incluso existe una extensión de NAT que permite modificar el puerto origen o destino. Estos tipos de variantes de NAT reciben diferentes nombres dependiendo de la implementación, aunque más que el nombre lo importante es saber las posibilidades de NAT y aquí presentamos los nombres más utilizados cuando se implementa NAT con iptables.

Source NAT

Este tipo de NAT es en el que se cambia la dirección IP de origen, es la situación más utilizada cuando estamos utilizando una dirección IP privada (RFC 1918) en una red local y establecemos una conexión con un equipo de Internet. Un equipo de la red (normalmente la puerta de enlace) se encarga de cambiar la dirección IP privada origen por la dirección IP pública, para que el equipo de Internet pueda contestar. Los pasos que se seguirían serían algo como:

  • Un equipo de una red local con una dirección IP privada (supongamos 192.168.3.14) quiere solicitar una página web (puerto 80/tcp) del equipo de Internet http://www.wordpress.com
  • Realiza una consulta DNS y obtiene que el equipo que aloja dicha página tiene la dirección IP 76.74.254.126
  • Consulta su tabla de encaminamiento y como no está en la misma red que el servidor web de wordpress, envía el paquete con la solicitud de la página al equipo que es su destino por defecto (puerta de enlace o gateway), que supongamos tiene la dirección 192.168.3.254.
  • El gateway, que en este caso debe actuar como dispositivo de NAT, recibe el paquete y comprueba la dirección IP destino, como no es la suya, lo envía a su propio destino por defecto (gateway) que ya será una dirección IP pública.
  • Antes de que el paquete salga por la interfaz de red externa, se le cambia la dirección IP origen (192.168.3.14) por la dirección IP pública (supongamos que fuese 80.58.1.14) y se guarda la petición en lo que se denomina tablas de NAT (anotando también el puerto origen, supongamos que fuese el 5015/tcp).
  • El paquete viaja por Internet saltando de router a router hasta que llega a su destino
  • El equipo 76.74.254.126 recibe una petición desde la dirección 80.58.1.14 y la contesta, por lo que el paquete de vuelta llevará ahora dirección IP origen 76.74.254.126, dirección IP destino 80.58.1.14, puerto origen 80/tcp y puerto destino 5015/tcp.
  • La contestación del servidor web de wordpress.com llega a la interfaz externa del dispositivo de NAT, que consulta las tablas de NAT y comprueba (gracias al puerto origen) que corresponde con una petición realizada desde el equipo 192.168.3.14, por lo que modifica la dirección IP destino por ésta y se lo envía directamente.

IP masquerading

Este tipo de NAT normalmente es sinónimo de SNAT, pero iptables distingue dos casos:

  • SNAT: Cuando la dirección IP pública que sustituye a la IP origen es estática (SNAT también significa Static NAT).
  • MASQUERADE: Cuando la dirección IP pública que sustituye a la IP origen es dinámica, caso bastante habitual en conexiones a Internet domésticas.

Destination NAT o port forwarding

Este tipo de NAT se utiliza cuando tenemos algún servidor en una máquina detrás del dispositivo de NAT. En este caso será un equipo externo el que inicie la conexión, ya que solicitará un determinado servicio y el dispositivo de NAT, en este caso, debe modificar la dirección IP destino. Veamos paso a paso cuál sería la situación.

  • Un equipo cualquiera de Internet, con dirección IP pública 150.212.23.6 desea conectarse por ssh (22/tcp) al equipo estudio.mired.com
  • Realiza una consulta DNS y obtiene como respuesta que estudio.mired.com tiene la dirección IP 85.136.14.7
  • Establece la conexión (supongamos puerto origen 23014/tcp) con el equipo 85.136.14.7, que resulta ser un dispositivo de NAT que no tiene ningún servicio ssh escuchando en el puerto 22/tcp, pero que tiene una regla de DNAT para que todo lo que llegue a ese puerto se lo envíe a un equipo de su red local (supongamos que fuese el 10.0.0.2), por lo que cambia la dirección IP destino (85.136.14.7) por la 10.0.0.2 y lo registra en sus tablas de NAT.
  • Al equipo 10.0.0.2 llega un solicitud al puerto 22/tcp y la respuesta tiene las siguientes características: IP origen 10.0.0.2, puerto origen 22/tcp, IP destino 150.212.23.6 y puerto destino 23014/tcp.
  • El dispositivo de NAT cambia ahora la dirección IP origen por su dirección IP pública (85.136.14.7) y el paquete llega de vuelta a su destino.

PAT (Port Address translation)

Modifica específicamente el puerto (origen o destino) en lugar de la dirección IP. Por ejemplo si queremos reenviar todas las peticiones web que lleguen al puerto 80/tcp al mismo equipo pero al puerto 8080/tcp

Instalación de iptables

Instalamos el paquete iptables:

aptitude install iptables

Tablas y cadenas

Hay tres tablas definidas en iptables que son filter, nat y mangle, que se encargan de diferentes tipos de procesos, aquí sólo trataremos de la tabla nat, por lo que cada vez que escribamos una instrucción comenzaremos con iptables -t nat.

La tabla nat está formada por tres cadenas:

  • PREROUTING: Permite modificar paquetes entrantes antes de que se tome una decisión de enrutamiento.
  • OUTPUT: Permite modificar paquetes generados por el propio equipo después de enrutarlos
  • POSTROUTING: Permite modificar paquetes justo antes de que salgan del equipo.

Para cadena se especifican reglas, para las que es fundamental el orden, ya que cuando un paquete encuentra una regla que lo define, aplica esa regla y no lee las siguientes.

Parámetros generales

Listar reglas

Utilizamos el parámetro -L (normalmente se acompaña de -n para que los resultados se muestren de forma numérica y evitar consultas DNS)

# iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Que nos muestra las tres cadenas de la tabla nat y que en este momento no hay ninguna regla aplicada.

Verbose

Para una salida más completa de iptables utilizamos el parámetro -v:

# iptables -t nat -L PREROUTING -n -v

Chain PREROUTING (policy ACCEPT 21 packets, 4133 bytes)
pkts bytes target prot opt in out source destination

que nos informa de los paquetes y bytes que «atraviesan» una cadena y en caso de que hubiese reglas, se contarían los paquetes y bytes a los que se ha aplicado cada una.

Borrar contadores

Si queremos poner a cero los contadores de paquete que se aplican en las cadenas de una tabla:

iptables -t nat -Z

Borrar todas las reglas de una cadena

Para borrar todas las reglas de una cadena se escribe:

iptables -t nat -F OUTPUT

Se puede no especificar ninguna cadena, con lo que se borran todas las reglas de todas las cadenas de una tabla:

iptables -t nat -F

Antes de empezar a utilizar iptables, una norma elemental es escribir:

iptables -t nat -F
iptables -t nat -Z

Que borra todas las reglas anteriores y pone los contadores a cero.

Ejemplo

Supongamos que tenemos una situación como la de la imagen:

Esquema de NAT
Esquema de NAT

Vamos a ver los pasos que habría que dar para que todos los equipos de la red local tuviesen acceso a Internet y se pudiesen alojar servicios en cualquiera de ellos.

Activación del bit de forward

En principio un equipo con GNU/Linux no permite que pasen paquetes de una interfaz de red a otra, para que se permita esto y por tanto pueda funcionar el equipo como router, o más concretamente en este caso como dispositivo de NAT, hay que activar (dar valor 1) lo que se denomina bit de forward:

echo 1 > /proc/sys/net/ipv4/ip_forward

Esta activación se borra cuando se apaga el equipo, ya que el directorio /proc está en memoria. Para que dicha activación permanezca lo habitual es definirla en el fichero /etc/sysctl.conf, asegurándonos de que exista una línea como:

net.ipv4.ip_forward=1

POSTROUTING

Todos los equipos de la red 192.168.3.0/24 están interconectados entre sí, pero en principio no tienen acceso a Internet puesto que sus direcciones IP son privadas y por tanto no son accesibles desde Internet (ningún equipo contestaría a sus peticiones). El equipo que tiene dos interfeces de red sí tiene acceso a Internet ya que la interfaz de red eth0 tiene una dirección IP pública, además pertenece a la red 192.168.3.0/24 ya que está conectado a través de la interfaz de red eth1 con dirección IP 192.168.3.254.

El equipo con dos interfaces de red puede funcionar como dispositivo de NAT (source NAT), aceptando paquetes provenientes del resto de equipos de la red 192.168.3.0/24 que entren por eth1 con destino a cualquier equipo de Internet. Tal como se describe en el ejemplo inicial de SNAT, el dispositivo de NAT debe cambiar la dirección IP origen, pero esto se hace justo antes de enviar el paquete a Internet y por tanto habrá que definirlo en la cadena POSTROUTING.

Source NAT (estático) con iptables

La regla que hay que poner para que se haga SNAT de todos los equipos de la red 192.168.3.0/24 es tan simple como:

iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT --to 80.58.1.14

Explicación de los parámetros:

  • -A POSTROUTING: Añade (Add) una regla a la cadena POSTROUTING
  • -s 192.168.3.0/24: Se aplica a los paquetes que tengan como dirección origen (source) la 192.168.3.0/24
  • -o eth0: Se aplica a los paquetes que salgan (out-interface) por eth0
  • -j SNAT --to 80.58.1.14 (--to aquí es equivalente a --to-source): Cambia la dirección de origen por la 80.58.1.14

Source NAT (dinámico) con iptables

Podríamos tener un caso similar al anterior, pero en el que la dirección IP pública del equipo que se conecta a Internet fuese dinámica, por lo que no la sabríamos a priori y no sería posible definirla en una regla como la anterior. En ese caso la regla de iptables a utilizar sería:

iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE

Donde el único cambio se refiere a la acción (parámetro -j), en este caso es MASQUERADE, que cambia la dirección origen por la que tenga la interfaz de salida (eth0).

MASQUERADE podría funcionar también si la dirección IP de eth0 fuese estática, pero en ese caso se recomienda utilizar SNAT.

PREROUTING

(Todo lo que se explica en este punto no se hace con la seguridad en mente, sino simplemente para explicar algunas cosas que se pueden hacer con PREROUTING. En una implementación real, esto tendría que ir combinado con un cortafuegos y un esquema de red diferente).

Para realizar una conexión cliente-servidor entre dos equipos de Internet hay que especificar completamente lo que se denomina socket de Internet, que queda definido con lo siguiente:

  • Protocolo (normalmente TCP o UDP)
  • Dirección IP equipo cliente
  • Puerto equipo cliente
  • Dirección IP equipo servidor
  • Puerto equipo servidor

Si volvemos a nuestro problema, el único equipo de la red local que es accesible desde Internet es el dispositivo de NAT a través de su dirección IP pública 80.58.1.14, ya que sería el único con el que un equipo de Internet podría establecer un socket y por tanto sería el único equipo de la red que podría alojar servicios. Todo esto cambia si utilizamos NAT, ya que en el equipo que tiene las dos interfaces de red podemos cambiar la dirección IP destino (DNAT) de una petición que llegue de Internet y mandarla a un equipo de la red local.

Supongamos que instalamos un servidor web en un equipo de la red local con dirección IP 192.168.3.2 y queremos que sea accesible desde Internet, tendremos que modificar las peticiones que lleguen al puerto 80/tcp des equipo que tiene la dirección IP pública y que cambie la dirección IP destino 80.58.1.14 por 192.168.3.2, esto se hace con la siguiente regla:

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.3.2

Explicación de los parámetros:

  • -A PREROUTING: Añade (Add) una regla a la cadena PREROUTING
  • -p tcp: Especifica el (p)rotocolo de transporte (tcp en este caso)
  • --dport 80 (equivalente a --destination-port 80): Puerto destino 80 (ligada al parámentro anterior)
  • -i eth0: Especifica eth0 como interfaz de entrada (in-interface)
  • -j DNAT --to 192.168.3.2 (--to aquí es equivalente a --to-destination): Cambia la dirección IP destino (inicialmente 80.58.1.14) a 192.168.3.2

Es lógico que haya que hacerlo en la cadena PREROUTING, porque las reglas de esta cadena se aplican antes de tomar la decisión de enrutamiento, así se tomará la decisión de encaminamiento con la nueva dirección IP destino.

Para otros servicios bastaría con poner el protocolo y puerto adecuados, aunque el caso del servicio ftp es más complicado y necesitaría una discusión mas detallada. La principal limitación de utilizar DNAT con una sola dirección pública es que no es posible poner más de un servicio en el mismo puerto, ya que sólo se puede hacer DNAT a un equipo de la red local (el socket debe estar totalmente determinado).

Hay algunos servicios que permiten utilizar puertos diferentes a los estándar, como por ejemplo http, ya que podemos acceder a un servidor web que esté en un puerto diferente al 80/tcp, simplemente especificándolo en el navegador. Como iptables nos permite no sólo modificar la dirección IP destino sino también el puerto destino, podríamos poner un segundo servidor web en el equipo 192.168.3.3 y añadir la siguiente regla:

iptables -t nat -A PREROUTING -p tcp --dport 880 -i eth0 -j DNAT --to 192.168.3.3:80

Donde hemos especificado el puerto destino 880 (que no es un puerto estándar para ningún servicio) y cambiamos tanto la IP destino como el puerto destino con --to 192.168.3.3:80.

Para acceder a ese servicio desde Internet tendremos que escribir en el navegador:

http://80.58.1.14:880

Guardar todas las entradas: iptables-save e iptables-restore

NAT con nftables

[Actualización 20/01/2020] iptables es una herramienta que está siendo sustituida por nftables (aunque esta sustitución se prevé que sea muy larga y habrá un periodo prolongado de coexistencia de ambas) por lo que recomiendo la lectura de Reglas de NAT con nftables de mi compañero José Domingo Muñoz.

NAT con iptables

97 comentarios en “NAT con iptables

  1. Jaire_lee dijo:

    Me ha gustado el articulo, esta bien explicado.
    Me gustaria que hubiera una segunda parte con conceptos mas avanzados, pero esto esta muy bien.

    Gracias.

    Me gusta

  2. Henry Lopez dijo:

    Doctor.

    Esta guia es extraordinaria y me gustaria que continues con una segunda parte y conforme vas haciendolo vas profundisando en el iptables y dime como haria el DNAT si tuviera varios dispositivos similares dentro de mi red, como por ejemplo 2 servidores web con ip privadas diferentes (web,correo,dominio,ftp,etc) y cada uno de los servidores con direcciones publicas diferentes como indicarle al (FW-NAT), que dependiendo de la direccion de origen enviarlo a servidor de destino correcto???

    Espero me respondas y me envies una guia completa asi de entendible como la que has hecho … por favor enviamelo a mi correo… gracias

    Vc d+ …. a gente se vio galera

    Me gusta

    1. Si tuviéramos dos direcciones IP públicas (80.0.0.1 y 80.0.0.2) y quisiéramos redirigirlas a dos servidores web diferentes (192.168.3.1 y 192.168.3.2), tendríamos que utilizar entradas del tipo:

      iptables –t nat -A PREROUTING -p tcp –dport 80 -i eth0 -d 80.0.0.1 -j DNAT –to 192.168.3.1

      iptables –t nat -A PREROUTING -p tcp –dport 80 -i eth0 -d 80.0.0.2 -j DNAT –to 192.168.3.2

      Me gusta

      1. http://www.versal.cu/

        hola:
        yo utilizaria una redireccion con apache (virtual host) seri mas seguro y con solo una direccion ip publica pueder tener hosteado varios servidores web. y declarando los en el dns los nombres.

        el codigo es este:

        ServerName http://www.versal.cu

        ServerSignature On

        ErrorLog /var/log/apache2/www.versal.cu-error.log

        LogLevel warn

        CustomLog /var/log/apache2/www.versal.cu-access.log combined

        Allow from All

        ProxyPass / http://192.168.20.7/
        ProxyPassReverse / http://http://192.168.20.7/

        Me gusta

  3. Omar dijo:

    Muy bueno!!! excelente… estoy llevando un curso de seguridad de redes y me dejaron esto…. me dijeron que eran como 7 lineas para hacer el nat… y tu lo haces casi casi con una sola linea… eres grande, explicas muy bien !!! te felicito

    Me gusta

  4. Henry Lopez dijo:

    Brother
    – Como seria la configuracion basica si las politicas por defecto bloqueando todo el trafico de la red (INPUT, OUTPUT y FORWARD)y cual seria el orden. Yo he llevado algunos cursos pero siempre lo hacen algo complicado. Por favor algo basico y sencillo del cual yo podria derivar lo demas.
    – Como tendria que hacer para que guarde la configuracion de iptables y cuando reinicie el equipo levante mi configuracion de iptables porque le doy #iptables-save pero cuando reinicio la compu se borra todo.
    – Hay alguna forma de controlar el trafico de mi red, controlar el ancho de banda de las diversas areas, se que con delay pool de squid se hace pero no lo entiendo muy bien, talvez tu lo puedas hacer sencillo como iptables. Ademas cuando yo le asigno un ancho de banda predeterminado las descargas de internet van ok pero basta que alguien se conecte y comience a descargar video o musica con ARES y EMULE no controla el ancho de banda. ahi excede el ancho de banda asignado y consume todo el ancho de banda.

    Me gusta

    1. usuario dijo:

      Puedes meterlas en un script y guardarlas en los rc :), si te ves muy apurado y no sabes que buscar busca sobre
      iptables save (para Debian al menos..)
      sino prueba con /etc/rc.local

      Suerte

      Me gusta

  5. henk dijo:

    hola Alberto,

    no es posible hacer esto?

    iptables -t nat -A POSTROUTING -s 192.168.122.253/32 -o eth0 -j SNAT –to 6X.X.X.22

    mi eth0 tiene una 6X.X.X.21 255.255.252.0

    pero a ese eth0 llega trafico para de determinados IPs para el rango 6X.X.X.21 255.255.252.0

    seria posible natear trafico de estas IPs publicas a single guests?

    Con equipos SonicWall y Cisco es posible, pero con un server Centos, IPtables y guests KVM empiezo a dudar ya

    Me gusta

    1. #henk

      ¿Tienes varias IP públicas? ¿no sería menjor utilizar las IP públicas en las MV y sólo enrutar?

      En cualquier caso, la regla que pones es correcta para Source NAT, si lo que quieres es que un determinado servicio de una MV sea accesible desde fuera, entonces son reglas de Destination NAT.

      Me gusta

  6. Henry dijo:

    Una consulta mira yo tengo una red grande y kiero colocar un proxy squid para filtrar el acceso web mi red es 192.168.1.0 mis maquinas tiene como puerta de acceso 192.168.1.1 y mi squid 192.168.1.100, mediante switch administrable estoy redireccionando todo el trafico hacia el squid 192.168.1.100, pero yo kiero q el mi equipo con squid con iptables foward o redireccione todo el trafico hacia el 192.168.1.1 q es mi gateway con excepcion del 80 que tiene q pasar por el squid para ser filtrado (iptables -t nat PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 3128), como haria eso … y por casualidad igual me filtraria las web https (443) ???

    Me gusta

    1. #Henry,

      La forma que se utiliza habitualmente es colocar el equipo con squid e iptables como puerta de enlace de la red local, poniendo un equipo con dos tarjetas de red.

      Con respecto al puerto 443 no funciona como proxy transparente, aunque sí como proxy normal si se configura en los clientes.

      Me gusta

      1. ajcalero dijo:

        Squid no filtra el 443 en modo transparente. Lo que puedes hacer es aceptar las dos conexiones en el squid (3128 y 8080)

        # Default Squid Listens to Port 3128
        http_port 3128
        http_port 8080 transparent

        Y en el iptables dejarlas pasar
        $iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 80 -j REDIRECT –to-port 8080
        $iptables -A INPUT -i eth1 -p tcp –dport 8080 -m state –state NEW -j ACCEPT
        $iptables -A INPUT -i eth1 -p tcp –dport 3128 -j ACCEPT

        donde eth1 es la tarjeta de red de tu proxy que controla la red local (la eth0 es la que viene de internet)

        Y filtrar el 443 en el iptables

        fuente:
        http://www.maravento.com/2013/03/firewall.html

        PD: Excelente articulo. felicitaciones a alberto molina

        Me gusta

  7. Andres dijo:

    Profesor Alberto, buenas noches,

    El presente correo es para solicitar una ayuda… resulta que realice los proecedimientos descritos, pero no logor que mis equipos puedan navegar. Además tengo unas dudas, la interface (eth2) local (LAN) en el firewall con que puerta de enlace debe enrutar… y en ese orden de ideas los equipos de la red a que gateway deben enrutar???.
    El firewall esta Navegando, pero los equipos de la red no navegan.

    Agradezco enormemente su ayuda, la configuración es el siguiente:

    # Generated by iptables-save v1.3.5 on Thu May 27 18:26:17 2010
    *filter
    :INPUT ACCEPT [237:19116]
    :FORWARD ACCEPT [6:304]
    :OUTPUT ACCEPT [124:13496]
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
    COMMIT
    # Completed on Thu May 27 18:26:17 2010
    # Generated by iptables-save v1.3.5 on Thu May 27 18:26:17 2010
    *nat
    :PREROUTING ACCEPT [50:4666]
    :POSTROUTING ACCEPT [3:276]
    :OUTPUT ACCEPT [1:172]
    -A PREROUTING -i eth1 -p tcp -m tcp –dport 80 -j DNAT –to-destination 192.168.1.99
    -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j SNAT –to-source 190.145.36.220
    COMMIT
    # Completed on Thu May 27 18:26:17 2010

    Muchas gracias

    Me gusta

  8. Alex dijo:

    Una consulta tengo una lan en 2 segmentos LAN1 10.0.100.1 y LAN2 172.17.1.15, y a su vez tengo 2 interfaces wan una con Speedy y otra con Telmex kiero q la LAN1 salga por SPEEDY y la LAN2 salga por TELMEX como hago eso, ademas ambas redes LAN se ven entre si por mi switch administrable pero no kiero que los requerimiento web internos se almacenen en el proxy ya que ttengo un sistema web interno de la empresa y cuando generan reportes muestra los que estan en cache los reportes son web osea usan el puerto 80.

    Me gusta

  9. Xavier Grabulosa dijo:

    Tengo un problema, trabajo con CentOS 5, en un VPS. Tengo el iptables instalado, pero no me deja crear o trabajar con la tabla nat.

    el error es el siguiente:

    Applying iptables firewall rules: iptables-restore v1.3.5: iptables-restore: unable to initializetable ‘nat’

    Error occurred at line: 93
    Try `iptables-restore -h’ or ‘iptables-restore –help’ for more information.
    [FAILED]
    en la linia 93 se encuentra:
    *nat
    :PREROUTING ACCEPT [10:8081]
    :POSTROUING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    COMMIT

    Estoy buscando solucion pero no hay forma…
    Hace 1 mes funcionava todo perfectamente.

    Grácias de antemano.

    Me gusta

    1. Hola Xavier,

      Con la información que das poco te puedo ayudar, tendrás que buscar un error en las líneas de iptables que estás aplicando o si quieres empezar de nuevo prueba a limpiar la tabla nat con:

      iptables -t nat -F

      Me gusta

  10. Felipe Vega Vargas dijo:

    Hola, un poco tarde pero muy bueno el articulo. Quisiera me indicares que puedo hacer en el siguiente caso.
    Quisiera tener la posibilidad de cambiar la configuracion del IPtables durante un horario determinado, por ejemplo en horario de trabajo no hay P2P y a partir de las 6 de la tarde si como puedo lograrlo? Lo unico que se me ocurre es el crond pero no se como hacerlo.

    Saludos y gracias.

    Me gusta

    1. Hola Felipe,

      Sí es como tú dices, deberías utilizar un script de iptables para cada horario y utilizar cron (échale un vistazo a los scripts que ya tengas en /etc/cron.d y adáptalo a tus necesidades)

      Me gusta

  11. MAURICIO dijo:

    Gracias Por lo expuesto… preguntaba cual seria la regla para un servidor proxy que tiene solo una tarjeta de red, gracias por la orientacion

    Me gusta

  12. Henry dijo:

    Hola mi pregunta es la siguiente, tengo 2 redes en un hotel RED1 = Red Huéspedes (172.16.1.0 /20) y la RED2 = Red Corporativa (10.0.0.0/24).
    Y lo que yo quiero que de acuerdo a la ip de origen que se rute el trafico por ejemplo si el origen del paquete es de la RED2 que salga por una linea de Internet de TELMEX y si es de una RED1 que salga por una de telefónica.

    LAN1 (192.168.100.x) ===== > RED1 (172.16.1.0 /20) ==== salida =====>>>> Telefonica
    LAN2 (192.168.200.x) ===== > RED2 (10.0.0.0/24) ==== salida =====>>>> TELMEX

    Obviamente mi pc tiene 4 interfaces de red 2 para la WAN y 2 para la LAN, los segmentos de las LAN serian DHCP y se entregarían IP de diferentes rango LAN1=192.168.100.x LAN2=192.168.200.x

    Esto se puede hacer con iptables ???

    *Nota:
    Ademas quisiera saber si se puede configurar los mismos segmentes de ip en ambos lados tanto en WAN como en LAN de tal forma que daría forma de trabajar simplemente con tablas de rutas y si es que se puede hacer DHCP-RELAY para que repita la asignación de ip tanto de la RED1 como en la RED2.

    Me gusta

  13. Jorge Arias dijo:

    Hola,

    En este ejemplo que esta mas arribe del POSTROUTING, se podria hacer un LOG del trafico
    iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT –to 80.58.1.14

    Gracias
    Jorge

    Me gusta

      1. Jonatan Márquez dijo:

        algo asi, lo que en realidad quiero es permitir mi salida por IPv6 atravez de mi dhcpv6, podrias ayudarme?

        Me gusta

  14. arturo dijo:

    Hola…

    Una pregunta, tengo las siguientes resglas:
    1) iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o p10p1 -j MASQUERADE
    2) iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to 192.168.1.1:3128
    3) iptables -t nat -A PREROUTING -i p10p1 -p tcp –dport 80 -j REDIRECT –to-port 3128

    donde p10p1 es mi tarjeta de red inalambrica (ip publica), y es dinamica.

    la pregunta es:
    * en la regla

    2) iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to 192.168.1.1:3128

    que ip pondria en lugar de (192.168.1.1:3128), ya que esta es dinamica.

    agradeceria cualquier respuesta…..

    saludos………..

    Me gusta

    1. Si la IP de eth0 es dinámica, deberías utilizar algún script que actualizase la regla de iptables cada vez que la dirección IP cambia y ejecutase dos reglas de iptables, una para borrar la regla de DNAT con la dirección antigua y otra para agregar la regla con la dirección nueva.

      Esto se puede hacer de muchas maneras, por ejemplo mediante una tarea del cron que compruebe el valor de la dirección IP de eth0 cada cierto tiempo:

      ip addr show eth0|grep ‘inet ‘|awk ‘{print $2}’

      Me gusta

  15. ED dijo:

    Amigo tengo una consulta…

    estaba viendo este vídeo y la verdad lo implemente y me funciono pero realmente hice varios pasos que no logre comprender

    por lo menos en el vídeo se ocupan varios comandos que no se si en realidad son necesarios por ejemplo : modprobe ipt_MASQUERADE y otros seguidos se este.

    y me podrías explicar breve mente el procedimiento de vídeo porque si la verdad no logre comprender al 100%

    de ante mano muchas grasias y seria de mucha ayuda

    Me gusta

  16. luis dijo:

    yo tengo dos enlaces de internet y quiero que los dos me den servicio de internet en mi lan, pero en mi multwan me aparece uno de los enlaces como Offlin Not In Use, agradecería su ayuda

    Me gusta

  17. Alex dijo:

    Muchísimas gracias, llevo un tiempo intentando comprender el funcionamiento de nat y no lo conseguía. Es el sitio de internet donde mejor explicado biene sin duda. Gracias de nuevo.

    Me gusta

  18. iccc dijo:

    Hola,

    en mi caso estoy tratando de hacer NAT desde la LAN interna hacia internet (source NAT).

    Pero no me queda nada claro como hacerlo dado que la interfaz «outside» del firewall no tiene un IP pública asignada directamente a ella, sino que tiene una IP interna del tipo 192.168.0.x (diferente del rango de IP de la LAN interna) ya que hay una red de este tipo entre el FW y el router.
    ¿Entonces la regla sería así?

    iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j SNAT –to 192.168.0.0/24

    Gracias x la ayuda.

    Me gusta

    1. Si la interfaz externa es una IP privada, es probable que sea asignada de forma dinámica (por el servidor DHCP del router en este caso), por lo que la solución más sencilla sería utilizar MASQUERADE en lugar de SNAT, es decir:

      iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE

      Me gusta

  19. iccc dijo:

    No, no es así: mi FW tiene 3 interfaces externas hacia internet, pero solo una de ellas tiene una IP publica. Los otras 2 interfaces tienen ip’s internas puestas a mano, porque los routers, en la interfaz del lado del FW, tienen otra ip del mismo rango.

    Es decir, mi LAN interna tiene un rango 172.16.5.x, y el FW tiene 3 interfaces externas:

    eth1: 192.168.33.1
    eth2: 192.168.1.1
    eth3: 82.56.88.76

    Y, en las interfaces internas de los routers conectados a eth1 y eth2 hay configuradas ip’s fijas del mismo rango

    eth1-router: 192.168.33.3
    eth2-router: 192.168.1.99

    Entonces, mi 1er problema es que no sé si tengo que usar la regla que te comentaba, o la que tú propones.
    Mi 2do problema es que como planeo cambiar de una interfaz de salida a otra si alguna se cae (cambiando la ruta por defecto del FW), no sé si tengo que poner de alguna manera en el FW 3 reglas para NAT diferentes, o si esto causará problemas y solo tengo que poner 1 regla de NAT, y cambiarla al mismo tiempo que cambio la ruta por defecto del FW.

    Gracias!

    Me gusta

  20. iccc dijo:

    Muchas gracias por el link. Es interesante pero no es exactamente mi escenario, pese a lo que pudiera parecer.
    Y no lo es por 2 motivos:

    1. la eth3 es una línea a internet pero que solo se usa para llegar a una IP de un proveedor externo usando una VPN con ipsec. Por lo tanto a nivel de rutas del FW esto se soluciona…
    2. la eth1 y eth2 no están activas al mismo tiempo, porque una de ellas es una línea de backup que solo uso si se cae la principal (y en ese caso lo único que hago ese cambiar la ruta por defecto del FW).

    ¿Crees entonces que la propuesta mía para regla de NAT, o la tuya, irían bien? Mas allá de esto mi principal duda es si puedo tener más de una regla de NAT configurada al mismo tiempo… yo creo que si, dado que serían para interfaces de salida diferentes…

    Gracias!

    Me gusta

    1. En ese caso podrías poner dos reglas de iptables a la vez:

      iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth1 -j SNAT –to 192.168.33.1
      iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth2 -j SNAT –to 192.168.1.1

      Pero en el firewall necesitarás cambiar la puerta de enlace para que se redirija a una interfaz u a otra el tráfico en cada caso, es decir que la regla de encaminamiento por defecto debe obligar a todo el tráfico a ir por la interfaz activa.

      Me gusta

  21. iccc dijo:

    Vale, muchas gracias.
    Lo de cambiar la regla de enrutado por defecto lo tengo claro y probado. Lo que no me quedaba claro era si podían coexistir varias reglas de NAT al mismo tiempo.

    Un saludo.

    Me gusta

    1. En este caso concreto sí pueden coexistir porque no son iguales las reglas (cambia la interfaz de salida). No podrían coexistir dos reglas de iptables con el mismo criterio de aplicación, por ejemplo (como el tuyo, pero las dos interfaces de salida son la misma):

      iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth1 -j SNAT –to 192.168.33.1
      iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth1 -j SNAT –to 192.168.1.1

      En este caso siempre se aplicaría la primera.

      Me gusta

  22. Elias14 dijo:

    Hola profesor, me ha parecido un excelente aporte a la comunidad que poco a poco manejamos estas herramientas maravillosas. Quisiera me pudiera auxiliar con un caso. Tengo un servidor Linux redhat 9 con el servicio dhcp confiurado (asigna ips de la red 192.168.1.10 a 192.168.1.200) en el lado de eth0 tengo una ip privada con salida a internet 192.168.19.128 y eth1 192.168.1.254. Quiero conectar a algunos nodos en la red 192.168.1.X y gracias al servidor dhcp me asiga perfectamente las direcciones, el problema que tengo es que no pueden navegar. He puesto la regla: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE, pero sigo con el mismo problema. Agradecería me pudieras sacar un poco de esas dudas. Lo único que he notado, es que los clientes con la ip de la red 1, pueden ver a través de un ping a los nodos de la red 19, pero no navegan. gracias

    Me gusta

  23. Elias14 dijo:

    El bit de fordward ya fue activado (echo 1 > /proc/sys/net/ipv4/ip_forward), en caso de que sea correcta la instrucción, los nodos deben de navegar de manera automática o debo de habilitar algo más (tipo proxy)?? Gracias

    Me gusta

    1. Luis, puedes poner las reglas de iptables en cualquier fichero que se ejecute durante el arranque, aunque si estás utilizando un sistema GNU/Linux más nuevo que utilice systemd no te puedo orientar porque apenas tengo experiencia con él (todavía estoy en Debian Wheezy)

      Me gusta

  24. elias1412 dijo:

    Por fin pude, aquí les dejo el script por si alguien lo necesita. Primero iptables -F, despues echo 1 >/proc/sys/net/ipv4/ip_forward, despues iptables -A FORWARD -j ACCEPT y por último iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE. Gracias a todos

    Le gusta a 1 persona

    1. Hola elias1412,

      Me alegro que lo hayas resuelto y te agradezco que lo comentes aquí. Sólo un apunte: Si es necesaria la instrucción «iptables -A FORWARD -j ACCEPT» es porque el cortafuegos está con política por defecto DROP, que no es el valor por defecto, sino que has debido cambiarlo previamente con «iptables -P FORWARD DROP», ten en cuenta que la política por defecto no se cambia con la instrucción «iptables -F», ya que ésta sólo borra las reglas previamente establecidas de la tabla filter.

      Me gusta

  25. elias1412 dijo:

    Ok, muchas gracias a todos. Pasando a otro tema y abusando del conocimiento y experiencia de ustedes, alguien me podría recomendar algún modelo de Access Point para gran cantidad de usuarios? Anteriormente tenía Linksys wap54g, cambie a Ubiquiti UAP-LR salen mucho mejor, pero ahora me comentan que se llegan a saturar (supuestamente soporta 100 usuarios simultáneos) me urge resolver ese detalle. De antemano agradezco la atención y al administrador de este foro. Pasen excelente día.

    Me gusta

  26. toty dijo:

    Hola Profesor, te hago una consulta: ¿se podria hacer varias reglas de postrouting iguales desde vlans distintas sobre la misma interfaz de salida?Por ejemplo:
    iptables -t nat -A POSTROUTING -s 10.1.4.0/24 -o eth1 -j Masquerade
    iptables -t nat -A POSTROUTING -s 10.1.8.0/24 -o eth1 -j Masquerade

    ¿habria que hacer algo sobre la tabla de ruteo, o basta con esto?
    gracias

    Me gusta

  27. Jordi dijo:

    Thanks God I’ve found this small article, ha sido de muchísima ayuda para entender de una forma senzilla el funcionamiento de las iptables NAT.

    Un saludo

    Me gusta

  28. Ignacio dijo:

    Buenas; tengo 3 equipos con la misma ip privada y no se pueden cambiar, como podria hacer para hacer nat y cambiar las direcciones para poder accederlas desde una sola computadora;
    el tema es que los equipos tienen ip fija para administrarlos y necesito acceso a los 3 al mismo tiempo… la otra que pense seria comprar un par de interfaces de red usb y hacer un enlace local a una maquina virtual… en este momento tengo un routerboard 750 que posee 5 interfaces, y mi idea es la de conectar un equipo por puerto y hacer la traduccion de la direccion de destino y de origen…

    las ip de los equipos de nokia son 192.168.255.129/24
    entonces;
    192.168.255.129/24 en eth0 se mantenga igual
    192.168.255.129/24 en eth1 se cambie a 192.168.255.128/24
    192.168.255.129/24 en eth2 se cambie a 192.168.255.127/24

    el equipo que genera la conexion es mi notebook, pasaria por el router por eth4 se hace la traduccion de la direccion y sale por una de las interfaces para asi llegar al equipo….
    estor mareado, no se si seria conveniente que el equipo a administrar vea la mac de uno de los puertos del router o que vea la mac de la notebook.

    bueno saludos a todos

    Me gusta

  29. MATIAS dijo:

    Hola, necesito pasar el trafico que entra a la pc en el puerto UDP 3030 a otra ip en otro puerto. El servidor solo tiene una Interfaz ETH0 y todas las pc son de la misma red. Como deberia hacer?
    Uso UBUNTU 14
    Gracias

    Me gusta

  30. Pablo dijo:

    Hola. Te consulto por lo siguiente.
    tengo un servidor de red clearos y el siguiente requerimiento.

    Tengo una vpn Ipsec uniendo dos sucursales.
    Ip lugar a: 192.168.10.0
    Ip lugar b: 192.168.1.0
    Ip lugar c: 167.252.32.0

    A su vez en el lugar a existe otra red (red c) vincula fisicamente a la red del lugar a.

    Mi problema es que la red del lugar c, solo tiene rutas estaticas hacia dos direcciones, solamente 192.168.10.45, y .100
    No puedo administrar esta red ya que esta dividido el lugar.
    Yo necesito redireccionar el trafico que viene del lugar c al lugar a. Por ejemplo, al hacer ping en cualquier terminal del lugar c hacia 192.168.10.45 los redireccione hacia 192.168.1.45

    Espero haber sido claro.

    Me gusta

      1. Pablo dijo:

        Hola, si me imagine que hice un lio barbaro para explicar.

        Necesitaria redireccionar el trafico local que apunta por ejemplo a la ip 192.168.10.45 a la red 192.168.1.10

        Me gusta

      2. Pablo, si no lo entiendo mal lo podrías solucionar con SNAT, algo como:

        iptables -t nat -A POSTROUTING -o «eth?» -j SNAT –to 192.168.1.10

        donde «eth?» es la interfaz conectada a la red 192.168.1.0/24

        Me gusta

  31. Eduardo Gutierrez dijo:

    Primero felicitarte por el tutorial. Claro y con ejemplo. Podrias hacer un segundo tutorial, similar pero con una red local con zona demilitarizada y si puede ser con dos firewall. Una pregunta en postrouting, dices que la peticion viene por puerto 80/tcp que es el puerto para http, pero no faltaria puerto de destino, entiendo que seria el mismo, pero para deteerminar el socket de internet necesitas toda la informacion y supongo que en iptables se deberia reflejar el puerto de destino no ? No se si podrias aclarar mejor este punto.
    Gracias

    Me gusta

    1. Hola Eduardo, si no se especifica un puerto diferente, entonces iptables asume que es el mismo puerto 80/tcp. Puedes ponerlo de forma explícita si lo ves más claro, pero en cualquiera de los dos casos el resultado es el mismo. Saludos

      Me gusta

      1. Eduardo Gutiérrez dijo:

        Gracias, piensa lo de hacer un tutorial similar o añadir como ejemplo la tipico red, con zona dmz, zona local y internet… ;)

        Me gusta

  32. Hola compañeros. Muy buen manual de iptables para NAT. Sencillez y claridad. Tengo una consulta. Realizo el prerouting de una red de entrada ovs_eth0 hacia otra red donde está el dispositivo que realiza el NAT. Esta segunda red es una VPN.
    Si realizo el NAT hacia la propia IP de la red VPN del dispositivo todo funciona correcto:
    sudo iptables -t nat -I PREROUTING -i ovs_eth0 -p tcp –dport 7335 -j DNAT –to 10.243.0.1:1880
    Pero si lo intento a otra IP de la red VPN no consigo hacer que funcione:
    sudo iptables -t nat -I PREROUTING -i ovs_eth0 -p tcp –dport 7335 -j DNAT –to 10.243.0.2:1880
    (habiendo borrado la regla anterior)
    Ha que hacer algún tratamiento especial a estas redes VPN? Es una red ZeroTier.
    Entiendo que si el tráfico me llega a la 10.243.0.1, me debería llegar a la .2 igual?
    Muchas gracias!!
    Samuel

    Me gusta

  33. Mario dijo:

    Infinitas gracias, tu post termino con mi investigación de semanas.

    Por si alguno lo necesita estos comandos sirven para activar Cloudflare Wireguard apuntando a una subred especifica en Openwrt. Parecido a VPNPR/PBR.

    ip route add 0.0.0.0/1 dev wg0
    ip route add 128.0.0.0/1 dev wg0
    ip route add 172.16.0.2/32 via 192.168.3.1 dev br-lan3
    iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o wg0 -j SNAT –to 172.16.0.2

    ip -6 route add ::/0 dev wg0
    ip -6 route add 2606:4700:[ip del tunel] via f0:0:0:10:: dev br-lan3
    ip6tables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

    Saludos

    Le gusta a 1 persona

Deja un comentario