domingo, mayo 10, 2009

Balanceo de Carga con Dos ADSL y Lenny

(Actualizado para agregar el marcado de paquetes y prevenir la desconexión del msn y demás)

Hola, quién halla llegado a este artículo ya sabe lo que quiere, entonces no me tomaré el tiempo de explicar de que se trata el balanceo de carga de conexiones a internet.
Para nuestro caso contamos con lo siguiente:

  • Debian Lenny AMD64 (igual para i386)
  • Kernel 2.6.26-2-1-amd64
  • Tres tarjetas de red Ethernet
  • Dos conexiones ADSL
  • Switch o AP inalámbrico
  • Cerebro inquieto y paciente
  • Café, mucho café.
Bien, lo primero es describir como está la red y las conexiones, para ello tenemos el siguiente dibujito:


Lo único que hay que tener en cuenta para que esta configuración funcione es quitarle los gateway a todas las interfaces de red, quedando entonces su /etc/network/interfaces sin líneas que digan gateway. En el sentido mas estricto tendríamos que limpiar la tabla main y esas cosas pero en fin, no es necesario y se pueden obviar algunos mensajes de error.

Este es mi /etc/network/interfaces:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback
address 127.0.0.1
netmask 255.0.0.0

# The primary network interface
# LAN
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
auto eth0

# ADSL1
allow-hotplug eth1
iface eth1 inet static
address 10.1.0.2
netmask 255.255.255.0
network 10.1.0.0
broadcast 10.1.0.255
#gateway 10.1.0.1
dns-nameservers 10.1.0.1 10.1.1.1

auto eth1

# ADSL2
iface eth2 inet static
address 10.1.1.2
netmask 255.255.255.0
network 10.1.1.0
broadcast 10.1.1.255
#gateway 10.1.1.1
dns-nameservers 10.1.1.1 10.1.0.1

auto eth2


A continuación dos scripts usados suficientemente comentados, incluyendo el NAT para la red local (compartir internet) y redireccionamiento para proxy transparente (pueden quitarlo si prefieren), estos scripts deben ponerse a correr desde /etc/rc.local o como prefieran, primero el de rutas y luego el de NAT
. Antes de ejecutar los scripts debemos agregar las tablas de rutas al archivo de rutas, esto se hace una sola vez:

echo 200 T1 >> /etc/iproute2/rt_tables
echo 201 T2 >> /etc/iproute2/rt_tables
echo 202 lento >> /etc/iproute2/rt_tables
echo 203 rapido >> /etc/iproute2/rt_tables


#!/bin/bash

IF0="eth0" # Interface conectada a la LAN
IF1="eth1" # Interface conectada a ADSL1 Lenta
IF2="eth2" # Interface conectada a ADSL2 Rápida
IP0="192.168.1.1" # Gateway Local, IP Local
IP1="10.1.0.2" # IP de la IF1
IP2="10.1.1.2" # IP de la IF2
P0_NET="192.168.1.0/24" # Red Local
P1_NET="10.1.0.0/24" # Red para IF1
P2_NET="10.1.1.0/24" # Red para IF2
P1="10.1.0.1" # Gateway para ADSL1
P2="10.1.1.1" # Gateway para ADSL2

# Creo las tablas de rutas para las dos interfaces uplink
echo "Creando las rutas para cada tabla"
ip route add ${P1_NET} dev ${IF1} src ${IP1} table T1
ip route add default via ${P1} table T1
ip route add ${P2_NET} dev ${IF2} src ${IP2} table T2
ip route add default via ${P2} table T2
echo "Hecho."

# Aseguro que cada red enviará sus solicitudes a la ip correcta
echo "Asegurando la ruta para cada interface e IP"
ip route add ${P1_NET} dev ${IF1} src ${IP1}
ip route add ${P2_NET} dev ${IF2} src ${IP2}
echo "Hecho."

