06-21-2005, 03:43 PM
Linux 2.6.x Balanceo de Carga COMO
Alejandro Espeche aespeche@yahoo.com.ar
BlueSkies id de http://www.linux.org.ar
-------------------------------------------------------------------------------
Este documento describe como unir varias conexiones a internet en una sola LAN.
-------------------------------------------------------------------------------
1. Introducción
Antes que nada quiero decir que me decidí a escribir esto (soy bastante vago para documentar) ya que este tema me rompió la cabeza por bastante tiempo. Me leí todo (bueno, casi todo) lo que encontré en la red, y nada, nada pareció funcionar, de todas maneras, les recomiendo que lean todo lo que puedan al respecto.
Lo siguiente es aclarar que no me hago responsable de nada absolutamente. Pero si alguien encuentra un mejor modo de hacer esto espero leer su COMO pronto.
2. Razones para usar el balanceo de carga
Tengo una LAN que demanda cada vez más. Asi que compramos más ADSL (cuando las telcos se decidan a bajar las lineas digitales, esto sera historia). Al principio marcaba los paquetes y los direccionaba a una u otra salida, como algunos salian con proxy (squid) y otros no, esto era suficiente. Y era dificil predecir cuales o cuantos servicios usar por ADSL.
Decidí que era momento de balancear cargas, lei la documentación al respecto, fracasé varias veces, pero hoy todo funciona perfecto. (al menos eso supongo)
3. Descripción del equipo
Server, linux 2.6.x (funciona tambien en 2.4.x)
Distro, Fedora Core 3 (si recompilan el kernel esta distro es sumamente estable)
NIC, varias (5) todas correctamente configuradas
ADSL, varios (4), marca Tainet.
4. Configurando la red
A los ADSL los deje haciendo NAT y discando solos, ya que con PPPoE tuve algunos incovenientes. La más facil era esta.
Me quedó la red de la siguiente forma:
eth0 LAN 192.168.100.254/24
eth1 10.0.1.1/24 GW WAN0 10.0.1.254/24
eth2 10.0.2.1/24 GW WAN1 10.0.2.254/24
eth3 10.0.3.1/24 GW WAN2 10.0.3.254/24
eth4 10.0.4.1/24 GW WAN3 10.0.4.254/24
Espero que se entienda esto, si alguien lo quiere traducir a cristiano, mejor.
Para que esto funcione tenemos que usar iproute2, de nuevo aclaro que hay miles de páginas al respecto, asi que no sean tímidos, pueden leerlas de internet.
5. Armando el script
(se puede cortar y pegar, pero no va a funcionar a menos que tengas la misma configuracion mia
)
#!/bin/sh
# Limpio la cache
# FC3 tiene configurado limpiar las tablas cada 5 minutos, se puede cambiar este tiempo.
ip route flush cache
# Reinicio lo
ip addr flush lo
ip link set lo down
ip addr add 127.0.0.1/8 dev lo
ip link set lo up
# Reinicio eth0, LAN, lo mismo esto para cada placa de red
ip addr flush eth0
ip link set eth0 down
ip addr add 192.168.100.254/24 dev eth0
ip link set eth0 up
# ... aqui van las otras placas exactamente =
# Reinicio eth4
ip addr flush eth4
ip link set eth4 down
ip addr add 10.0.4.1/24 dev eth4
ip link set eth4 up
# Limpio las tablas de ruteo
ip route flush default
ip route flush table 1
# ... aqui se vacian las otras tablas exactamente =
ip route flush table 4
# Creo las tablas de ruteo
ip route add 192.168.100.0/24 dev eth0 src 192.168.100.254
ip route add 10.0.1.0/24 dev eth1 src 10.0.1.1
# ... aqui van las otras tablas exactamente =
ip route add 10.0.0.0/24 dev eth4 src 10.0.4.1
# Este script me lo hice porque tenia fiaca de copiar cada tabla main en la respectiva tabla del 1 al 4, se puede mejorar, asi que toda suya
ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 1 $ROUTE ; done
# ... aqui van las otras copias de tablas exactamente =
ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 4 $ROUTE ; done
ip route add table 1 default via 10.0.1.254
# ... aqui van los otros GW exactamente =
ip route add table 4 default via 10.0.4.254
# configuro las reglas de ruteo
ip rule add from 10.0.1.1 table 1
# ... lo mismo que antes
ip rule add from 10.0.4.1 table 4
# balanceo de carga
ip route add default equalize nexthop via 10.0.1.254 dev eth1 weight 1 \\
nexthop via 10.0.0.3 dev eth2 weight 1 \\
# bueno aqui paras si tenes solo dos ADSL le sacas el \\ of course, sino agrega tantos
# nexthop como sean necesarios, una nota importante es el weight, yo les puse uno a todos
# porque todos mis ADSL son de 512, si tenes conexiones más veloces modificas este numero
# aqui dice que saldra una conexion por cada adsl, si pusiera 2 en alguno de ellos
# pasaran dos antes de seguir al siguiente ADSL
nexthop via 10.0.4.254 dev eth4 weight 1
#END
Bueno, ahi se termino todo, podes tener la red funcionando y correr esto, ya que bajo toda configuración anterior. Si queres ver si esto funciona pones lo siguiente:
ip route show, si te muestra algo como esto:
default equalize
nexthop via 10.0.1.254 dev eth1 weight 1
...
nexthop via 10.0.4.254 dev eth4 weight 1
Quiere decir que lo lograste, y podés mandar alguna donación para que yo pueda terminar mi primaria.
Usa iptraf para ver el trafico y ip route show cache para ver que sale por cada conexión.
6. Los últimos toques
Dije que algunos salen con proxy y otros sin, asi que agregue este par de líneas a mi firewall:
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.0.1.1
...
iptables -t nat -A POSTROUTING -o eth4 -j SNAT --to-source 10.0.4.1
Debería conectarse todo bien, deberían pasar los ping desde cualquier terminal a internet sin ningún problema, tendría que funcionar servicios vitales como el msn hotmail y yahoo.
Si algo esta mal o no funciona, me mandan un mail. Pero siempre teniendo en cuenta el punto 1 de este documento
Bueno, termine todo esto limitando el ancho de banda sobre todo a los P2P, usando CBQ.
Muchas gracias
Alex
Alejandro Espeche aespeche@yahoo.com.ar
BlueSkies id de http://www.linux.org.ar
-------------------------------------------------------------------------------
Este documento describe como unir varias conexiones a internet en una sola LAN.
-------------------------------------------------------------------------------
1. Introducción
Antes que nada quiero decir que me decidí a escribir esto (soy bastante vago para documentar) ya que este tema me rompió la cabeza por bastante tiempo. Me leí todo (bueno, casi todo) lo que encontré en la red, y nada, nada pareció funcionar, de todas maneras, les recomiendo que lean todo lo que puedan al respecto.
Lo siguiente es aclarar que no me hago responsable de nada absolutamente. Pero si alguien encuentra un mejor modo de hacer esto espero leer su COMO pronto.
2. Razones para usar el balanceo de carga
Tengo una LAN que demanda cada vez más. Asi que compramos más ADSL (cuando las telcos se decidan a bajar las lineas digitales, esto sera historia). Al principio marcaba los paquetes y los direccionaba a una u otra salida, como algunos salian con proxy (squid) y otros no, esto era suficiente. Y era dificil predecir cuales o cuantos servicios usar por ADSL.
Decidí que era momento de balancear cargas, lei la documentación al respecto, fracasé varias veces, pero hoy todo funciona perfecto. (al menos eso supongo)
3. Descripción del equipo
Server, linux 2.6.x (funciona tambien en 2.4.x)
Distro, Fedora Core 3 (si recompilan el kernel esta distro es sumamente estable)
NIC, varias (5) todas correctamente configuradas
ADSL, varios (4), marca Tainet.
4. Configurando la red
A los ADSL los deje haciendo NAT y discando solos, ya que con PPPoE tuve algunos incovenientes. La más facil era esta.
Me quedó la red de la siguiente forma:
eth0 LAN 192.168.100.254/24
eth1 10.0.1.1/24 GW WAN0 10.0.1.254/24
eth2 10.0.2.1/24 GW WAN1 10.0.2.254/24
eth3 10.0.3.1/24 GW WAN2 10.0.3.254/24
eth4 10.0.4.1/24 GW WAN3 10.0.4.254/24
Espero que se entienda esto, si alguien lo quiere traducir a cristiano, mejor.
Para que esto funcione tenemos que usar iproute2, de nuevo aclaro que hay miles de páginas al respecto, asi que no sean tímidos, pueden leerlas de internet.
5. Armando el script
(se puede cortar y pegar, pero no va a funcionar a menos que tengas la misma configuracion mia
)#!/bin/sh
# Limpio la cache
# FC3 tiene configurado limpiar las tablas cada 5 minutos, se puede cambiar este tiempo.
ip route flush cache
# Reinicio lo
ip addr flush lo
ip link set lo down
ip addr add 127.0.0.1/8 dev lo
ip link set lo up
# Reinicio eth0, LAN, lo mismo esto para cada placa de red
ip addr flush eth0
ip link set eth0 down
ip addr add 192.168.100.254/24 dev eth0
ip link set eth0 up
# ... aqui van las otras placas exactamente =
# Reinicio eth4
ip addr flush eth4
ip link set eth4 down
ip addr add 10.0.4.1/24 dev eth4
ip link set eth4 up
# Limpio las tablas de ruteo
ip route flush default
ip route flush table 1
# ... aqui se vacian las otras tablas exactamente =
ip route flush table 4
# Creo las tablas de ruteo
ip route add 192.168.100.0/24 dev eth0 src 192.168.100.254
ip route add 10.0.1.0/24 dev eth1 src 10.0.1.1
# ... aqui van las otras tablas exactamente =
ip route add 10.0.0.0/24 dev eth4 src 10.0.4.1
# Este script me lo hice porque tenia fiaca de copiar cada tabla main en la respectiva tabla del 1 al 4, se puede mejorar, asi que toda suya
ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 1 $ROUTE ; done
# ... aqui van las otras copias de tablas exactamente =
ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 4 $ROUTE ; done
ip route add table 1 default via 10.0.1.254
# ... aqui van los otros GW exactamente =
ip route add table 4 default via 10.0.4.254
# configuro las reglas de ruteo
ip rule add from 10.0.1.1 table 1
# ... lo mismo que antes

ip rule add from 10.0.4.1 table 4
# balanceo de carga
ip route add default equalize nexthop via 10.0.1.254 dev eth1 weight 1 \\
nexthop via 10.0.0.3 dev eth2 weight 1 \\
# bueno aqui paras si tenes solo dos ADSL le sacas el \\ of course, sino agrega tantos
# nexthop como sean necesarios, una nota importante es el weight, yo les puse uno a todos
# porque todos mis ADSL son de 512, si tenes conexiones más veloces modificas este numero
# aqui dice que saldra una conexion por cada adsl, si pusiera 2 en alguno de ellos
# pasaran dos antes de seguir al siguiente ADSL
nexthop via 10.0.4.254 dev eth4 weight 1
#END
Bueno, ahi se termino todo, podes tener la red funcionando y correr esto, ya que bajo toda configuración anterior. Si queres ver si esto funciona pones lo siguiente:
ip route show, si te muestra algo como esto:
default equalize
nexthop via 10.0.1.254 dev eth1 weight 1
...
nexthop via 10.0.4.254 dev eth4 weight 1
Quiere decir que lo lograste, y podés mandar alguna donación para que yo pueda terminar mi primaria.
Usa iptraf para ver el trafico y ip route show cache para ver que sale por cada conexión.
6. Los últimos toques
Dije que algunos salen con proxy y otros sin, asi que agregue este par de líneas a mi firewall:
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.0.1.1
...
iptables -t nat -A POSTROUTING -o eth4 -j SNAT --to-source 10.0.4.1
Debería conectarse todo bien, deberían pasar los ping desde cualquier terminal a internet sin ningún problema, tendría que funcionar servicios vitales como el msn hotmail y yahoo.
Si algo esta mal o no funciona, me mandan un mail. Pero siempre teniendo en cuenta el punto 1 de este documento
Bueno, termine todo esto limitando el ancho de banda sobre todo a los P2P, usando CBQ.
Muchas gracias
Alex