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/ |