balancing y failover

20 de enero de 2010

Tengo hasta 5 conexiones de salida a Internet, entre caudales garantizados, ADSL, SDSL, etc.
La idea es centralizar todas estas salidas bajo un único gateway de forma que podamos hacer balanceo de carga y failover. Con el balanceo de carga conseguimos que unas peticiones vayan por una línea y otras por otra de forma automática y transparente para el usuario. Con el failover conseguimos que en caso de caída de una conexión de salida, todo el tráfico continuará saliendo por otra conexión.
Hay que tener presente que esta solución no hace una suma de anchos de banda, simplemente reparte las peticiones sobre una u otra conexión.

En el siguiente ejemplo utilizaremos dos conexiones a Internet ADSL, las dos de 6Mb. Utilizaremos una maquina Linux con tres interfaces Ethernet. Una conectada a una ADSL, otra conectada a otra ADSL y por último una interfaz conectada a nuestra red interna. Esta máquina hará de gateway de todos nuestros usuarios de la red interna.

En vez de utilizar una ruta por defecto, configuraremos una ruta por defecto que es multicamino o "multi-path route". Por defecto el kernel equilibrará las rutas sobre los dos posibles proveedores.


Para realizar balanceo utilizaremos iproute y para realizar el failover utilizaremos el siguiente script gwping que es un daemon (escrito en bash) que lo que hace es comprobar cada cierto tiempo el estado de la línea. Si la línea cae automáticamente realiza el switch. Cuando las dos líneas están activas continua haciendo el balancing.

Lo primero que hacemos es añadir estas instrucciones dentro de nuestro /etc/rc.local:

# activamos el forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# le decimos que todos los paquetes que vienen por una ADSL vuelven por la misma.
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.10 table ADSL1
ip route add default via 192.168.1.1 table ADSL1
ip route add 192.168.0.0/24 dev eth1 src 192.168.0.10 table ADSL2
ip route add default via 192.168.0.1 table ADSL2
ip rule add from 192.168.1.10 table ADSL1
ip rule add from 192.168.0.10 table ADSL2

# la carga se reparte (equitativamente) por diferentes gateway.
ip route add default scope global nexthop via 192.168.1.1 dev eth0 weight 1 
   nexthop via 192.168.0.1 dev eth1 weight 1

# activamos el nat en el gateway
iptables -F
iptables -t nat -F
iptables --delete-chain
iptables -t nat --delete-chain
iptables -t nat -A POSTROUTING --out-interface eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE
iptables -A INPUT -p ICMP -j ACCEPT
iptables -A INPUT -p TCP -m state --state RELATED -j ACCEPT
iptables -A FORWARD --in-interface eth2 -j ACCEPT

nohup /usr/sbin/gwping &
Observar como se utiliza el parámetro “weight” para decir que las dos adsl tienen la misma importancia. Tienen la misma velocidad. Si tuviéramos una ADSL 4 veces más rápida que otra pondríamos algo como:
ip route add default scope global nexthop via 192.168.1.1 dev eth0 weight 1 
   nexthop via 192.168.0.1 dev eth1 weight 4
El siguiente paso es añadir las tablas ADSL1 y ADSL2 dentro del iproute. Para ello editamos el /etc/iptables2/rt_tables:
root@failover:~# cat /etc/iproute2/rt_tables 
255     local
254     main
253     default
0       unspec
1 ADSL1
2 ADSL2
Ahora copiamos nuestro script gwping a /usr/sbin y le damos permisos de ejecución:
# chmod 755 /usr/sbin/gwping
Si editamos el script gwping podemos configurar los primeros parámetros para ajustarlos a nuestra configuración.

+ EXTIF1 y EXTIF: nombre de la interfaces externas
+ IP1 e IP2: IP de las interfaces
+GW1 y GW2: IP de las ADSLs
+ W1 y W2: peso de cada una de las ADSLs
+ NAME1 y NAME2: nombre de las ADSLs

Una vez reiniciada la maquina debería correr en fondo el daemon gwping (ps –xa | grep gwping). Para comprobar que todo está funcionando debería crearse un fichero de log llamado /var/log/failover donde es posible comprobar como se va realizando el switch entre las ADSLs:
root@failover:/var/log# tail -f failover 
Ping status changed for ADSL2 from 1 to 0
Uptime status will be changed for ADSL1 from 1
Uptime status will be changed for ADSL2 from 1
Restoring default load balancing
ADSL2 Down
Ping status changed for ADSL2 from 0 to 1
Uptime status will be changed for ADSL2 from 0
Ping status changed for ADSL2 from 1 to 0
Uptime status will be changed for ADSL2 from 1
Restoring default load balancing
ADSL1 Down
Ping status changed for ADSL1 from 0 to 1
Uptime status will be changed for ADSL1 from 0
Switching to ADSL2
ADSL1 Down
ADSL1 Down
Ping status changed for ADSL1 from 1 to 0
Uptime status will be changed for ADSL1 from 1
Restoring default load balancing
ADSL1 Down
Para comprobar que todo funciona podéis hacer diferentes consultas desde diferentes usuarios de la red interna a paginas web como http://www.whatismyip.com y comprobar vosotros mismos como se obtienen IPs diferentes dependiendo de si la petición HTTP ha ido por una ADSL u otra.

