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