Mi propio logo para Linux Bridge!

Linux Ethernet Bridge

Guía de instalación
por Eduardo Béjar

Última actualización: Nov 8, 2002

 

Introducción
Luego de mi experiencia instalando un servidor Linux para que sea bridge y a la vez firewall decidí escribir esta guía de cómo instalar un servidor de este tipo, debido a que no existe aparentemente un sitio que describa paso a paso el proceso para hacerlo. En mi caso tuve que revisar varios sitios y después de leer cada uno de ellos, algún detalle adicional se añadía. Espero que esta pequeña guía sirva para que cualquier interesado lo pueda hacer y sobreviva para contarlo =).

¿Qué es un bridge?
Antes que nada, partamos describiendo un poco qué es un bridge (claro si ya lo sabes, no leas esta parte y avanza a la siguiente). Un bridge, tal como sonaría su traducción, es un puente que te sirve para unir dos o más interfaces de red (tarjetas de red - NICs) para que el tráfico fluya entre ellas de manera libre y en forma transparente. Es decir, una vez configurada una PC como bridge, la puedes conectar en tu LAN tal cual como si se tratara de un hub/switch. Las PCs que estén detrás del bridge no "verán" el bridge y su tráfico fluirá libremente y los paquetes pasarán de un lado al otro en forma transparente.

¿Para qué me sirve un bridge?
Te preguntarás "si solo hace eso, ¿por qué no usar un hub/switch?". La diferencia está en que con un bridge puedes agregar las funcionalidades adicionales que te brinda linux, como ruteo de paquetes, firewall, políticas de protocolo, nat, etc.; lo cual puede extender la funcionalidad de tu red sin alterar mayormente la configuración en cada terminal.

Por ejemplo: Si tienes una red con 20 terminales y que cada vez va creciendo, tienes tres formas de protegerla a través de un firewall:

1. Incluir un firewall entre tu LAN e Internet, reconfigurando las rutas y gateways en todas las terminales o en los servidores que les den acceso a estas.

2. Incluir un firewall en cada una de las terminales (que no es muy práctico).

3. Incluir un bridge firewall entre tu LAN e Internet, sin reconfigurar las rutas ni gateways en todas las terminales.

En mi caso, la mejor opción fue la tercera, con un bridge que realice filtraje de paquetes a través de reglas de firewall creadas con iptables. Más aún, la seguridad de la integridad del firewall mejorará notablemente ya que al tratarse de un bridge, carece de dirección IP (a no ser que explícitamente la definas), y por tanto es menos probable que sea vulnerable a algún tipo de ataque (¿Cómo atacas algo que no ves?).

Suena interesante! ¿Cómo lo hago?
Si a estas alturas ya tienes claro que lo que necesitas para eso que quieres hacer es un bridge, pues a continuación encontrarás paso a paso cómo realizar esta tarea.

Características de hardware.
Obviamente, mientras más poderosa la PC que destines para el bridge, mejor; pero en teoría si la PC solo realizará esta función, bastaría con alguna Pentium vaga que tengas por allí. En mi caso, la instalación la realicé en una Pentium MMX 166Mhz, 32 Mb de RAM, 2 Gb de disco duro, 2 tarjetas de red, y el resto lo básico.

Características de software.
En teoría, esta instalación la podrías realizar en cualquier distribución de Linux, porque lo que vas a configurar es el kernel. En mi caso, utilicé RedHat 7.1, que era el que tenía a la mano.

Características de network.
He leido que hay ciertas tarjetas de red con las que se han reportado problemas en la operación debido a los drivers que utilizan, pero todavía no me ha pasado nada. Si sucede algo, lo detallaré aquí. En mi caso, usé una Realtek PCI y una SIS 900, con los drivers 8139too y ne respectivamente.

[Actualización: Tuve que cambiar la tarjeta SIS900 por una NE2000, pues comencé a experimentar pings elevados con la SIS. Ahora funciona perfecto con una Realtek PCI y una NE2000 que usa el módulo ne2k-pci. Conclusión: Si no te funciona bien el bridge, trata con otras NICs para descartar esa opción; mejor aún si utilizas dos tarjetas que usen el mismo driver.]


Actitud.
Si nunca has compilado un kernel, ten en cuenta que debes tener paciencia, pues si olvidaste algo, o no te funciona algo bien, probablemente tendrás que recompilar nuevamente. Este proceso, si lo haces en una PC lenta, tomará más tiempo en ejecutar; en la humilde Pentium MMX que utilicé, tomó alrededor de 1h30 cada compilada (claro, hice varias, pero precisamente estoy escribiendo esto para que no tengas que recompilar varias veces ;-)).

