Autor: Koji
Fecha: 08/07/2001

NAT en FreeBSD

1. Introducción
2. Primeros preparativos
3.
NAT a nivel de aplicación
4. NAT a nivel de interface
5. Configuración de los clientes
6. Mas información

 

1. Introducción

Este pequeño articulo explicará de una manera fácil y rápida el procedimiento para compartir la conexión a Internet con otros ordenadores (Windows, Linux, *BSD, etc) usando nuestro FreeBSD como servidor, o en este caso como gateway y de una manera totalmente transparente para los clientes.

Para ello usaremos NAT, Network Address Translation (Traducción de direcciones de red).


Website templates are pre-designed websites all you need to do is add your own personal content and you're ready to jump start your own website. Website templates by Vooweb

Como veis hemos dividido el doc en 6 apartados para hacerlo mas entretenido y mas comprensible.
* El punto 1 explica ... lo que estáis leyendo ahora ;-)
* El punto 2 ya entra en la configuración de nuestro FreeBSD, pero los cambios que aquí hagamos serán validos tanto si hacemos NAT a nivel de interface como si hacemos NAT a nivel de aplicación
* El punto 3 abarcará el NAT a nivel de aplicación. Sin duda para mi es la mejor opción si tenemos un PC casero con un modem, aunque si preferimos hacerlo via interface también valdrá
* El punto 4, tratará sobre NAT a nivel de interface. Quizá esta es la mejor opción para redes complejas con firewall y que usan tipos de conexión a Internet que no están basadas en modem
* El punto 5, abarcara la configuración de los ordenadores clientes para establecer como gateway a nuestro FreeBSD. Explicaremos por encima el procedimiento para Windows 9X, *BSD y Linux.
* El punto 6, explica donde encontrar mas información sobre todo lo que se explica en este doc

vamos allá :-)

 

2. Primeros preparativos

Como hemos comentado anteriormente, lo que aquí se explica se ha de hacer tanto si hacemos NAT a nivel de aplicación como a nivel interface.

Primeramente debemos dotar a nuestro FreeBSD de gateway o puerta de enlace ya que va a ser el que 'sirva' al resto de clientes de la red como gateway.
Para dotar a FreeBSD de esto tenemos que poner la linea gateway_enable="YES" en nuestro /etc/rc.conf. Esta línea es la referencia para que los archivos de inicio puedan ejecutar el comando sysctl -w net.inet.ip.forwarding=1. Este comando activa el ip forwading el cual nos permitirá convertir nuestro FreeBSD en un gateway. Para aquellos interesados en saber en que script de inicio se ejecuta tal comando que revisen el archivo /etc/rc.network.
Si hemos tocado el archivo /etc/rc.conf los cambios no se activarán hasta iniciar de nuevo la maquina, así que si os parece, lo mas cómodo es establecer el /etc/rc.conf con la variable que hemos indicado anteriormente, y hacer uso del comando sysctl para ya disponer del ip forwading sin tener que reiniciar

3. NAT a nivel de aplicación

Este tipo de NAT lo haremos junto con PPP. El mecanismo es sencillo, tan solo hemos de pasar el parámetro -nat al lanzar el programa ppp como de costumbre y con sus parámetros que poníamos anteriormente.

ej: ppp -nat -background inet  ('inet' es el nombre de nuestra etiqueta en el ppp.conf, cámbiala por la que tu tengas definida)

Eso es todo, a partir de ese momento nuestro FreeBSD hará NAT con el resto de clientes. Fácil verdad? :-)

NOTA: En versiones antiguas de FreeBSD (<=3.x) se usaba el parámetro -alias. Si por casualidad al usar -nat te da algún tipo de error de opción no reconocida usa el -alias


4. NAT a nivel de interface

Si deseamos usar NAT en alguna interface (ed0, tun0, etc.) el procedimiento es algo mas largo.
Primeramente debemos compilar nuestro FreeBSD para que soporte firewall, en este caso ipfw (IP Firewall). La verdad es que las ultimas versiones de FreeBSD (>=4.x) ya traen un modulo compilado para el uso de ipfw, pero por desgracia no viene activado con IPDIVERT, así que la única solución será compilar un nuevo kernel. Para ello deberéis compilar un kernel con las siguientes opciones:

options IPFIREWALL
options IPDIVERT

Una vez compilado el kernel con estas opciones, haremos uso del programa natd y de unas reglas que ahora pondremos:

/sbin/ipfw -f flush
/sbin/ipfw add divert natd all from any to any via <interface>  
(Cambiad <interface> por el interface que tengáis para salir a internet, ed0, tun0, etc.)
/sbin/ipfw add pass all from any to any

Y ahora pondremos en marcha el natd:

natd -interface <interface>   (Cambiad <interface> por el interface que tengáis para salir a internet, ed0, tun0, etc.)

Y eso es todo. Las reglas obviamente activan el 'divert' para el interface que le indiquemos, y el programa natd será el encargado de estar a la escucha en el interface indicado para ir 'traduciendo' la información que le llega desde internet y desde los ordenadores clientes.

Todo esto es únicamente lo que necesitamos para hacer este tipo de NAT, pero como podéis ver, el tener que teclear todas estas reglas y demás cada vez que iniciemos nuestro FreeBSD lo hacen una tarea pesada. Para hacerlo mas cómodo usaremos los scripts de inicio. Primeramente tocaremos el archivo /etc/rc.conf:

firewall_enable="YES"
firewall_type="/etc/firewall.rules"
firewall_logging="YES"
firewall_script="/etc/rc.firewall"
natd_enable="YES"
natd_interface="ed0"

Intentad colocar las líneas con este orden, a mi me ha funcionado bien. Quizá lo mas importante a comentar sea la segunda línea, que especifica el archivo donde estarán ubicadas las anteriores reglas que habíamos tecleado a mano, y la ultima línea que especifica el interface del programa natd. Cambia ed0 por el que te corresponda. Las restantes activan el firewall y el programa natd

Una vez hechos estos cambios en /etc/rc.conf crearemos el archivo /etc/firewall.rules para poner las anteriores reglas del ipfw. Quedaría algo así:

-f flush
add divert natd all from any to any via <interface>  
(Cambiad <interface> por el interface que tengáis para salir a internet, ed0, tun0, etc.)
add pass all from any to any

Y guardamos el archivo.
Ahora cada vez que reiniciemos nuestro FreeBSD todo será automático y no nos tendremos que preocupar de activar natd ni agregar ninguna regla ipfw

Antes de acabar este apartado me gustaría comentar una cosa para todos aquellos que estéis usando modem con PPP (interface tun0) y estéis probando este procedimiento.
Ya que nosotros usamos PPP para conectar a internet, no podemos hacer uso de estos scripts de inicio para que todo sea automático. La IP de internet solo
la tenemos después de ejecutar PPP y por lo tanto las reglas de ipfw y la activación de natd *SOLO* funcionarán si ya hemos arrancado PPP y disponemos de una IP previamente. Soluciones?

Para empezar modificar ligeramente nuestro /etc/rc.conf y colocar solo las opciones siguientes:

firewall_enable="YES"
firewall_type="quot;
firewall_logging="YES"
firewall_script="/etc/rc.firewall"

Y ahora nos hacemos la pregunta .. como activamos las reglas ipfw automaticamente? Una de las opciones seria hacer uso del archivo ppp.linkup. Este archivo esta destinado a ejecutar lo que nosotros queramos justamente después de establecerse la conexión PPP. Por lo tanto nos viene muy bien.
Solo necesitamos crear el archivo /etc/ppp/ppp.linkup y poner lo siguiente:

inet:

 !bg /sbin/ipfw -f flush
 !bg /sbin/ipfw add divert natd all from any to any via tun0
 !bg /sbin/ipfw add pass all from any to any
 !bg natd -interface tun0

Aseguraos sobre todo de respetar los espacios, enters, enters dobles, y sangrado. Es decir, debería de estar el archivo tal como veis este texto, sino posiblemente os dará algún error de script failed. También aseguraos de substituir inet: por la etiqueta que uséis vosotros en vuestro /etc/ppp/ppp.conf para conectar a internet. Y finalmente el interface tun0 si de diera el caso de que usáis otro.

Y creo que eso es todo ;-) ahora tras ejecutar PPP y establecerse la conexión, el archivo que hemos creado (/etc/ppp/ppp.linkup) se encargará de establecer las reglas ipfw


5. Configuración de los clientes

Ahora que ya tenemos el servidor FreeBSD activado para hacer NAT solo nos queda configurar los clientes, así que los separaremos para que este mas ordenado:

* CASO WINDOWS 9X *
En el caso de Windows especificaremos la IP de nuestro FreeBSD en el icono red, propiedades tcpip de nuestra targeta, pestaña puerta de enlace.
Tampoco deberíamos de olvidarnos de configurar los DNS. Para ello en el mismo lado pero pestaña DNS. Aquí pondremos las DNS que usemos normalmente para Internet, y para que nuestro Windows sea capaz de resolverlas.

 * CASO FreeBSD *
Solo deberemos establecer la variable defaultrouter="IP GATEWAY" poniendo la IP de nuestro FreeBSD que hace NAT en el archivo /etc/rc.conf
Ahora solo nos quedara reiniciar para activar los cambios. Si no queremos reiniciar podemos añadir el comando siguiente:

route add default IP_GATEWAY   (Cambiando IP_GATEWAY por la IP del server que hace NAT)

* CASOSD y NetBSD *
En estos dos BSD solo deberemos colocar la IP de nuestro gateway en el archivo /etc/mygate y reiniciar para hacer efectivos los cambios. Si no deseamos reiniciar podemos usar el mismo comando que hemos explicado en FreeBSD:

route add default IP_GATEWAY    (Cambiando IP_GATEWAY por la IP del server que hace NAT)

* CASO LINUX *

En el caso de linux puede variar segun la distribución, lo que si podemos asegurar que este comando activa la ruta hacia el gateway:

route add default gw IP_GATEWAY  (Cambiando IP_GATEWAY por la IP del server que hace NAT)

Mirar la documentación de vuestro linux para hacer efectivos los cambios cada vez que se inicie vuestro Linux

Para acabar, y si estáis configurando cualquier *BSD o Linux como cliente, no os olvideis de tocar el archivo /etc/resolv.conf para establecer los servidores de nombres.


6. Mas información

Compilación del kernel: FAQ y Handbook de FreeBSD
NAT: man natd
Rutas: man route
Otras variables: /etc/defaults/rc.conf
ipfw: man ipfw
Configuración PPP: /usr/share/examples/ppp

Para terminal decir, que para cualquier comentario, error o cualquier otra cosa podéis escribirme a koji

eldemonio.org El site BSD en Castellano Articles catalogue

Website templates are pre-designed websites all you need to do is add your own personal content and you're ready to jump start your own website. Website templates by Vooweb

eldemonio.org v 4_2