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:
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.
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 gustaMe gusta
Gracias #Jaire_lee, espero ir escribiendo más cosas sobre iptables, de momento tengo pendiente una entrada sobre la table filter
Me gustaMe gusta
GRACIAS ALBERTO, este articulo ha servido para sacar adelante mi proyecto de grado superior.
un millar de gracias
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Gracias, por la ayuda … espero que no te moleste si continuo haciendote consultas esto es algo nuevo y muy importante…
Me gustaMe gusta
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 gustaMe gusta
Hola ojala me pudieras mandar mas tutoriales que hayas hecho a mi correo, son buenisimos te lo agredecere mucho.
Me gustaMe gusta
Bueno para eso está RSS :-)
Me gustaMe gusta
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 gustaMe gusta
muy bueno el articulo, me resolvio muchas dudas que tenia con nat. GRACIAS
Me gustaMe gusta
Como hago para que e cuando reinicie el servidor las reglas iptables no se me borren
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
#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 gustaMe gusta
GRACIAS… Excelente explicacion del nat con iptables nunca habia visto algo mejor explicado de verdad felicidades y ojala pudieras publicar mas sobre iptables
Me gustaMe gusta
Te felicito.
Buena documentación y directa. Las explicaciones muy correctas. Se aprecia mucho tu aportación. :)
Saludos
Me gustaMe gusta
Buenísimo, me aclaró muchas dudas, muchísimas gracias!!
Me gustaMe gusta
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 gustaMe gusta
#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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
#Andres,
¿Tienes el bit de forward activado?
¿La dirección externa de eth1 es estática y es siempre la 190.145.36.220?
Me gustaMe gusta
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 gustaMe gusta
Muchas gracias, muy buena la explicación. Excelente artículo.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Bueno el error de Xavier es que le falta una T aqui donde dice POSTROUING
Saludos.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Excelente explicacion! me sirvio mucho… Graciasss!!
Me gustaMe gusta
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 gustaMe gusta
hola
en que archivo se añade o modifica todo esto muchas gracias de antemano
Me gustaMe gusta
si te refieres a lo de iptables……
lo puedes hacer desde una terminal.
Me gustaMe gusta
Buen dia, alguien me podria ayudar.
Necesito hacer un nat con ipv6, o mas bien usando ip6tables.
Gracias de antemano.
Me gustaMe gusta
Hola Jonatan,
No creo que quieras hacer nat con ipv6, seguramente querrás utilizar ip6tables para crear un cortafuegos en tu red /64 ipv6, ¿no?
Me gustaMe gusta
algo asi, lo que en realidad quiero es permitir mi salida por IPv6 atravez de mi dhcpv6, podrias ayudarme?
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Muchas gracias por el articulo. Esta muy bien explicado.
Me gustaMe gusta
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 gustaMe gusta
Si todo el mundo se explirara como tu,no habria tantas dudas. Gracias por el articulo. Me ha sido muy util.
Me gustaMe gusta
Buenos días amigo,me podrías enviar un número whatsapp para hacerte unas consultas en vivo!necesito que una ip que esta alojada en un server se pueda ver en la lan y en la wan es decir: acceder a http://www.midominio.com:81 por desde la lan y desde la wan,gracias de antemano
Me gustaMe gusta
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 gustaMe gusta
me gusto ya que nesecitaba para un examen gracias y sigan aportando los que sabe a nosotros los peqeños saltamontes gracias…
Me gustaMe gusta
vivo en argentina y quiero comprar en usa. y enviarmelo a usa. pero creo que por el ip no me permite. como puedo hacerlo?
Me gustaMe gusta
[…] Tablas NAT Iptables => https://albertomolina.wordpress.com/2009/01/09/nat-con-iptables […]
Me gustaMe gusta
cual deben de ser las configuraciones de los equipos cliente en cuanto a el archivo de interfaces
Me gustaMe gusta
Los equipos clientes no necesitan ninguna configuración específica.
Me gustaMe gusta
Pues sinceramente, no he entendido todo todo, pero si saber de que va el tema. Muchas gracias por tu post, y tu pasión a la hora de escribirlo.
Un abrazo pues!
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Si tienes varias interfaces de salida y quieres utilizarlas todas (algo lógico y recomendable por otra parte), la cosa se complica un poco, por lo que no basta lo expuesto en esta entrada, deberías mirar en LARTC:
http://lartc.org/howto/lartc.rpdb.multiple-links.html
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
buena amigos, me fue de mucha ayuda
Me gustaMe gusta
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
Me gustaMe gusta
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 gustaMe gusta
Hola,
La regla de iptables es correcta, probablemente falte activar el bit de forward o haya algún problema de enrutamiento.
Me gustaMe gusta
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 gustaMe gusta
no debo de mover nada de protocolos o puertos? Saludos
Me gustaMe gusta
excelente: una consulta en donde le guardo los scripts
Me gustaMe gusta
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 gustaMe gusta
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
Me gustaLe gusta a 1 persona
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 gustaMe gusta
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 gustaMe gusta
Enhorabuena por el post, nunca me he aclarado mucho con iptables y con este post he aclarado muchas dudas. Gracias por compartirlo.
Me gustaMe gusta
Gracias
Me gustaMe gusta
realmente muy bueno, me sirvió de mucho…. se agradece….
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Muy bien explicado, gracias por darte el tiempo para compartir tus manuales. Impartes cursos o algún tipo de asesoría a distancia?
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Explicado de forma excelente. Muchísimas gracias por el aporte, me has ayudado mucho!!!!
Me gustaMe gusta
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 gustaMe gusta
Hola Pablo,
No termino de entender el escenario ni si la solución adecuada para lo que quieres hacer es iptables. Si puedes, coméntamelo con más detalle.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
como me ayudo este post!. tengo tres días sufriendo para darle salida a internet a una NIC virtual creada con dummy en Centos 7.
Me gustaLe gusta a 1 persona
Excelente artículo!! Muchas gracias por el aporte!
Me gustaMe gusta
Excelente manera de explicar, hasta dan ganas de seguir leyendo y el texto ya terminó. Si tienes más material comenta para revisarlo y aprender más. Gracias
Me gustaMe gusta
Hola Alberto, podrías ponerte en contacto conmigo en siposipo20@gmail.com. Me gustaría que me ayudaras en un pequeñito proyecto con iptables.
Gracias
Me gustaMe gusta
tengo squid y el iptable pero necesito acceder aun wserver de otro dominio por el puerto 443 y no lo logro soy nueva ebn esto me ayudas?
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Gracias, piensa lo de hacer un tutorial similar o añadir como ejemplo la tipico red, con zona dmz, zona local y internet… ;)
Me gustaMe gusta
https://albertomolina.wordpress.com/2011/12/08/cortafuegos-con-iptables/ :)
Me gustaMe gusta
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 gustaMe gusta
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
Me gustaLe gusta a 1 persona