Pasos.
1. Asegúrate que tu PC tiene una versión de kernel que podrás preparar para bridge. En mi caso, la PC tenía kernel 2.4.2, por lo que tuve que descargar el último kernel estable para parcharlo y compilarlo. Al momento de escribir esto, es el 2.4.19.

2. Una vez descargado en nuevo kernel, desempaquétalo y cópialo en el directorio

/usr/src/

3. Descarga el parche para que tu kernel haga bridge. El parche lo
encontrarás en


http://bridge.sourceforge.net/download.html


Escoge el parche de acuerdo a la versión de kernel que hayas descargado.

4. Una vez descargado el parche, cópialo en el mismo directorio donde están
los archivos del kernel. En mi caso:


/usr/src/linux-2.4.19

5. Ingresa al directorio /usr/src/linux-2.4.19 y ejecuta:

patch -p1 < bridge-nf-0.0.7-against-2.4.19.diff

Obviamente si tu archivo de parche tiene otro nombre, deberás colocar el
nombre del parche tal como es.

6. Ingresa al directorio

/usr/src/linux-2.4.19

(claro, si es otra version el directorio se llamara diferente) y ejecuta:

make menuconfig

Si cargaste el modo gráfico, tendrás que ejecutar en vez de menuconfig,
xconfig.

make xconfig

Verás que se abre un menú con opciones para configurar. Si luego de tipear 'make xconfig' te aparece este error:

make: *** No hay ninguna regla para construir el objetivo 'xconfig'. Alto

significa que no ejecutaste 'make xconfig' desde el directorio donde está el
código del kernel. Si es así, deberás entrar a /usr/src/linux-2.4.19 y
ejecutar nuevamente 'make xconfig'

7. Dentro de las opciones de configuracion del kernel deberás seleccionar las opciones necesarias de acuerdo al modelo y hardware que tienes. Revisa todas las opciones y ajústalas de acuerdo a tu PC.

Respecto al bridge, deberás prestar atención a las siguientes opciones y seleccionarlas de esta forma:

Code maturity level options
    -Prompt for development and/or incomplete code/drivers = Y


Loadable module support
    -Enable loadable module support = Y
    -Set version information on all module symbols = Y
    -Kernel module loader = Y


Networking options
    -Network packet filtering (replaces ipchains) = Y
    -Network packet filtering debugging = N (Si le pones Y a esta opción, cuando la PC haga bridge verás que tu pantalla comenzará a mostrar mensajes
interminables sobre la actividad del bridge y los paquetes que está recibiendo y enviando. Es un poco fastidioso, pero si quieres ver lo que hace tu bridge, pon Y.)


Si tu PC a más de bridge va a hacer firewall, asegúrate también de seleccionar las opciones necesarias para firewall (iptables, routing, etc.)


    -IP: Netfilter Configuration
        Dentro de esta sección escoge lo que necesites y actívalo como módulo.


    -802.1d Ethernet Bridging = Y


    -netfilter (firewalling) support = Y (Esta opción solo te aparecerá si parchaste bien el kernel. Si no aparece, vuelve a ejecutar el paso 5).

No olvides tampoco escoger como módulos los drivers necesarios para tus tarjetas de red en la sección Network Device Support.

Listo. Escoge 'Save and Exit'.

8. Compila el kernel:

make dep
make clean
make bzImage
make modules
make modules_install
cp /usr/src/linux-2.4.19/arch/i386/boot/bzImage /boot/vmlinuz-2.4.19
cp /usr/src/linux-2.4.19/System.map /boot/System.map-2.4.19
cd /boot
rm /boot/vmlinuz
rm /boot/System.map
ln -s /boot/System.map-2.4.19 /boot/System.map
ln -s /boot/vmlinuz-2.4.19 /boot/vmlinuz

Edita lilo.conf y añade el nuevo kernel. Finalmente ejecuta:


/sbin/lilo

Si no obtuviste ningún error en la compilación del kernel, podrás rebootear tu PC y cargar el nuevo kernel que ya estará listo para hacer bridge.

9. Una vez que cargaste el nuevo kernel, tipea lo siguiente:

dmesg | grep -i bridge

Si recibes como resultado de este comando esto:


NET4: Ethernet Bridge 008 for NET4.0

significa que tu kernel ya está listo para bridge. Si no te muestra ningún resultado, revisa si no se te escapó nada y de ser necesario repite el proceso.

10. Si ya tienes listo el kernel para bridge, instala el paquete de utilidades de bridge. Descarga bridge-utils desde:

http://bridge.sourceforge.net/download.html.

11. Una vez instalado bridge-utils, podrás ejecutar el comando:

brctl

Si te sale algún error como "Package not installed" significa que algo falló en la preparación del kernel o no instalaste bien el paquete bridge-utils. Revisa y si es necesario recompila.

12. Si te funciona bien el comando brctl, entonces ahora podrás configurar el bridge. En mi caso, mi PC tiene 2 tarjetas ethernet, por lo que esta configuración es válida para este esquema (en caso de tener más tarjetas ethernet, deberás añadir cada una de las interfaces a las reglas):

brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ifconfig eth0 0.0.0.0 promisc
ifconfig eth1 0.0.0.0 promisc
ifconfig br0 up

Estos comandos lo que hicieron fue:
- Definir el bridge con el nombre 'br0' (puedes ponerle cualquier nombre, no
necesariamente este)
- Añadir eth0 al bridge
- Añadir eth1 al bridge
- Quitar dirección IP de eth0 para que el bridge sea transparente y setear
eth0 en modo promiscuo
- Quitar dirección IP de eth1 para que el bridge sea transparente y setear
eth1 en modo promiscuo
- Levantar el bridge

Luego de esto si tipeas

ifconfig

verás como interfaces

br0
eth0
eth1
lo

ninguna de ellas con direccion IP.

13. Conecta tu bridge en la LAN y prueba. Si va a actuar como firewall
transparente, coloca el bridge entre Internet y tu LAN. Esto es:

LAN----Bridge----Internet

Prueba realizando ping desde la LAN a Internet. Si no recibes respuesta o si recibes tiempos agotados, chequea que el cableado esté bien y que los cables estén bien configurados. Utiliza el comando tcpdump para ver qué está sucediendo en las interfaces (si activaste la opción de debugging en la compilación, la actividad de las interfaces aparecerá en pantalla sin que tipees nigún comando).

tcpdump -i br0

14. Si tu bridge va a ser firewall tambien, configura las reglas iptables
utilizando la cadena FORWARD. Pronto incluiré las reglas que utilicé para mi caso como referencia.

(Actualización: Ejemplos de reglas de firewall más abajo)

15. En teoría a estas alturas todo debería estar funcionando y tu bridge debería estar operando normalmente. Continúa probando hasta satisfacer tu requerimiento. Si no tienes resultados y necesitas ver que está sucediendo en las interfaces, utiliza tcdump.

Ayuda.
Si tienes alguna pregunta específica y ya probaste todo lo necesario, suscríbete a la lista del proyecto desde este sitio:

http://www.math.leidenuniv.nl/mailman/listinfo/bridge

O enviando un email a bridge@math.leidenuniv.nl

Estaremos gustosos de ayudarte.

Otros links interesantes para consulta sobre este tema son:

http://bridge.sourceforge.net/
http://www.math.leidenuniv.nl/pipermail/bridge/

Una guía sobre cómo compilar el kernel encontrarás aquí:

http://www.linuxlookup.com/html/guides/kernel.html

Exitos!

Reglas de Firewall (iptables)

Ya tienes funcionando el bridge y quieres definir reglas de firewall con iptables para proteger tu red. Básicamente el formato es exactamente el mismo que utiliza iptables para cualquier otro caso. Por ejemplo:

Supongamos que tienes esta configuración:

[server]--[bridge]--[internet]

El server tiene la IP 76.76.76.76. Funciona como mail server (recibe emails y los envía). Quieres conseguir que:

- nadie pueda ingresar al server desde internet mediante telnet
- únicamente se encuentren abiertos los puertos necesarios para su funcionamiento (que reciba emails)
- ningún paquete de ping le llegue
- deseas que el server navegue normalmente y haga sus actividades normales.

Para este caso tendríamos las siguientes reglas:

#!/bin/sh

#Borrar cualquier regla existente previamente:

iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT

#Cualquier paquete que llegue desde cualquier IP (0/0) con
#destino nuestro server (76.76.76.76) y que sea de telnet
#(puerto 22), Descartarlo

iptables -A FORWARD -p tcp -s 0/0 -d 76.76.76.76/32 --destination-port 22 -j DROP

#Cualquier paquete que llegue desde cualquier IP (0/0) con
#destino nuestro server (76.76.76.76) y que sea de ping (icmp)
#Descartarlo

iptables -A FORWARD -p icmp -s 0/0 -d 76.76.76.76/32 -j DROP

#Cualquier paquete que llegue desde cualquier IP (0/0) y que
#sea email entrante al mail server (puerto 25), Aceptarlo

iptables -A FORWARD -p tcp -s 0/0 -d 76.76.76.76/32 --destination-port 25 -j ACCEPT

#Cualquier paquete que llegue como respuesta a un paquete originado
#detrás del bridge, aceptarlo (de esta forma se permite la navegación
#normal o cualquier otra actividad originada desde el server)

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#Finalmente, cualquier paquete que llegue y que no encaje en las
#reglas anteriores,  Descartarlo

iptables -A FORWARD -j DROP


Para más detalles sobre las opciones que te ofrece iptables puedes consultar el manual (man iptables) o revisar el extenso tutorial disponible en http://www.netfilter.org/