Más información:
+ Routing por diferentes proveedores
+ Linux Advanced Routing & Traffic Control HOWTO

squid y mrtg

16 de enero de 2010

El proxy de Squid nos permite generar gráficas desde cualquier aplicación o cliente SNMP. Para ello simplemente debemos activar el servicio de SNMP en el Squid y comenzar a realizar consultas para saber que carga o uso tiene.
Para ello editamos el /etc/squid/squid.conf y añadimos las siguientes líneas:

# creamos una acl donde le decimos el nombre de la comunidad SNMP que utilizamos
acl snmppublic snmp_community public
# por defecto utilizaremos el puerto 3401/UDP para las consultas
snmp_port 3401
# aplicamos la ACL para que solo la maquina local pueda realizar consultas
snmp_access allow snmppublic localhost
snmp_access deny all
Una vez configurado hacemos un reload de la config:
# /etc/init.d/squid reload
Ahora probamos con el comando snmpwalk si tenemos acceso al servicio SNMP de Squid:
# snmpwalk –c public -v 1 localhost:3401 .1.3.6.1.4.1.3495.1.1                            
SNMPv2-SMI::enterprises.3495.1.1.1.0 = INTEGER: 65552
SNMPv2-SMI::enterprises.3495.1.1.2.0 = INTEGER: 6288060
SNMPv2-SMI::enterprises.3495.1.1.3.0 = Timeticks: (129933578) 15 days, 0:55:35.78
Instalamos la herramienta de MRTG (Multi Router Traffic Grapher) que nos permitirá realizar gráficos del uso de Squid. MRTG generará una página Web cada 5 minutos con los datos. Para ello necesitaremos tener también Apache:
# apt-get install mrtg apache
Creamos el fichero de configuración del MRTG para generar dos tipos de gráficos diferentes:
ImageDir: /var/www/mrtg-squid
Workdir: /var/www/mrtg-squid
LoadMIBS: /etc/squid/mib.txt

Target[proxy-hit]: cacheHttpHits&cacheServerRequests:public@127.0.0.1:3401
MaxBytes[proxy-hit]: 100000
Title[proxy-hit]: HTTP Hits
PageTop[proxy-hit]: <H2>proxy Cache Statistics: HTTP Hits/Requests</H2>
Suppress[proxy-hit]: y
LegendI[proxy-hit]:  HTTP hits
LegendO[proxy-hit]:  HTTP requests
Legend1[proxy-hit]:  HTTP hits
Legend2[proxy-hit]:  HTTP requests
YLegend[proxy-hit]: perminute
ShortLegend[proxy-hit]: req/min
Options[proxy-hit]: nopercent, perminute, dorelpercent, unknaszero, growright

Target[proxy-srvkbinout]: cacheServerInKb&cacheServerOutKb:public@127.0.0.1:3401
MaxBytes[proxy-srvkbinout]: 76800
Title[proxy-srvkbinout]: Cache Server Traffic In/Out
PageTop[proxy-srvkbinout]: <H2>Cache Statistics: Server traffic volume (In/Out)</H2>
Options[proxy-srvkbinout]: growright
Tanto las paginas Web como los datos de las estadísticas generados por MRTG se guardaran en /var/www/mrtg-squid. Si no existe la carpeta habrá que crearla.
Por otro lado necesitaremos el archivo /etc/squid/mib.txt donde se especifican los objetos que se deben monitorizar dentro de Squid. Se puede descargar de los archivos fuentes del Squid o de aquí.

Ahora solo hace falta ejecutar el MRTG cada 5 minutos. Para ello editamos el /etc/crontab y añadimos la siguiente línea:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * root LANG=C /usr/bin/mrtg 
   /etc/squid/mrtg-squid.conf --debug="cfg"
Al cabo de unas horas ya podrás apreciar el uso de tú Squid. Al leer los gráficos del MRTG es muy importante saber bajo que velocidad está generado el gráfico para poder compararlo por ejemplo con el gráfico de tú conexión a Internet. En este caso el gráfico “Squid volum traffic” está en KB/s (Kilobytes por segundo).


Podrás acceder a dos tipos de gráficos: el “http Hits and request” (http:///mrtg-squid/proxy-hit.html) y el “Squid traffic volumn” (http:///mrtg-squid/proxy-srvkbinout.html).

El segundo de ellos indica en KB/s el volumen de datos que entran y salen del Squid. Para interpretar el primero de ellos debemos tener claro las diferencia entre “http request” y “http hits”. Las “http request” son las peticiones http que realizan los clientes. Las “http hits” son las peticiones servidas por el proxy o más concretamente servidas por la cache del proxy. Es decir, contra más se parezcan los “http request” a los “http hits” mejor está funcionando el proxy porque eso quiere decir que el cliente a pedido una pagina Web que el proxy tenía cacheada.
Existe otro parámetro que es el “percentage” que indica el porcentaje de acierto del proxy. Un porcentaje alto indica que todas las paginas que van pidiendo los usuarios están ya cacheadas por el proxy.

Más información:
+ Configuración de un proxy transparente
+ SQUID and MRTG: to SNMP or not SNMP?

un miniserver con una fonera

1 de enero de 2010

Hace unos dias que me calló una Fonera 2.0n y no sé muy bien para que. Para el que no sepa que es una Fonera no es más que un access-point bajo Linux al que se le han añadido servicios. La idea es formar una comunidad de Foneros repartidos por todo el mundo de forma que los Foneros compartan una porción de su ancho de banda de conexión a Internet para que otros puedan utilizarlo.

Puedes encontrar un punto de acceso Fon en el mapa oficial de la comunidad: http://maps.fon.com/

Actualmente hay dos Foneras access-points: la Fonera 2n (la más completa) y la Fonera+ (la básica).

Después de trastearla y jugar con ella he decido deshabilitar la Wifi y utilizarla solo de servidor de descargas para bajar ficheros y torrents. La Fonera 2n, a parte de ser access-point (no es un router que elimina la necesidad de nuestra router-ADSL) contiene toda una interfaz Web para administrar torrents, el Facebook, descarga de archivos, el Youtube, el Flicker, etc. Dado que se trata de un aparato muy pequeño es ideal para dejarlo todo el dia encendido bajando cosas. Además tiene la posibilidad de añadirle una llave o disco USB para ir dejando todo lo que estemos bajando.


Estos son los pasos para convertir tú Fonera en un servidor de descargas:

+ Una vez instalada la Fonera y funcionando tal como indica “La guía de instalación rápida” lo que haremos es actualizar el firmware a una versión Developer. La versión Developer permite tener el puerto SSH de la Fonera abierto y poder trastear por su interior. Mi fonera tenía la 2.2.6_ENDUSER y le he puesto la versión 2.3_DEV. Para actualizarla hay que hacer: Panel de control -> Configuración -> Sistema -> Actualizacion Firmware

Para acceder a la configuración Web cargaremos la pagina https://192.168.10.1 una vez que nos hemos conectado al SSID de administración "MyPlace".

+ Cuando tenemos la Fonera con la ultima firmware podemos deshabilitar la compartición libre de nuestra Wifi o el SSID FON_FREE_INTERNET. Haremos: Panel de control -> Configuración -> Fon Spot.
En esto de las Foneras hay dos SSID: uno publico (FON_FREE_INTERNET), que lo acabamos de desactivar y el otro privado (MyPlace) que debe desactivarse por hardware con el interruptor situado detrás de la Fonera.
Una vez hecho esto la Fonera será como otro PC conectado a nuestra red LAN.

Al desconectar las interfaces Wifi debemos acceder directamente vía interfaz Ethernet. Por defecto esta interfaz se configura por DHCP pero desde Panel de control -> Configuración -> Internet es posible asignar una IP a la tarjeta de red de la Fonera. Por ejemplo 192.168.1.99.

+ Ahora lo que tenemos que hacer es activar todos los servicios de administración (Web GUI, SSH, FTP, etc) para que sean accedidos desde nuestro PC de la LAN. Por defecto todos estos servicios solo están disponibles si nos conectamos vía SSID privado, pero lo que queremos es que estén disponibles desde fuera de la Fonera. Para activarlos haremos: Panel de control -> Configuración -> Firewall -> Aplicaciones

Una vez activados todos los servicios deberíamos poder acceder a la Fonera desde nuestra LAN con un https://192.168.1.99.

+ Necesitaremos también un disco o llave USB para las descargas. Una vez introducido, los iconos “Disco USB” y “Navegación de archivos” ya estarán disponibles.

+ Por ultimo solo queda ir al Gestor de descargas o Torrents para controlar nuestras descargas. Para acceder a nuestras descargas podemos ir por carpeta compartida \\192.168.1.99\media con el usuario "fonero" y el password que hayamos puesto durante la instalación.



Nota: al igual que hemos conectado un disco USB, tambien es posible conectar una webcam o una impresora.

Más información:
+ Wiki Fonera 2n