Ú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:

  1. tener mi red dentro de la misma red (10.4.x.x) que BuenosAiresLibre

  2. mantener una comunicación transparente por ser la misma red, pero controlada por la presencia del firewall.
  3. 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 eth2

Grabar 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

Wiki: GuíaBridgedFirewall (last edited 2008-09-28 09:18:03 by localhost)

USLA