FreeBSD México
NAT con IPFilter en FreeBSD
Introducción
En el manejo de redes cuando las direcciones reales se nos acaban podemos hechar mano de un recurso llamado NAT (Network Address translation) para asignar direcciones inválidas a una red y rutearlas a través de un servidor ejecutando este servicio, de esta manera podemos tener direcciones ip suficientes para toda una clase A de computadoras.
El traslado de direcciones funciona de la siguiente manera:
Una computadora con una ip inválida realiza una petición a un servicio web, el servidor realizando NAT recibe la petición y almacena la ip y los datos de la petición en una tabla y procede a realizar el enlace al servidor remoto. Al recibir la respuesta de los datos solicitados, en servidor NAT compara en su tabla y los enruta hacia la máquina con la dirección interna, todo esto de una manera trasparente para los equipos internos que ven el tráfico como si estuvieran en un segmento de red real.
Requerimientos
Para tener soporte de NAT en FreeBSD es necesario contar con un equipo configurado con 2 tarjetas de red, una conectada al exterior y una configurada con una dirección invalida que conectará con las máquinas internas y compilar un nuevo kernel, en este caso como utilizaremos IPFilter las opciones a incluir dentro del kernel son:
options IPFILTER
options IPFILTER_LOG
podemos aprovechar para modificar y/o agregar algunas opciones interesantes
maxusers 64
options IPSTEALTH
options ICMP_BANDLIM
esto nos permite aumentar el número de procesos, limitar algunos paquetes icmp y tener soporte para ruteo en modo stealth (existe una explicación mas completa en el archivo LINT) y entonces si, a recompilar el kernel para tener soporte NAT.
Configuración
Con el nuevo núcleo en su lugar podemos empezar a modificar los archivos necesarios para habilitar todo, y empezamos por /etc/rc.conf que debe de contener lo siguiente:
gateway_enable="YES"
ipfilter="YES"
ipnat="YES"
Debemos crear un archivo /etc/ipnat.rules para especificar de que segmento de red interna vamos a permitir peticiones al exterior
map xl0 192.168.0.0/16 -> 0.0.0.0/32 portmap tcp/udp 10000:65000
map xl0 192.168.0.0/16 -> 0.0.0.0/32
En este caso estamos permitiendo la salida de toda la red 192.168.0.0 a través de la dirección real del servidor, ajuste los parámetros del segmento al que desee dar acceso.
Ahora creamos un archivo /etc/ipfilter.rules conteniendo lo siguiente:
pass in all
pass out all
Que lo único que hace es decirle al filtro de paquetes que deje entrar todo el tráfico desde donde venga y deja salir el tráfico a donde sea, simple verdad?
Estas reglas deben cargarse al momento de bootear el servidor, esto podemos lograrlo de 2 maneras, una habilitando las variables de /etc/defaults/rc.conf
ipfilter_enable="YES"
ipfilter_program="/sbin/ipf -Fa -f"
ipfilter_rules="/etc/ipf.rules"
ipfilter_flags=""
ipnat_enable="YES"
ipnat_program="/sbin/ipnat -CF -f"
ipnat_rules="/etc/ipnat.rules"
ipnat_flags=""
o creando un pequeño script en /usr/local/etc/rc.d, ejemplo:
#!/bin/sh
ipf -f /etc/ipf.rules
ipnat -CFf /etc/ipnat.rules
No olvide dar permisos de ejecución al script. El servicio ya esta configurado, solo nos queda reiniciar el servidor y configurar los equipos de la red interna para que lo utilicen como gateway hacia el exterior.
Dudas, comentarios y sugerencias son bienvenidos
Alejandro Acosta
acosta@freebsd.org.mx
FreeBSD México 2002