Loadbalance

Publicado por Marcelo Viana (última atualização em 06/01/2012)

[ Hits: 7.688 ]

Homepage: infSite.org

Download loadbalance-s.sh




LoadBalance para servidor com dois links de Internet e um para rede local.

O Script faz o balanciamento através de marcação de pacotes (ip rule) para serem distribuídos pelo "ip route" de acordo com a tabela indicada.

# Em outros casos, poderá servir apenas de exemplo para ser estudado.

  



Esconder código-fonte

#!/bin/bash

### INTERFACES:
rede1="eth0"
iface1="eth1"
iface2="eth2"

### Obs.: As interfaces tem que está de acordo com os gateways.
### Exemplo: eth1 10.15.20.21 gateway 10.15.20.10
### Exemplo: eth2 10.26.20.21 gateway 10.26.20.1

### GATEWAYS
gw1="10.15.20.1"
gw2="10.26.20.1"

### Outras variáveis
nomeScript="loadbalance-s.sh"
op=0
a=true

### HABILITA ROTEAMENTO:
echo "1" > /proc/sys/net/ipv4/ip_forward

function start(){
### Chama funções.
    limpeza ; nat ; rotas ; looping
}

function limpeza(){
### Limpa tabelas.
    iptables -t mangle -F
    iptables -t mangle -X
    iptables --flush
    iptables -F
    iptables -t nat -F
    iptables -X
    iptables -t nat -X
    ip route flush cache 
}

function nat(){
### MASCARAMENTO(NAT) E MARCAÇÃO DE PACOTES PARA ROTEAMENTO.
    iptables -t nat -A POSTROUTING -o $iface1 -j MASQUERADE
    iptables -t nat -A POSTROUTING -o $iface2 -j MASQUERADE
    iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 1
}

function marcacao1(){
### Altera a marcação de pacotes da tabela "mangle"
    iptables -t mangle -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 1
}

function marcacao2(){
### Altera a marcação de pacotes da tabela "mangle"
    iptables -t mangle -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
}

function rotas(){
### MARCA E PRIORIZA DE ACORDO COM A TABELA
    ip rule add fwmark 1 table 10 prio 0
    ip rule add fwmark 2 table 20 prio 0
### DESTINA OS PACOTES
    ip route add default via $gw1 dev $iface1 table 10
    ip route add default via $gw2 dev $iface2 table 20
}

function looping(){
### LOOP PARA MUDAR A MARCAÇÃO
  while [ $a ]; do
   sleep 1
      if [ $op == 0 ]; then
   op=1
   marcacao1
      else
   op=0
   marcacao2
      fi
  done
}

function para(){
### PARA O LOADBALANCE.
    a=false
    limpeza
    kill -9 `ps aux  |grep $nomeScript|awk '{print $2}'`
}

function helpp(){
### HELP
echo "Uso: loadbalance + opção"
echo "Modos:"
echo "./$nomeScript start &"
echo "./$nomeScript stop &"
echo "sh $nomeScript start &"
echo "sh $nomeScript stop &"
echo "Modo depuração: sh -x $nomeScript start"
}


case $1 in
### RECEBE VALOR EXTERNO
    'start') start ; exit ;;
    'stop') para ; exit ;;
    '--help') helpp ; exit ;;
    *) echo "Utilize start ou stop. Ex.: ./$nomeScript start."; exit ;;
  
esac

# É o Senhor que mostra os caminhos. Obrigado Senhor por me ajudar atravez de tantos exemplos.
# www.technocristo.com

Scripts recomendados

Servidor LAMP p/ Debian

Autenticar usuários squid+shellscript+mysql

"Mascarando" pseudo-senha digitada pelo usuário

Instalando a última versão estável do Eclipse com uma única linha

Claro 3g Sony Ericsson md300 script conexao - Revisado


  

Comentários
[1] Comentário enviado por tosko em 07/01/2012 - 07:01h

legal gostei, pelo que entendi este script a cada 1 segundo alterna entre os links correto? bem acredito que pra tu ter feito tal escript tu ja chegou ler a respeito do comando nexthop (não lembro se é comando ou parametro) que faz semelhante a cada requisição ele direciona para um link... tem alguma vantagem este teu script para o nexthop?

[2] Comentário enviado por marceloviana em 07/01/2012 - 23:16h

Obrigado pelo cometário.
É isso mesmo, a cada 1 segundo ele altera o link de saída para Internet. Não sei se notou, mas ele está tratando somente as portas 80 e 443, quanto aos outros serviços, preferi deixar direto em um link default para evitar problemas com rota (perda de conexão) para quem usa determinados serviços como ssh ou vpn. Quanto ao "nexthop" ainda não o conheço, pela descrição que você postou "a cada requisição ele direciona", parece ser muito útil trabalhando em Round-Robin. Vou dar uma pesquisada, acho que isso (nexthop) irá me servir muito. Obrigado pela dica!
Fique com Deus.

[3] Comentário enviado por r4v3r em 05/06/2012 - 01:43h

Cara, seu script é elegante, porém a solução como um todo, passa muito longe disso. Mudar a rota padrão a cada segundo trará muito mais problemas do que soluções, sendo que o mais indicado para resolver seu caso, seria utilizar o nexthop conforme indicado pelo tosko.
Pense que da forma como está, para qualquer site que prenda algum tipo de autenticação ao endereço IP de origem, os usuários terão sempre que fazer logon duas vezes, como em sites de bancos. E fora isso, se por qualquer motivo um dos dois links não estiver funcional, 50% dos pacotes enviados para a internet de dentro de sua rede estarão perdidos, e isso iria gerar uma confusão danada.

[4] Comentário enviado por marceloviana em 05/06/2012 - 15:07h

r4v3r,
Você tem razão, não pensei no caso da autenticação. Muito obrigado pela dica e comentário.
Se não se importar, poderia dar uma olhada e opinião neste outro script que também é para loadbalance, mas, FailOuver. Acho que este ficou melhor:
http://www.vivaolinux.com.br/script/LoadbalanceFAILOVER

Obrigado.
paz.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts