Página siguiente Página anterior Índice general

6. Controlar qué cosas pasar por NAT

Necesita crear reglas NAT que le digan al núcleo qué conexiones cambiar, y cómo hacerlo. Para ello, usaremos la muy versátil herramienta iptables, y le diremos que altere la tabla de NAT usando la opción «-t nat».

La tabla de reglas NAT contiene tres listas llamadas «cadenas»: cada regla se examina por orden hasta que una coincide. Las tres cadenas se llaman PREROUTING (para Destination NAT, según los paquetes entran), POSTROUTING (para SOURCE NAT, según los paquetes salen), y OUTPUT (para Destination NAT con los paquetes generados en la propia máquina).

El siguiente diagrama lo ilustraría bastante bien si yo tuviese algo de talento artístico:

      _____                                           _____
     /     \                                         /     \
   PREROUTING -->[Decisión de   ]----------------->POSTROUTING----->
     \D-NAT/     [Encaminamiento]                    \S-NAT/
                     |                                  ^
                     |                                __|__
                     |                               /     \
                     |                              | OUTPUT|
                     |                               \D-NAT/
                     |                                  ^
                     |                                  |
                     ----------> Proceso Local ----------

En cada uno de los puntos anteriores, cuando un paquete pasa miramos la conexión a la que está asociado. Si es una conexión nueva, comprobamos la cadena correspondiente en la tabla de NAT para ver qué hacer con ella. La respuesta que obtenemos se aplicará a cualquier paquete posterior de esa conexión.

6.1 Selección sencilla usando iptables

iptables toma cierto número de decisiones estándar que se listarán ahora. Todas las opciones con doble guión pueden ser abreviadas, siempre que iptables pueda distinguirlas de otras opciones posibles. Si el núcleo tiene la implementación de iptables como módulo, necesitará cargar el módulo ip_tables.o antes: «insmod ip_tables».

La opción más importante aquí es la opción de selección de tabla, «-t». Para todas las operaciones de NAT, querrá usar «-t nat» para la tabla NAT. La segunda más importante es «-A» para añadir una nueva regla al final de una cadena («-A POSTROUTING»), o «-I» para insertarla al principio («-I PREROUTING»).

Puede especificar el origen («-s» o «--source») y el destino («-d» o «--destination») de los paquetes sobre los que quiere hacer NAT. Estas opciones pueden ir seguidas por una IP sencilla (192.168.1.1), un nombre (www.kernelnotes.org), o una dirección de red (192.168.1.0/24 o 192.168.1.0/255.255.255.0).

Puede especificar qué interfaz de entrada («-i» o «--in-interface») o de salida («-o» o «--out-interface») mirar, pero lo que puede especificar depende de en qué cadena esté poniendo la regla: en PREROUTING sólo puede elegir la interfaz de entrada, y en POSTROUTING (y OUTPUT) sólo la de salida. Si usa la equivocada, iptables le avisará con un mensaje de error.

6.2 Opciones más refinadas de selección de paquetes a toquetear.

Dije antes que se puede especificar una dirección de origen y destino. Si omite la opción de origen, entonces será cualquier dirección de origen. Si omite la de destino, será cualquier dirección de destino.

También puede indicar un protocolo específico («-p» o «--protocol»), como TCP o UDP; sólo los paquetes de este protocolo coincidirán con la regla. La razón principal para hacer esto es que especificar uno de los protocolos tcp o udp permite más opciones: específicamente las opciones «--source-port» y «--destination-port» (abreviadas «--sport» y «--dport»).

Estas opciones le permiten especificar que sólo los paquetes con un determinado origen y destino coincidirán con la regla. Esto es útil para redireccionar peticiones web (puertos TCP 80 u 8080) y dejar los demás paquetes tranquilos.

Estas opciones deben seguir a la «-p» (que tiene el efecto secundario de cargar la biblioteca compartida de extensión para ese protocolo). Puede usar números de puerto, o un nombre de fichero /etc/services.

Todos los diferentes parámetros por los que se puede seleccionar un paquete vienen enumerados con toda clase de dolorosos detalles en la página de manual (man iptables).


Página siguiente Página anterior Índice general