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.
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.
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
).