3.2. El sistema NAT.Enmascaramiento y filtrado de direcciones IP

Todo el proceso descrito en la Sección 3.1ocurre al conectarnos de manera sencilla con nuestro ordenador, un módem y una cuenta de acceso a Internet. Ahora bien, cuando tenemos una red y deseamos navegar desde cualquier equipo de la misma, la cuestión es diferente.

Imaginemos que el ordenador nº 3 del aula de informática, info3, con dirección IP 192.168.1.103 quiere consultar una documentación sobre linux en castellano y, para ello, realiza una petición al puerto 80 de la máquina es.tldp.org tecleando en su navegador http://es.tldp.org

Cuando el servidor de nombres le proporcione la IP adecuada y descubra que no pertenece a su red local, encaminará su petición a través de gato y éste redirigirá la petición al servidor es.tldp.org que la recibirá procedente de la IP 20.20.20.20 y, en consecuencia, le responderá a gato que tiene que saber, de alguna manera servirle esta información a info3 que fue, en realidad, quien solicitó esta página. Para ello, gato marca el paquete que recibe de info3 asignándole un dato más que identifica el remitente de la petición, de modo que, al recibir la respuesta, sepa que no es para ella y redirigirla a quien la solicitó, en este caso info3.

Todo este proceso que realiza gato se conoce con el nombre de enmascaramiento o masquerading y es una característica del núcleo de linux, a partir de su versión 2.0 que permite la navegación a toda una red local con una sola conexión a internet sin necesidad de usar un proxy. Es una de las posibilidades que nos ofrece el sistema NAT (Network Address Translation) o Traducción de Direcciones de Red.

Puede ampliarse la información relativa al funcionamiento de NAT en el siguiente documento en castellano, aunque los sitios oficiales del proyecto NAT se encuentran en Penguin Computing, el equipo Samba y SGI y, por último, el mantenido por Harald Welte.

3.2.1. Filtrado de paquetes

Una red nunca es segura. Esta es la principal idea que nunca debe abandonar un administrador de red. Por lo tanto, con esa premisa, si permitimos el tráfico en nuestra red debemos tomar todas las precauciones a nuestro alcance para que impedir que los paquetes con código malicioso o no deseado circulen y que nos ocasionen algún quebradero de cabeza.

Un filtro es, pues, un software que examina las cabeceras de los paquetes y decide su suerte conforme a unas reglas fijadas por el usuario. Este software está situado en el propio núcleo de Linux y se conoce con el nombre de netfilter, mientras que la herramienta encargada de su gestión, iptables es la que se comunica con el núcleo y le proporciona las reglas de filtrado de los paquetes. Básicamente son dos las acciones para con los paquetes examinados: DROP (Descartarlo y hacer como si no se hubiera recibido, con lo que el paquete se pierde irremediablemente) o ACCEPT (Dejar que pase y alcance su destino), aunque el abanico de posibilidades de uso de esta herramienta es tan sumamente amplio y poderoso que la creación de un buen cortafuegos es objeto de sesudos tratados y aquellos capaces de construirlos con robustez, son muy pocos y muy bien pagados.

Aquellas mentes inquietas que quieran sumergirse en este apasionante mundo de la seguridad en las redes pueden comenzar con este documento en castellano. Los sitios oficiales son los mismos que para el enmascaramiento, ya apuntados en la Sección 3.2.

Importante

La utilidad iptables añade y elimina reglas de la tabla de filtrado del núcleo, es decir, cualquier política que establezcamos con ella se perderá al reiniciar el sistema, a menos que las establezcamos como "permanentes" para que Linux las reconozca en el siguiente arranque.

3.2.2. Enmascarando y filtrando con gato

Con Linux ha sido posible el enmascaramiento desde los arcaicos núcleos de la serie 1.1, aunque las herramientas han evolucionado y a partir de las versión 2.4 del núcleo se utiliza iptables para controlar todo el proceso.

Es normal que todo pueda resultar algo farragoso e incluso demasiado complicado, pero para nuestro objetivo, trataremos de simplificar al máximo y conseguiremos de una forma sencilla que nuestro equipo sea capaz de enmascarar nuestra red local para navegar por internet.

En primer lugar hemos de hacer que gato tenga habilitado el reenvio de paquetes, esto se consigue con la orden:

[root@gato root]#  echo 1 > /proc/sys/net/ipv4/ip_forward

Esta instrucción escribe el archivo /proc/sys/net/ipv4/ip_forward que es un fichero de texto que sólo contiene el carácter "1".

Ahora nos disponemos a limpiar todas las reglas de filtrado que pudieran existir en nuestra máquina, para ello ejecutamos:

[root@gato root]# iptables --flush
[root@gato root]# iptables --table nat --flush
[root@gato root]# iptables --delete-chain
[root@gato root]# iptables --table nat --delete-chain

Y, por último vamos a enmascarar nuestra red local y permitir que navegue con las dos instrucciones siguientes:

[root@gato root]# iptables --table nat --append POSTROUTING --out-interface eth1 -j MASQUERADE
[root@gato root]# iptables --append FORWARD --in-interface eth0 -j ACCEPT

Se observa que las órdenes son bastante intuitivas. En la primera estamos diciendo que enmascare y enrute los paquetes a través de la segunda tarjeta de red que ya configuramos para comunicarnos con Internet. En la segunda, establecemos la política de aceptar los paquetes que reciba por la primera tarjeta de red (la que comunica con la red local) y los reenvíe.

Hemos de aclarar que todo este montaje también sirve si queremos sacar nuestra red local a Internet aunque no dispongamos de ADSL sino de un módem convencional. El único cambio sería sustituir la eth1, que es la tarjeta dedicada a conectar con el router, por ppp0 que es la interfaz del módem. Es decir, en caso de disponer de un módem para conectar a Internet, las instrucciones serían:

[root@gato root]# iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
[root@gato root]# iptables --append FORWARD --in-interface eth0 -j ACCEPT

Llegado a este punto, ya estamos en condiciones de comprobar que cualquier ordenador de nuestra red local es capaz de comunicarse con cualquier equipo externo que posea una IP pública. Podríamos comprobarlo usando simplemente:

[usuario@info5 usuario]$ ping www.um.es

Deberíamos ver

PING araneus.um.es (155.54.1.244) from 62.201.10.34 : 56(84) bytes of data.
64 bytes from araneus.um.es (155.54.1.244): icmp_seq=1 ttl=245 time=220 ms
64 bytes from araneus.um.es (155.54.1.244): icmp_seq=2 ttl=245 time=206 ms
64 bytes from araneus.um.es (155.54.1.244): icmp_seq=3 ttl=245 time=210 ms
64 bytes from araneus.um.es (155.54.1.244): icmp_seq=4 ttl=245 time=197 ms

--- araneus.um.es ping statistics ---
5 packets transmitted, 4 received, 20% loss, time 4007ms
rtt min/avg/max/mdev = 197.133/208.841/220.496/8.386 ms

Esto probaría, no sólo que el ordenador número de cinco del aula de informática ha sido capaz de comunicarse con el servidor de la Universidad de Murcia, sino también, que funciona la resolución de nombres, por lo que navegaríamos ya sin problemas. Además, descubrimos que la máquina que sirve web se llama araneus con IP pública 155.54.1.244 y que nuestro proveedor de Internet nos ha asignado la IP 62.201.10.34 para esta sesión.