# Creo dos reglas para que cada ip se fije a su tabla de rutas
echo "Creando reglas para cada tabla"
ip rule add from ${IP1} table T1
ip rule add from ${IP2} table T2
echo "Hecho."

# Hago el balanceo 1 a 2
echo "Haciendo el balanceo"
ip route add default scope global nexthop via ${P1} dev ${IF1} weight 1 \
nexthop via ${P2} dev ${IF2} weight 2
echo "Hecho."

# Agrego dos tablas de rutas estáticas para hacer marcado de paquetes sobre ellas
echo "Creando tablas para marcado de paquetes ..."
# Enlace lento
ip rule add fwmark 1 table lento
ip route add table lento via ${P1} dev eth1

# Enlace rápido
ip rule add fwmark 2 table rapido
ip route add table rapido via ${P2} dev eth2

echo "Refrescando las rutas"
ip route flush cache
echo "Hecho."

Y bien, noten que el balanceo se hizo de 1 a 2 para que la conexión rápida trabaje el doble de lo que trabaja la lenta, esto depende en si de lo bueno que sea cada isp y del uso que quieran hacer de cada conexión. Noten que se usa fwmark para marcar cada ruta y así poder usar esta marca en el marcado de paquetes. Existen otras técnicas mucho mas pulidas y con mejores resultados que esta, por ejemplo parchando el kernel para rutas dinámicas y cuanta cosa los gurús saben, pero a mi me va funcionando de 10 esta técnica. Así mismo se pueden usar marcas sobre las tablas T1 y T2, pero aquí están separadas por simple claridad.

Si todo está bien tendríamos las siguientes salidas:

edoras:~# ip route
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
10.1.0.0/24 dev eth1 proto kernel scope link src 10.1.0.2
10.1.1.0/24 dev eth2 proto kernel scope link src 10.1.1.2
default
nexthop via 10.1.0.1 dev eth1 weight 1
nexthop via 10.1.1.1 dev eth2 weight 2


edoras:~#
ip route list table T1
10.1.0.0/24 dev eth1 scope link src 10.1.0.2
default via 10.1.0.1 dev eth1

edoras:~#
ip route list table T2
10.1.1.0/24 dev eth2 scope link src 10.1.1.2
default via 10.1.1.1 dev eth2

edoras:~# ip route show table lento
default via 10.1.0.1 dev eth1

edoras:~# ip route show table rapido
default via 10.1.0.1 dev eth1

Con esto ya tenemos nuestras rutas y balanceo, en este punto el equipo que hace de router en el que estamos aplicando estas reglas debería navegar sin problemas. Pero nos falta el NAT para la red local y es aquí donde entra el otro script, noten como se usan las marcas:

#!/bin/bash

echo "Limpiando Reglas Anteriores..."
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t mangle -F

IF0="eth0" # Interface conectada a la LAN
IF1="eth1" # Interface conectada a ADSL1 Lenta
IF2="eth2" # Interface conectada a ADSL2 Rápida
IP0="192.168.1.1" # Gateway Local, IP Local
IP1="10.1.0.2" # IP de la IF1
IP2="10.1.1.2" # IP de la IF2
P0_NET="192.168.1.0/24" # Red Local
P1_NET="10.1.0.0/24" # Red para IF1
P2_NET="10.1.1.0/24" # Red para IF2
P1="10.1.0.1" # Gateway para ADSL1
P2="10.1.1.1" # Gateway para ADSL2

# Ahora hago el NAT

echo "Activando NAT ..."
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s ${P0_NET} -o ${IF1} -j MASQUERADE
iptables -t nat -A POSTROUTING -s ${P0_NET} -o ${IF2} -j MASQUERADE

# Redirecciono al Proxy
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport http -j DNAT --to ${IP0}":8080"
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport 81 -j DNAT --to ${IP0}":8080"
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport 8080:8099 -j DNAT --to ${IP0}":8080"
iptables -t nat -A PREROUTING -i ${IF0} -p tcp --dport 3128:3130 -j DNAT --to ${IP0}":8080"

# Hago marcado de paquetes para asegurar que los paquetes de estos puertos encontrarán el camino de vuelta
echo "Realizando marcado de paquetes ..."
iptables -t mangle -A PREROUTING -i ${IF0} -s ${P0_NET} -p tcp --dport 1863 -m state --state NEW,ESTABLISHED,RELATED -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i ${IF0} -s ${P0_NET} -p tcp --dport 6667 -m state --state NEW,ESTABLISHED,RELATED -j MARK --set-mark 2

echo "Listo."

echo "Reglas Aplicadas"
iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v

El buen observador se habrá dado cuenta que con la tabla mangle se marcan los paquetes que pertenecen a determinados protocolos y que esto le da la posibilidad de definir que servicios quiere a través de que enlace, por ejemplo se podría pensar en mandar el molesto P2P a través del enlace lento (tarea para el lector).

Creo que eso es todo, recuerden que a la primera no funciona, que es bueno que lean algo de LARTC para que aprendan sobre rutas y control de tráfico en Linux y que siempre habrá una forma mas elegante, eficiente y simple de hacer las cosas. También recuerden que pueden añadir un servidor dns local, un proxy transparente y todo lo que quieran a esta configuración.

Si falla, reinicien la red y hagan ip route flush table sobre cada tabla creada. Modifiquen y vuelvan a probar.

Aquí un interesante artículo sobre balanceo de carga manual (Definir varios Gateway), puede servir también de acuerdo a la necesidad.
---

domingo, febrero 15, 2009

Descarga tu Debian Lenny 5 (Actualizado 5.0.1)

Hola, tengo acostumbrados a mis lectores a proporcionarles los links de descarga de Debian, sobre todo en sus releases o cuando testing está lo suficientemente estable. Hoy me siento emocionado de tener disponible debian lenny como estable, aunque desde ya hace tiempo muchos la estábamos usando como testing. Como nota extra, no había visto alguna vez en el sitio de debian que usasen alguna imagen en la portada.

Sin más ni más voy a empezar con las imágenes de DVD para AMD64 que está muy bueno y también para i386.

Imágenes de DVD para AMD64
Imágenes de DVD para i386 (686)

Es suficiente con el DVD 1.

Ahora para los que no cuentan con buen ancho de banda, tenemos las imágenes de CD.

Directorio general para AMD64
Directorio general para i386 (686)

Imágen de CD1 para AMD64 con GNOME
Imágen de CD1 para AMD64 con KDE
Imágen de CD1 para AMD64 con XFCE y LXDE
El infaltable NetInstall AMD64 (Para instalación por red o Internet).

Imágen de CD1 para i386 (686) con GNOME
Imágen de CD1 para i386 (686) con KDE
Imágen de CD1 para i386 (686) con XFCE y LXDE (ideal para maquinas de pocos recursos)
El infaltable NetInstall i386 (Para instalación por red o Internet).

Todas las imágenes de CD1 traen el sistema operativo completamente funcional pero habrá que tirar de otros CD o de los repositorios de Internet para tener el sistema completo como nos gusta.

Un método interesante es usar el NetInstall para instalar un sistema base, luego allí dentro y con la conexión de internet habilitada, además de tener unos respositorios bien armados podemos empezar a instalar solo lo que necesitemos, por ejemplo para una instalación limpia de kde yo pongo instalar el paquete kdebase, pero ten en cuenta que si no tienes algo de experiencia te puede quedar faltando muchas cosas como el IceWeasel (Firefox) o el Amarok para tu música.

No sobra recomendarte y si te sucede como a mi, remover el paqute fam, que en algunos chipset empieza a tirar mucho del procesador, también si no vas a usar correo local puedes quitar el exim4-base, o si no vas a armar una red puedes quitar el nfs-common, en fin vas mirando.

También y para que no des muchas vueltas con algunas compilaciones instala el paquete build-essential, y recuerda que tu kernel es compilado con gcc-4.1 (puedes verlo con cat /proc/version), por tanto tendrás que sobrescribir la variable CC para compilar módulos del kernel como el driver de nvidia ya que el gcc por defecto es 4.3, por ejemplo: CC=gcc-4.1 ./NVIDIA-Linux-x86_64-180.29-pkg2.run como fue mi caso.

Para terminar y como algo un poco mas avanzado les comento que yo uso un sistema un poco hibrido entre stable, testing e inestable, así puedo sacar paquetes muy nuevos sin exponer demaciado mi sistema, OpenOffice.org 3 y otros pocos, aunque a veces los cambios son muy grandes y no conviene. Para ello hago apt-pinning, por tanto les dejo mi sources.list y mi preferences para que se sirvan si lo desean, haaa, también pueden usar solo lenny si no quieren correr algún riesgo.

/etc/apt/sources.list

# Repositorio Oficial Estable
deb http://ftp.fi.debian.org/debian/ lenny main contrib non-free
deb-src http://ftp.fi.debian.org/debian/ lenny main contrib non-free

# Repositorio Oficial Testing
deb http://ftp.fi.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.fi.debian.org/debian/ testing main contrib non-free

# Repositorio Oficial Inestable
deb http://ftp.fi.debian.org/debian/ sid main contrib non-free
deb-src http://ftp.fi.debian.org/debian/ sid main contrib non-free

# Repositorio Multimedia
deb http://www.debian-multimedia.org/ lenny main

# Repositorio de Seguridad
deb http://security.debian.org/ lenny/updates main contrib
deb-src http://security.debian.org/ lenny/updates main contrib

--------------------------------------------------------------------------------------
/etc/apt/preferences

Package: *
Pin: release a=stable
Pin-Priority: 700

Package: *
Pin: release a=testing
Pin-Priority: 600

Package: *
Pin: release a=unstable
Pin-Priority: 500

Para instalar algo de testing o unstable solo hay que hacer apt-get -t unstable install vlc, o como método mas claro puedes usar apt-cache policy vlc, ver las versiones disponibles, a que repositorio pertenece y hacer apt-get install vlc=0.9.8-1 así lo sacan de donde deseen también, no debemos preocuparnos por las dependencias ya que estas se resolverán de stable si es posible. Sin embargo y para algunos casos como el de vlc es mejor poner el repo multimedia en sid mientras instalas vlc, luego lo vuelves a dejar en lenny (simples trucos).

Recomendaciones, sugerencias y adiciones son bienvenidas.

Disfrutalo.

miércoles, diciembre 17, 2008

Virtualbox 2.1 y OpenGL

Muchos estábamos esperando esto:



Todo se hizo en un host Debian Sid con CPU AMD X2 5600, 2gb de RAM, vídeo Nvidia GeForce 8200.

El consumo de CPU oscila entre el 80% y 100%, 80% si se deja quieta la aplicación GL y 100% si la mueves. Es de agregar que se estaban corriendo otras tantas aplicaciones mas como Iceweasel, konqueror, aMSN, konsole, Amarok y obviamente gtk-recordmydesktop.

En general el rendimiento fue bueno, incluso cuando se cargó Chromium en el host que como ven usa el 3D, todo se movió muy fluido.

Recientes pruebas hechas por bogslibunny en su máquina demuestran el estado de desarrollo de este soporte, se pudo correr quake1 sobre OpenGL, quake2 con engines de OpenGL y efectos modernos como bloom. Afirma también que la implementación no está del todo completa pero lo que hay es mucho y funciona bien ya que se probó con GL Excess 1.2 y el benchmaker arroja los mismos resultados virtualizado y real.

Parece que para poder probar el soporte en guest Linux habrá que esperar un poco mas, pero se está trabajando en ello, seguramente para la siguiente versión lo tendremos. Por lo menos por ahora hay futuro para aquellos que no han podido migrar de windows a Linux por falta de aceleración 3D.