Manipulación de paquete

Ya hemos visto algo sobre manipulación de paquetes cuando en el ejemplo de cortafuegos incluíamos una regla para enmascarar los paquetes de la red local hacia internet. En ese caso, cada paquete procedente de la red local se modifica para sustituir su IP privada por la IP pública del gateway de forma que el paquete ya sea válido para internet.

El enmascaramiento es sólo un pequeño ejemplo de todo lo que se puede hacer y forma parte de lo que hemos denominado NAT (network address translation), aunque son posibles otras formas de manipulación.

La manipulación se podrá hacer en las cadenas PREROUTING, POSTROUTING y OUTPUT.

En el caso de PREROUTING podremos modifcar los datos destino de la conexión según nos interese y antes de tomar la deción de enrutamiento. Así podremos desviar paquetes que vayan destinados al host local hacia otro host y viceversa. Sólo tiene sentido en el interfaz de entrada. Esto lo vamos a llamar DNAT (destination NAT)..

El mismo caso se puede aplicar a la cadena OUTPUT y podermos modificar llos datos de destino de los paquetes paquetes que salen de un proceso local. En este caso sólo es aplicable en el interfaz de salida.

Cuando utilizamos la cadena POSTROUTING podremos modificar los paquetes justo antes de devolverlos a la red. Podremos modificar los datos de origen, porque el destino ya se ha decidido en una de las cadenas previas FOWRARD o OUTPUT. Como hemos visto anteriormente, este es el caso de MASQUERADE. Sólo tiene sentido en el interfaz de salida. Esto lo vamos a denominar SNAT (source NAT).

Cambios de destino (DNAT)

Los cambios de destino corresponden a cadena PREROUTING cuando entra el paquete para que estas modificaciones ya se pueda aplicar al decidir si el paquete se eenvía o va dirigido el sistema local. Sólo, como ya hemos visto anteriormente, se puede utilizar la opción «-i» (interfaz de entrada).

Si el paquete tiene origen local el cambio de destino tendremos que hacerlo en la cadena OUTPUT.

En pimer lugar, para el cambio de destino tenemos que usar la opción «-j DNAT», y los argumentos que dispone esta opción, «--to» para especificar una dirección y un puerto opcional. Podremos también especificar rangos de direcciones.

Vemos algunos ejemplos:

 

## Cambiar la dirección de destino por 192.168.0.254
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 192.168.0.254
 
## Cambia la dirección de destino por 192.168.0.11 ,192.168.0.12 o 192.168.0.13
 iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 192.168.0.11-192.168.0.13

Configuración de un proxy

Suponemos que tenemos un proxy en la dirección 192.168.0.1 y el puerto 3128 para las conexiones a servidores web de internet: Con la siguiente regla en el gateway redirigiremos todas las peticiones que se realicen hacia un servidor web (puerto 80) hacia el puerto 3128 de la máquina 192.168.0.1:

 

## Cambia la dirección de destino del tráfico web por 192.168.0.1 en el puerto 3128
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.1:3128

Servidor web con proxy

Ahora suponemos que tenemos un servidor web, pero que para acelerar las conexiones todas las peticiones que se hagan las va a resolver el proxy que está en el mismo equipo pero en el puerto 3128.

## Envía el tráfico que entra dirigido al puerto 80 (web) al proxy squid (transparente)

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Poner un servidor web en una IP privada

Suponemos que tenemos una red con un gateway con la única dirección IP pública y nos interesa tener un servidor web en el interior de la red local, en el equipo 192.168.0.78. Entonces tendremos que poner:

## Envía el tráfico que entra dirigido al puerto 80 (web) al servidor web local (transparente)

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to 192.168.0.78

Cambio de Origen

Los cambios de destino corresponden a cadena POSTROUTING, justo antes de que el paquete sea enviado y para que estas modificaciones no se vean afectadas por la cadena FORWARD, en su caso. Este es un detalle importante, ya que significa que cualquier otro servicio de la máquina Linux (encaminamiento, filtrado de paquetes) verá el paquete sin cambiar. Sólo podremos usar «-o» (interfaz de salida).

En pimer lugar, para el cambio de destino tenemos que usar la opción «-j SNAT», y los argumentos que dispone esta opción, «--to» para especificar una dirección y un puerto opcional. Podremos también especificar rangos de direcciones.

 

## Cambiar la dirección de origen por 192.168.0.4
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.4
 
## Cambiar la dirección de origen a 192.168.0.4, 192.168.0.5 ó 192.168.0.6
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.4-192.168.0.6
 
## Cambiar la dirección de origen por 192.168.0.4, puertos 1-1023
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 192.168.0.4:1-1023

Enmascaramiento

El caso más utilizado de SNAT el el que denominamos «enmascaramiento» (masquerading), que se utiliza para ocultar las direcciones privadas de una red local en el acceso a internet.

No es necesario escribir la dirección de origen de forma explícita con el enmascaramiento:

 

## Enmascarar todo lo que salga por eth0 proveniente de la red local.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE