Enmascaramiento IP y Traducción de Direcciones de Red

|

Efectos Laterales y Beneficios Accesorios
Configuración del Núcleopara enmascaramiento IP
Configuración del enmascaramiento IP
Manipulación del Servicio de Nombres
Más sobre la traducción de direcciones de red

No hace falta tener una memoria excelente para recordar los días en los que sólo las grandes compañías se podían permitir disponer de un cierto número de máquinas conectadas por una red local. Frente a aquello, hoy los precios de la tecnología de red han bajado y bajado hasta producir dos consecuencias: La primera, que las redes locales sean algo común, presentes incluso en entornos domésticos. Es seguro que muchos de los lectores, usuarios de GNU/Linux, tendrán en su casa dos o más computadoras conectadas por algún tipo de ethernet. La segunda, que los recursos de red, y de forma especial las direcciones IP, hayan llegado a ser algo escasos y, aunque no están lejanos los tiempos en que eran gratuitos, sean ahora objeto de compraventa.

La mayor parte de la gente que disponga de una LAN deseará también disfrutar de una conexión a Internet que todas las máquinas de su red puedan utilizar al mismo tiempo. Las reglas del encaminamiento IP son muy estrictas respecto a la forma de manejar esta situación. Las soluciones tradicionales a este problema hubieran pasado por solicitar un conjunto de direcciones IP, probablemente un rango de clase C, dar a cada máquina de la LAN una dirección del rango asignado, y utilizar un entutador para conectar la LAN a Internet.

En el actual escenario de una Internet mercantilizada, esa solución saldría bastante cara. En primer lugar habría que pagar por el rango de direcciones asignado, en segundo lugar habría que pagar con toda probabilidad al Proveedor de Servicios de Internet (ISP) por el privilegio de disponer de una ruta hacia la red local en sus máquinas, de tal forma que el resto de Internet supiera cómo llegar a ellas. Esto puede sonar posible para algunas empresas, pero en una instalación doméstica los costes no estarían justificados.

Afortunadamente GNU/Linux proporciona una solución al problema, solución que utiliza un componente de un grupo de funcionalidades avanzadas de red llamadas en conjunto Traducción de Direcciones de Red (NAT). NAT es un conjunto de procedimientos para modificar las direcciones IP contenidas en las cabeceras de los datagramas IP mientras éstos viajan (al vuelo). Puede sonar extraño, pero mostraremos que se trata de la solución ideal al problema —real para muchos— que acabamos de plantear. 'IP masquerade' es el nombre que recibe un tipo de traducción de direcciones de red que permite que todas las máquinas de una red privada utilicen Internet contando con una única conexión (y una única dirección IP).

El enmascaramiento IP (en inglés «IP masquerading») permite utilizar un rango de direcciones privadas (reservadas) en la red local y que el encaminador GNU/Linux se encargue de hacer al vuelo ciertas traducciones de direcciones IP y puertos. Cuando le llega un datagrama IP de alguna máquina de la red local, se fija en el protocolo de nivel superior encapsulado en el mismo («UDP», «TCP», «ICMP», etc...) y modifica el datagrama para que parezca que fue generado por el propio encaminador (y recuerda qué ha sido modificado). A continuación saca el datagrama a Internet donde aparece generado por la única dirección IP pública del encaminador. Cuando la máquina destino recibe el datagrama cree que se ha originado en la máquina GNU/Linux, y responde a su dirección de Internet. Cuando el encaminador GNU/Linux recibe un datagrama en su interfaz de red conectada a Internet, busca en su tabla de conexiones enmascaradas en curso para ver si el datagrama pertenece a alguna máquina de la LAN y, si es así, deshace la traducción que hizo en el primer datagrama y reenvía este datagrama de respuesta a la máquina local.

En Figura 11-1 aparece un ejemplo sencillo.

Tenemos una pequeña red ethernet en la que utilizamos uno de los rangos de direcciones reservadas. La red dispone de un encaminador con enmascaramiento, una máquina GNU/Linux, por supuesto, que proporciona acceso a Internet. Una de las máquinas de la red (192.168.1.3) desea establecer una conexión con el host remoto 209.1.106.178 en el puerto 8888. El equipo encamina su datagrama por el encaminador con enmascaramiento, que identifica la petición de conexión como requiriente de los servicios de enmascaramiento. El encaminador entonces acepta el datagrama y reserva un número de puerto (1035) para este menester, sustituye la dirección IP y número de puerto de la máquina origen del datagrama por los suyos propios, y transmite el datagrama al host destino. El host destino cree que ha recibido una petición de conexión de la máquina GNU/Linux enmascaradora, y genera un datagrama de respuesta. La máquina enmascaradora, al recibir ese datagrama, halla la asociación en su tabla de enmascaramiento y deshace la sustitución que llevó a cabo en el primer datagrama. Entonces transmite el datagrama de respuesta a la máquina origen.

La máquina local cree que se está comunicando directamente con el host remoto. El host remoto no sabe nada de la existencia de la máquina local y cree que ha establecido una conexión con la máquina GNU/Linux enmascaradora. La máquina GNU/Linux enmascaradora sabe que las otras dos máquinas están hablando entre sí y en qué puertos, y realiza las traducciones de direcciones y puertos necesarias para que la comunicación tenga lugar.

Todo lo anterior puede parecer un poco confuso, y puede que lo sea, pero funciona y es verdadermente simple de poner a punto. Así que no se preocupe si aún no comprende todos los detalles.




Efectos Laterales y Beneficios Accesorios

La funcionalidad de enmascaramiento IP viene acompañada de su propio conjunto de efectos laterales, algunos son útiles y algunos pueden acabar siendo un problema.

Ninguna de las máquinas en la red detrás del encaminador enmascarador son jamás vistas directamente desde Internet. Consecuentemente, sólamente se necesita una dirección IP válida y rutable para permitir que todas las máquinas establezcan conexiones hacia Internet. Esto tiene un lado no tan bueno: ninguna de esas máquinas es visible desde Internet, y por lo tanto no se puede conectar directamente a ellas desde Internet. La única máquina visible en una red enmascarada es el propio encaminador enmascarador. Se trata de algo importante cuando se piensa en servicios como el correo o el FTP. Resulta de utilidad decidir qué servicios deberían ser provistos por la máquina enmascaradora y para cuáles debería actuar como proxy o tratar de algún otro modo especial.

Segundo, dado que ninguna de las máquinas enmascaradas son visibles, se encuentran relativamente protegidas de ataques del exterior. Eso puede simplificar (o eliminar) la necesidad de puesta a punto de funcionalidades de cortafuegos en la máquina enmascaradora. No se debe confiar demasiado en ésto, puesto que la red local estará únicamente tan segura como lo esté la máquina enmascaradora. Así, si la seguridad es un punto importante, se debería utilizar un cortafuegos para protegerla.

Tercero, el enmascaramiento IP tendrá cierto impacto negativo en el rendimiento de su red. En un escenario típico ese impacto negativo será probablemente insignificante. Si se tiene un gran número de sesiones enmascaradas activas puede ocurrir que se perciba cierta sobrecarga en la máquina enmascaradora que afecte negativamente al rendimiento de la red. El enmascaramiento IP implica un incremente considerable en el proceso que requiere cada datagrama comparado con el normalmente exigiría. Si piensa utilizar un 386SX16 como encaminador enmascarador para una conexión telefónica a Internet puede resultar, pero no espere demasiado si quiere usarlo como encaminador en su red corporativa a velocidades Ethernet.

Por último, ciertos servicios de red simplemente no funcionarán a través de enmascaramiento, o, al menos, no sin un poco de ayuda. Típicamente se trata de servicios que dependen de conexiones entrantes para funcionar, como ciertos tipos de Canales de Comunicación Directa (DCC), ciertas funciones del IRC, o algunos tipos de servicios de audio y vídeo multicast. Algunos de esos servicios disponen de módulos del kernel especialmente desarrollados para proporcionar una solución, y de ellos hablaremos dentro de un momento. Para otros es posible que no se encuentre soporte, así que se debe tener en cuenta que el enmascaramiento no es la solución adecuada en todas las situaciones.

Configuración del Núcleopara enmascaramiento IP

Para usar la función del enmascaramiento IP el núcleo debe ser compilado precisamente con soporte de enmascarmiento. Se deben seleccionar las siguientes opciones al configurar un núcleo de la serie 2.2:


    Networking options  --->
[*] Network firewalls
[*] TCP/IP networking
[*] IP: firewalling
[*] IP: enmascaramiento
--- Protocol-specific masquerading support will be built as modules.
[*] IP: ipautofw masq support
[*] IP: ICMP masquerading

Nótese que partes del soporte de enmascaramiento están disponibles únicamente como módulos. Esto significa que habrá que ejecutar “make modules” además del habitual “make bzImage” cuando se compile el núcleo.

Los núcleos de la serie 2.4 no presentan el soporte de enmascaramiento Ip como una opción de la compilación. En su lugar, se debe seleccionar la opción del filtrado de paquetes de red:


    Networking options  --->
[M] Network packet filtering (replaces ipchains)

En los núcleos de la serie 2.2 cierto número de módulos de asistencia para ciertos protocolos se crean durante la compilación del núcleo. Algunos protocolos comienzan estableciendo una conexión hacia fuera y entonces reciben una conexión desde fuera en otro puerto. Normalmente eso no podría ser enmascarado, puesto que no hay forma para la máquina GNU/Linux de asociar la segunda conexión con la primera sin meterse dentro del propio protocolo. Los módulos asistentes hacen justamente eso: examinan los datagramas y permiten que el enmascaramiento funcione para los protocolos que soportan. Protocolos que de otra forma serían imposibles de enmascarar. Los protocolos soportados son:

MóduloProtocolo
ip_masq_ftpFTP
ip_masq_ircIRC
ip_masq_raudioRealAudio
ip_masq_cuseemeCU-See-Me
ip_masq_vdolivePara VDO Live
ip_masq_quakeQuake, de IdSoftware

Esos módulos deben ser cargados manualmente mediante la orden insmod. Nótese que no pueden ser cargados por el demonio kerneld. Cada uno de esos módulos acepta como argumento el puerto en el que debe escuchar. Para el módulo RealAudio™ se podría poner:

    # insmod ip_masq_raudio.o ports=7070,7071,7072

Los puertos especificados dependen del protocolo. El mini-HOWTO del enmascaramiento IP (IP masquerade mini-HOWTO), escrito por Ambrose Au, trata con más detalle los módulos asistentes y cómo configurarlos.

El paquete netfilter contiene módulos que realizan funciones similares. Por ejemplo, para que se hagan cargo del seguimiento de las sesiones FTP, se deben cargar los módulos ip_conntrack_ ftp y ip_nat_ ftp.o.


Configuración del enmascaramiento IP

Después de leer los capítulos sobre cortafuegos y auditoría IP, probablemente no sea sorprendente que los programas ipfwadm, ipchains, e iptables se utilicen para configurar también las reglas de enmascaramiento IP.

Las reglas de enmascaramiento son una clase especial de reglas de filtrado. Sólamente se puede enmascarar datagramas que se reciban por una interfaz y que vayan a ser encaminados por otra. Una regla de enmascaramiento se construye de forma parecida a una regla de encaminamiento de cortafuegos, pero incluyendo unas opciones especiales que le dicen al núcleo que debe enmascarar el datagrama IP. El programa ipfwadm utiliza la opción -m, ipchains utiliza -j MASQ, e iptables, -j MASQUERADE para indicar que los datagramas que cumplan las condiciones especificadas por la regla deben ser enmascarados.

Veamos un ejemplo. Una estudiante de informática de la Universidad Groucho Marx tiene unas cuantas máquinas en casa interconectadas en una pequeña red local ethernet. Ha decidido utilizar uno de los rangos privados de direcciones IP para su red. Comparte el lugar con otras estudiantes, todas las cuales tienen interés en usar Internet. Dado que las residentes no gozan de una economía especialmente boyante, no se plantean costearse una conexión permanente a Internet. En su lugar utilizan una conexión PPP telefónica. A todas ellas las gustaría poder compartir la conexión para chatear en el IRC, navegar por la Web y bajarse ficheros por FTP directamente a cada una de sus computadoras. El enmascaramiento IP es la respuesta.

Nuestra estudiante primeramente configura una máquina GNU/Linux para que se encargue del enlace telefónico y para que actúe como encaminador de la red local. La dirección IP que le asignan cuando se conecta telefónicamente no es importante. Configura el encaminador GNU/Linux para que haga enmascaramiento IP y usa uno de los rangos privados de direcciones IP para la red local: 192.168.1.0. Se asegura de que todas las computadoras de la red tengan como ruta por defecto una que apunte al encaminador GNU/Linux.

Todo lo que se necesita para que el enmascaramiento funcione en ese escenario son las siguientes invocaciones del programa ipfwadm:


    # ipfwadm -F -p deny
# ipfwadm -F -a accept -m -S 192.168.1.0/24 -D 0/0

o, utilizando ipchains:


    # ipchains -P forward -j deny
# ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ

o con iptables:


    # iptables -t nat -P POSTROUTING DROP
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Ahora simpre que alguna de las máquinas de la red local trate de acceder a un servicio en una máquina remota, sus datagramas serán automáticamente enmascarados por el encaminador enmascarador GNU/Linux. La primera regla en cada uno de los ejemplos impide que la máquina GNU/Linux encamine cualquier otro datagrama y proporciona cierta seguridad.

Para listar las reglas de enmascaramiento que se hayan creado, se utiliza la opción -l para el programa ipfwadm, exactamente como se dijo ya al referirnos a los cortafuegos.

Para listar la regla que creamos previamente se utiliza:


    # ipfwadm -F -l -e

tras lo que debe aparecer algo como:


    # ipfwadm -F -l -e
IP firewall forward rules, default policy: accept
pkts bytes type prot opt tosa tosx ifname ifaddress …
0 0 acc/m all ---- 0xFF 0x00 any any …

La “/m” indica que se trata de una regla de enmascaramiento.

Para listar las reglas de enmascaramiento con ipchains, se utiliza la opción -L. Si listamos las reglas creadas previamente con ipchains, la salida sería algo como:

    # ipchains -L
Chain input (policy ACCEPT):
Chain forward (policy ACCEPT):
target prot opt source destination ports
MASQ all ------ 192.168.1.0/24 anywhere n/a

Chain output (policy ACCEPT):

Cualquier regla en la que como objetivo aparezca MASQ es una regla de enmascaramiento.

Finalmente, para listar las reglas mediante iptables hay que usar:


    # iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy DROP)
target prot opt source destination
MASQUERADE all -- anywhere anywhere MASQUERADE

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Las reglas de enmascaramiento aparecen aquí también con MASQUERADE como objetivo.


Configuración de parámetros temporales


Cuando se establece una nueva conexión, el software de enmascaramiento IP crea una asociación en memoria entre cada una de las máquinas implicadas. Tales asociaciones se pueden ver en cualquier momento inspeccionando el fichero /proc/net/ip_masquerade. Las asociaciones caducan tras un período de inactividad.

Los valores de máximo tiempo de inactividad se pueden configurar mediante ipfwadm. La sintaxis es:


    ipfwadm -M -s <tcp> <tcpfin> <udp>

con ipchains sería:


    ipchains -M -S <tcp> <tcpfin> <udp>

La implementación de iptables incluye unos valores por defecto mucho mayores que no permite cambiar.

Cada uno de esos valores representa un contador usado por el software de enmascaramiento IP y están dados en segundos. La siguiente tabla muestra un resumen de los contadores y sus significados:

NombreDescripción
tcp

Tiempo de caducidad de la sesión TCP. Cuánto puede estar inactiva una conexión TCP antes de que la correspondiente asociación sea eliminada.

tcpfin

Tiempo de caducidad de TCP tras un FIN. Cuanto permanece una asociación tras la desconexión de la correspondiente conexión TCP.

udp

Caducidad de sesión UDP. Tiempo máximo de inactividad de una «conexión» UDP antes de que la asociación correspondiente sea eliminada.



Manipulación del Servicio de Nombres

El manejo de las resoluciones de nombres desde las máquinas de una red local enmascarada ha representado tradicionalmente un problema. Hay dos maneras de encajar el DNS en un entorno con enmascaramiento. Se puede instruir a cada máquina para que utilice el mismo servidor DNS que utilice el encaminador GNU/Linux y dejar que el enmascaramiento IP haga su trabajo. Otra alternativa es ejecutar un servidor de nombres de caché en la máquina GNU/Linux y hacer que cada una de las máquinas en la LAN tenga configurada a la máquina GNU/Linux como su servidor DNS. Aunque se trata de una configuración más agresiva, es seguramente mejor porque reduce el volumen de tráfico DNS hacia el enlace con Internet y es ligeramente más rápido para la mayor parte de las peticiones, dado que serán respondidas utilizando la caché.

0 comentarios: