Última versión: 4 de Septiembre de 2004.
Autor: NicoEchániz
La siguiente guía o HowTo, sirve para configurar una máquina como bridged firewall entre dos zonas de una red y como router para esa red hacia Internet utilizando la mini distribución Bering-uClib.
La guía presupone la disponibilidad de una máquina con Linux instalado para algunos pasos.
Mi situación
Necesito conectar: por un lado mi casa con la red comunitaria, por otro lado mi casa con internet, y por último dar acceso a algunos miembros de la red comunitaria a internet.
Podría hacer esto teniendo en mi firewall 3 placas de red con 3 redes distintas: una para una red local (192.168.x.x), otra para la red comunitaria (10.4.x.x) y otra más conectada a Internet (con IP pública asignada por el cablemodem) y manejar todo por NAT.
Sin embargo, al hacer esto la red de mi casa queda en una red diferente de la red comunitaria y la conección de mis máquinas con otras de la red va a ser menos transparente que si estuvieran en la misma.
La otra opción sería simplemente tener mi red local en la misma red que BuenosAiresLibre; todos al mismo hub por decirlo a lo bruto. Pero esto no me permitiría controlar el tráfico que llega a mi red desde la red comunitaria.
Entonces, la solución es tener un bridge entre ambas redes, que me permite:
tener mi red dentro de la misma red (10.4.x.x) que BuenosAiresLibre
- mantener una comunicación transparente por ser la misma red, pero controlada por la presencia del firewall.
manejar el acceso a Internet por NAT tanto de mis máquinas como de usuarios que lleguen a mí desde BuenosAiresLibre.
Gráfico:
{Red Local}-----------eth1
10.4.x.x |
|--br0--|Firewall|--eth0-------|cablemodem|--{ Internet }
| 10.4.x.x 200.x.x.x
{BuenosAiresLibre}----eth2
10.4.x.x
Creación del diskette booteable
1. Obtener la imagen y copiarla
Bajar la imagen del diskette de Bering-uClibc de:
http://sourceforge.net/project/showfiles.php?group_id=13751
A la fecha de este documento la imagen es:
Bering-uClibc_2.2_img_bering-uclibc-1680.bin
Formatear un diskette y copiar la imagen que bajamos:
# fdformat /dev/fd0u1680 # dd if=Bering-uClibc_2.2_img_bering-uclibc-1680.bin of=/dev/fd0u1680
2. Hacer los cambios necesarios en el diskette antes de bootear
Como el diskette viene con el lugar justo, tenemos que borrar los paquetes que no vamos a usar para hacer lugar para otros (ver http://leaf.sourceforge.net/doc/guide/biaddrm.html).
En mi caso, como uso cablemodem puedo borrar ppp.lrp y pppoe.lrp
# mount -t msdos /dev/fd0u1680 /mnt/temp # rm /mnt/temp/ppp.lrp /mnt/temp/pppoe.lrp
Tenemos que configurar el Bering para que cargue el paquete necesario para el bridge, que no lo carga por default.
Editar el archivo leaf.cfg y agregar "bridge" a los paquetes que se cargan en el inicio (LRP=...). En mi caso la línea queda así (tiene que quedar todo en una misma línea).
LRP="root config etc local modules iptables dhcpcd keyboard shorwall ulogd dnsmasq dropbear sh-httpd weblet bridge"
Si los drivers de nuestras placas de red no vienen en la imagen estándar, tenemos que bajar el archivo de módulos extra para Bering-uClibc del mismo lugar donde bajamos la imagen del disco. El archivo es: Bering-uClibc_2.2.0_modules_2.4.26.tar.gz
Dentro del archivo tar.gz, los drivers para las placas de red están en /2.4.26/kernel/drivers/net/
En mi caso necesito el módulo 3c59x.o que es para placas 3Com.
También es necesario el módulo bridge.o que está dentro del archivo en /2.4.26/kernel/net/
Es el módulo de bridge para el kernel y no viene en la versión estándar de Bering.
El último módulo adicional que necesitamos es ipt_physdev.o, que se encuentra en /2.4.26/kernel/net/ipv4/netfilter/ dentro del archivo de módulos extra.
Copiar al diskette los módulos que bajamos:
# cp 3c59x.o bridge.o ipt_physdev.o /mnt/temp # umount /mnt/temp
3. Copiar los archivos en Bering
Bootear la máquina que vamos a usar de firewall, desde el diskette que acabamos de crear.
Loguearse como root y salir del menú.
El sistema de archivos que vemos desde la consola no es el contenido del diskette, sino un filesystem creado en RAM a partir del diskette, por lo que lo que copiemos desde el diskette al sistema de archivos en realidad se va a estar copiando a la RAM y para que nuestros cambios persistan después deberemos usar la función de backup del menu de configuración de Bering.
Copiar los módulos que bajamos a su lugar en el sistema de archivos y después borrarlos del diskette.
# mount -t msdos /dev/fd0u1680 /mnt # cp /mnt/3c59x.o /lib/modules # cp /mnt/bridge.o /lib/modules # cp /mnt/ipt_physdev.o /lib/modules # rm /mnt/3c59x.o /mnt/bridge.o /mnt/ipt_physdev.o # umount /mnt
4. Habilitar los módulos en la configuración
Abrir el menú de configuración
# lrcfg
En el menu ir a: Packages configuration -> Modules -> modules
En el archivo que se abre (etc/modules) descomentar las líneas de los módulos que acabamos de copiar, que van a ser bridge y los de nuestras placas de red, en mi caso el 3c59x. Para algunas placas es también necesario descomentar mii.
Agregar también una línea para el módulo ipt_physdev. La línea debe decir: ipt_phys. Por prolijidad, se puede ubicar debajo de los demás módulos relacionados con ip_tables.
Grabar (Ctrl-s) y salir (Ctrl-q)
5. Configurar las interfaces de red
Volver al menú principal y entrar en: Network configuration -> interfaces file
eth0 va a ser la interfase que se conecte a Internet. En mi caso, por acceder por cablemodem obtiene su IP por dhcp, así que mantengo la configuración por defecto.
auto eth0 iface eth0 inet dhcp
Las interfaces eth1 y eth2, que van a ser parte del bridge, no tienen que estar declaradas.
Descomentar la configuración del bridge (br0) y asignarle la IP que corresponda. El netmask en el caso de un nodo de BuenosAiresLibre, es 255.255.255.224 (para una subnet de 32 IPs, con 30 útiles).
La configuración del bridge en mi caso queda así:
auto br0
iface br0 inet static
address 10.4.10.3
network 10.4.10.0
netmask 255.255.255.224
broadcast 10.4.10.31
pre-up /sbin/ip link set eth0 up
pre-up /sbin/ip link set eth1 up
pre-up /usr/sbin/brctl addbr br0
pre-up /usr/sbin/brctl addif br0 eth0
pre-up /usr/sbin/brctl addif br0 eth1
bridgeports eth1 eth2Grabar el archivo y salir
6. Completar la configuración de red
Desde el menú principal ir a: Network configuration -> Host IP addresses
En el archivo que se abre (/etc/hosts) ponerle a firewall la IP que le asignamos a br0 (en mi caso 10.4.10.3).
Grabar y salir
En el mismo menú de Network configuration, entrar en: resolv.conf
Otra vez, poner la IP correcta, grabar y salir.
Entrar a: hosts.allow y agregar las redes y hosts que queremos que tengan acceso a esta máquina. Por ejemplo, para dar acceso a todo BuenosAiresLibre (después podemos hilar fino en la configuración de shorewall/ip_tables) dejar sólo la línea:
ALL:10.4.0.0/255.255.0.0
Grabar y salir.
7. Configurar Shorewall
El shorewall se va a encargar de armarnos las reglas de ip_tables a partir de unos cuantos archivos de configuración, que en esta parte pondremos a punto.
Desde el menú principal ir a: Packages configuration -> shorewall
Editaremos varios archivos de este extenso menú.
Primero entrar en zones opción 2.
Agregar una zona llamada bal (BuenosAiresLibre) ó como quieran llamar a la zona de la red comunitaria
Mi archivo /etc/shorewall/zones se ve así:
#ZONE DISPLAY COMMENTS net Net Internet loc Local Local networks bal BALibre BuenosAiresLibre
El segundo archivo que tenemos que editar es interfaces (opción 3).
Mi archivo /etc/shorewall/interfaces se ve así:
#ZONE INTERFACE BROADCAST OPTIONS net eth0 detect dhcp,routefilter,norfc1918 - br0 10.4.10.31 routefilter
Seguimos con hosts (opción 4).
En mi caso queda así:
#ZONE HOST(S) OPTIONS loc br0:eth1 bal br0:eth2
Seguimos con policies (opción 5).
De la configuración estándar, agregar una nueva línea para permitir la salida de la red local hacia la red comunitaria. El acceso de equipos de la red comunitaria hacia la red local y hacia internet se manejará en otro lado (rules), para tener un control pormenorizado.
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc net ACCEPT loc bal ACCEPT net all DROP ULOG all all REJECT ULOG
En masq (opción 8), reemplazar eth1 por br0. Esto va a configurar nuestras reglas para que las redes conectadas a br0 salgan a internet por la interfase eth0 haciendo NAT.
Queda así:
#INTERFACE SUBNET ADDRESS PROTO PORT(S) eth0 br0
Por último, editamos config (opción 14).
Habilitar soporte para bridging.
BRIDGING=Yes
Si queremos dar tratamiento especial a algunos equipos de la red comunitaria, como por ejemplo, permitirles salir a internet, podemos hacerlo editando rules (opción 6). Ver los ejemplos que ahí se dan.
En mi caso quiero dar acceso a internet a gente del edificio donde tengo mi nodo, que está conectada por red cableada y que están en otra red (192.168.x.x). Para esto tengo que ponerles como gateway el nodo, que está configurado para hacer NAT para estas máquinas. En mi Bering tengo que agregar la siguiente regla al shorewall para que deje pasar el tráfico del nodo hacia Internet. Esto también es útil/necesario para poder actualizar por Internet la distribución del nodo.
ACCEPT bal:~00-02-6F-05-43-FA net all
8. Grabar cambios
Como explicamos antes, todos los cambios hechos hasta ahora sólo están en RAM, por lo que es necesario grabarlos al diskette.
Volver al menú principal y elejir la opción Back-up a package.
Hacer backup de etc (4), de modules (6) y de shorewall (10) ó en su defecto de todo (L)
Rebootear y cruzar los dedos
Algunos posibles problemas
1. Si al bootear, leen: "Configuring network interfaces: Operation Failed", es probable que no haya levantado la interface que levanta por DHCP, un error común puede ser que hayamos enchufado al cablemodem la placa equivocada
2. Si al final del proceso de booteo da un error de shorewall diciendo: "No chain/target/match by that name", es porque no está levantando el módulo ipt_phys. Revisar, que haya sido copiado en /lib/modules y declarado en /etc/modules.
Si siguiendo esta guía se encuentran con otros problemas que quieren que se detallen aquí, pueden editar la página y agregarlos o escribirme.
Referencias
Category Guías&HowTos