Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

martes, 5 de febrero de 2013

Configuración de NAT con iptables

Ahora que ya se conoce el funcionamiento general de iptables. Hablaré de otra tabla bastante usada en Linux. Se trata de NAT(Network Address Translation). Esta vez seré más breve que en el anterior manual pues se supone que ya poseemos algunos conocimientos fundamentales. Por ello me enfocaré en la materia en sí, que trata de lo que es capaz de hacer NAT y de sus parámetros.

La tabla de NAT, es la encargada del redireccionamiento y enmascaramiento de los paquetes de red. Esto es realmente útil en servidores, equipos que actúan cómo firewall o equipos de relevancia en la red.

La tabla NAT está formada de tres cadenas:

  • PREROUTING:Esta cadena redirige los paquetes entrantes antes de enroutarlos
  • POSTROUTING: Esta cadena modifica los paquetes justo antes de enviarlos
  • OUTPUT: Sólo altera los paquetes generados localmente por el propio equipo.

Cuidado con el orden de las reglas escritas, pues la primera tiene prioridad. Es decir que si un paquete encuentra una regla que lo define, aún habiendo más tarde otra que también; ejecutará hará caso a la primera y hará lo que esta le diga.

Para que NAT pueda hacer su tarea es necesario hacer una acción previa de importancia vital. No importa que nuestras reglas estén escritas perfectamente pues no harán nada si no escribimos el siguiente comando antes.

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

Este comando debe hacerse cada vez que arranque el ordenador o sino editar el fichero /etc/systlc.conf y allí donde pone #net.ipv4.ip_forward=1 quitar # para que así hacer que dicho cambio sea permanente. Con ello nos aseguramos que en caso de que no haga caso de una regla, sea por que está mal escrita no porque nos falte algo por hacer.

NAT puede tomar tres acciones, las cuales dependen directamente de las cadenas que se usen, ya que algunas solo pueden ser usada con ciertas cadenas. Pero antes mostraré un esquema del entorno sobre el que se efectuará la explicación.


DNAT: Esta acción redirige todos los paquetes que vayan al servidor hacia otra dirección. Esta acción solo puede realizarse en las cadenas PREROUTING, pues trata los paquetes entrantes. DNAT siempre va seguido de --to dirección de destino a la que queremos redirigir los paquetes. Por ejemplo podemos hacer que un equipo de la red privada aloje un servicio accesible desde Internet desde el puerto 4444. Por ejemplo que posea un servicio instalado, el cual es accesible localmente por el puerto 880. En la red local habría que escribir la dirección del equipo en un navegador. Ej: 172.25.1.5:880. Para poder acceder desde fuera de la red local, habría que escribir lo siguiente.

iptables –t NAT –A PREROUTING –p tcp --dport 444 –i eth0 –j DNAT --to 172.25.1.5:880

Con esta regla activada, escribiendo esto: 192.168.1.1:4444 desde el exterior accederíamos al 172.25.1.5:880 de la red privada. Este caso es puramente hipotético, ya que hay que tener más cosas en cuenta cómo el router (que debería poseer NAT también), el cual habría que configurar también, pero eso es un tema aparte. Este ejemplo solo es para explicar el funcionamiento de DNAT.

SNAT: Esta acción hace que todos los paquetes salientes que cumplan cierta regla adquieran la ip que nosotros le mandemos “ocultando” su verdadera ip. Esta acción solo se puede hacer en las cadenas OUTPUT o POSTROUTING, aunque por lo general es usado sólo para las cadenas POSTROUTING. Esto es útil cuando tenemos ciertos equipos dentro de una red privada que está oculta a la red pública. Por ejemplo hacemos que los paquetes mandados desde equipos dentro de una red privada, se transformen en una ip que pueda comunicarse con el exterior por la interfaz eth0 y que además puede recibir respuesta. Es decir, que se pueda navegar por Internet o tener comunicación con equipos fuera de la red privada. Para ello habría que hacer lo siguiente:

iptables –t NAT –A POSTROUTING –s 172.25.1.0/24 –o eth0 –j SNAT --to 192.168.1.1

En este caso hemos camuflado todos los paquetes que vengan de la red privada con la ip de la tarjeta eth0 del servidor.

MASQUERADE: Posee la misma funcionalidad que SNAT, pero en este caso calcula automáticamente la ip de la tarjeta de salida. Es decir que en vez de poner –j SNAT –to ip de la tarjeta de salida, si pusiésemos MASQUERADE tendríamos el mismo resultado. ¿Entonces cuando saber si poner una u otra? El calculo de la ip de la tarjeta de red por la que saldrán los paquetes, consume una pequeña cantidad recursos del servidor, cosa que no siempre nos interesa. MASQUERADE es útil si la tarjeta de red por la que salen los datos, recibe su ip de un DHCP (Dynamic Host Configuration Protocol), ya que en algún momento dado, por las razones que sean, la tarjeta de red de salida podría recibir una ip distinta, arruinando nuestra regla e impidiendo la salida a Internet de los equipos de la red privada. Pongamos el anterior ejemplo adaptado a MASQUERADE:

iptables –t NAT –A POSTROUTING –s 172.25.1.0/24 –o eth0 –j MASQUERADE

MASQUERADE siempre enmascara los paquetes con la ip de la tarjeta de red por la que salen los paquetes.

Cómo podéis ver el manejo de la tabla NAT de iptables es relativamente fácil. Sólo se debe tener bien claro lo que se desea hacer antes de plasmarlo en las reglas que queramos escribir y podremos hacer lo que queramos. En este caso no haré un script, pues aquí no existe un “Standard”, sino que todo depende de las necesidades de cada uno. Recordad que todas las reglas que hagamos deben incluirse en un script de inicio y que ip_foward debe ser igual a 1.

Las posibilidades de esta tabla son infinitas, sólo se necesita un poco de imaginación. 

1 comentario :