Script para fazer balanceamento de links ADSL
Há algum tempo coloquei 2 links ADSL aqui em casa e criei o script abaixo para fazer o balanceamento entre eles. Hoje dei um geral no script e lembrei que nunca havia publicado ele por aqui. Então, lá vai:
#!/bin/bash # # Script para fazer o balanceamento de links ADSL # Para adicionar mais um link é so adicionar um item # às variaveis IFACES, IPS, GATEWAYS, NETWORKS, # WEIGHTS e NAMES # # É extremamente importante manter a ordem dentro das # variáveis. O primeiro campo da variável "IFACES" # corresponde ao primeiro campo da variável "IPS" # e por aí vai. # # Ultima modificacao: 22/11/2009 # Hugo Doria # Interfaces de rede IFACES=("eth1" "eth2" "eth3") # IP das interfaces de rede. Isto NÂO é o ip do modem. # É extremamente importante que siga a mesma ordem das interfaces # listadas na variável IFACES IPS=("192.168.254.2" "192.168.254.10" "192.168.254.18") # IP dos Gateways. Geralmente esse é o ip do Roteador ou do modem ADSL GATEWAYS=("192.168.254.1" "192.168.254.9" "192.168.254.17") # IP das redes que o modem e as interfaces pertencem NETWORKS=("192.168.254.0/29" "192.168.254.8/29" "192.168.254.16/29") # Peso de cada link. Se os links tiverem a mesma banda, entao deve-se # colocar 1 para todos. Se um link for maior que outro, entao coloque # os pesos correspondentes WEIGHTS=("1" "1" "1") # Nome dos links. Usado para criar um alias da conexão NAMES=("velox1" "velox2" "velox3") #----------------------------------------------- # NÂO ALTERE A PARTIR DAQUI #----------------------------------------------- # Comando padrão de adicionar rota ROUTEADD="ip route add default scope global" # Comando para deletar uma roda ROUTEDEL="`which route` del default gw" #################################################### # Deletando as rotas #################################################### for (( X=0; X < ${#IPS[@]}; X++ )); do echo "Deletando as rotas para ${IPS[$X]}" ${ROUTEDEL} ${IPS[$X]} done ####################################################### # Limpando as rotas ####################################################### for (( X=0; X < ${#IPS[@]}; X++ )); do echo "Limpando as rotas da tabela ${NAMES[$X]}" ip route flush tables ${NAMES[$X]} done ####################################################### # Aplicando as regras das redes ####################################################### for (( X=0; X < ${#IPS[@]}; X++ )); do echo "Aplicando a regra da rede ${NETWORKS[$X]}" ip route add ${NETWORKS[$X]} dev ${IFACES[$X]} src ${IPS[$X]} tables ${NAMES[$X]} done ####################################################### # Adicionando as regras ###################################################### for (( X=0; X < ${#IPS[@]}; X++ )); do echo "Adicionando a regra do ${IPS[$X]} na tabela ${NAMES[$X]}" ip rule add from ${IPS[$X]} table ${NAMES[$X]} done ########################################################## # Regra padrão e limpeza do cache ########################################################## for (( X=0;X < ${#IPS[@]}; X++ )); do ROUTEADD="${ROUTEADD} nexthop via ${GATEWAYS[$X]} dev ${IFACES[$X]} weight ${WEIGHTS[$X]}" done echo "Adicionando a regra padrao" ${ROUTEADD} echo "Limpando o cache" ip route flush cache
# Fim do script
O script serve para mais de dois links ADSL. Para adicionar mais um link é so adicionar um item às variaveis IFACES, IPS, GATEWAYS, NETWORKS, WEIGHTS e NAMES. Lembre-se sempre de manter a ordem dos itens dentro das variáveis.
Muito bom Hugo Doria. =]
[]’s
Gostei, vou testar.
Melhor que o script sujo que fiz.
Boa tarde!
Este script faz o balanceamento de carga?
Também queria saber se algum dos dois links por ventura cair, o tráfego é direcionado ao outro que está funfando ;)
obrigado
Olá Fred,
Este script faz, sim, o balanceamento. Mas como o colega Fabrício falou abaixo, a melhor opção é usar o script gwping. Ele fica testando e verificando se o link está no ar e reconstroe o balanceamento, caso algum dos links caia.
Eu também fiz uma nova versão do gwping, de forma que ele funciona com mais de 2 links. Em breve devo postá-lo.
Abraços.
Estou no aguardo :)
Também estou no aguardo ;)
Sim, mas demora. O motivo é cache feito.
Para ter uma ação mais instantânea você pode usar o script “gwping” de http://blog.taragana.com/index.php/archive/how-to-load-balancing-failover-with-dual-multi-wan-adsl-cable-connections-on-linux/ em “How to setup fail-over over multiple load balanced ADSL / Cable connections”.
É bom lembrar que o script “gwping” funcionaria como um complemento ao script acima.
Obrigado ;)
Hugo, muito bom o seu script, mas lá vai uma pergunta idiota: as três interfaces de rede apresentadas no script são os links de internet, certo? A eth0 seria a interface da rede interna, e ela não entraria nas variáveis como GW default para o endereço de rede interna??
Grato