Conexões redundantes à Internet utilizando Linux

O presente documento destina-se a criar um balanceamento de duas conexões ADSL existentes em uma mesma máquina Linux. Ao seu final, o leitor estará capacitado a configurar uma máquina Linux contendo duas (ou mais) conexões ADSL, Cable ou similares (com IP fixo) de forma que essas conexões sejam utilizadas tanto para recepção quanto envio de informações para a Internet, bem como serem utilizadas em balanceadores de carga no modelo Round Robin.

[ Hits: 232.432 ]

Por: MrBiTs em 23/03/2005 | Blog: http://www.mrbits.com.br


Configurações de roteamento



Para nosso sistema de redundância funcionar, devemos ter uma rota de caminhos múltiplos no sistema e tabelas de roteamento separadas que gerenciarão o tráfego e o enviarão para a interface apropriada no tempo apropriado.

Nosso trabalho inicia-se com as configurações de variáveis, que tornarão a vida um pouco mais fácil. Mas, antes, o sha-bang!

#!/bin/bash

echo "Configurando Variáveis..."
# Localização do comando iptables
IPTABLES=/sbin/iptables
# Localização do comando ip
IP=/sbin/ip
# Interface Externa 1 - Virtua
NET_EXT_INT0=eth0
# IP Virtua
NET_EXT_IP0=201.1.1.102
# Default Gateway Virtua
NET_EXT_GW0=201.1.1.1

# Interface interna
NET_INT_INT1=eth1
# IP interno
NET_INT_IP1=192.168.0.1
# Subnet interna
NET_INT_SUB1=24
# Rede interna
NET_INT_NET1=192.168.0.0

# Interface externa 2 - Speedy
NET_EXT_INT2=eth2
# IP Speedy
NET_EXT_IP2=200.100.90.80
# Default Gateway Speedy
NET_EXT_GW2=200.100.90.1

Os endereços IP das interfaces eth0 e eth2 não são os endereços reais. Vamos agora limpar eventuais tabelas existentes:

echo "Limpando as tabelas..."
$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -F -t mangle
$IPTABLES -X -t nat
$IPTABLES -X -t mangle
$IPTABLES -X

Agora podemos iniciar a configuração de nossas regras iptables e iproute2. Vamos criar duas chaves para cada uma das interfaces externas. Uma irá administrar pacotes vindos para nosso sistema e outra administrará pacotes indo para o sistema que serão transformados (NATed) ou redirecionados (forwarded). A primeira tabela para a primeira interface residirá na tabela mangle:

echo "Configurando tabela Mangle para eth0..."
$IPTABLES -t mangle -N ETH0
$IPTABLES -t mangle -F ETH0
$IPTABLES -t mangle -A ETH0 -p tcp -j LOG -log-prefix MANGLE_TCP_ETH0
$IPTABLES -t mangle -A ETH0 -p icmp -j LOG -log-prefix MANGLE_ICMP_ETH0
$IPTABLES -t mangle -A ETH0 -j MARK --set-mark 1

Estes comandos simplesmente criarão uma chave na tabela Mangle, chamada ETH0. Os terceiro e quarto comandos destinam-se a depuração do sistema e podem ser removidos quando tudo estiver funcionando corretamente. Eles simplesmente registram (log) todos os pacotes tcp e icmp que passam pela chave. A última linha coloca uma marca de 1 em todos os pacotes vindos através da chave. Isso é feito porque queremos identificar pacotes para depois roteá-los corretamente para a interface. Repetimos os comandos para a segunda interface:

echo "Configurando tabela Mangle para eth2..."
$IPTABLES -t mangle -N ETH2
$IPTABLES -t mangle -F ETH2
$IPTABLES -t mangle -A ETH0 -p tcp -j LOG -log-prefix MANGLE_TCP_ETH2
$IPTABLES -t mangle -A ETH0 -p icmp -j LOG -log-prefix MANGLE_ICMP_ETH2
$IPTABLES -t mangle -A ETH2 -j MARK --set-mark 2

Agora temos nossas duas chaves customizadas para a tabela mangle prontas. Configuraremos agora as regras correspondentes que permitirão que os pacotes possuam os endereços corretos de suas interfaces:

echo "Configurando tabela Nat para eth0..."
$IPTABLES -t nat -N SPOOF_ETH0
$IPTABLES -t nat -F SPOOF_ETH0
$IPTABLES -t nat -A SPOOF_ETH0 -j LOG -log-prefix SPOOF_ETH0
$IPTABLES -t nat -A SPOOF_ETH0 -j SNAT --to ${NET_EXT_IP0}

Isso cuidará do roteamento para nós. De novo, a terceira linha serve apenas para depuração. A última linha é a que realmente cuida do processamento. Ela certifica-se que o endereço IP de nossa primeira interface externa é anexado a todo o tráfego que será roteado através dele. Faremos o mesmo para a segunda interface.

echo "Configurando tabela Nat para eth2..."
$IPTABLES -t nat -N SPOOF_ETH2
$IPTABLES -t nat -F SPOOF_ETH2
$IPTABLES -t nat -A SPOOF_ETH2 -j LOG -log-prefix SPOOF_ETH2
$IPTABLES -t nat -A SPOOF_ETH2 -j SNAT --to ${NET_EXT_IP2}

Pessoalmente, eu gosto de adicionar a seguinte linha para certificar-me que hosts de nossa rede interna consigam acessar o gateway com o comando ping, para testes:

echo "Permitindo ping local..."
$IPTABLES -A INPUT -p icmp -s ${NET_INT_NET1}/${NET_INT_SUB1} -d \
${NET_INT_IP1} -j ACCEPT

Agora precisamos certificar-nos de que os pacotes vindos para o sistema realmente alcancem as chaves criadas para eles. Isto é feito criando-se as tabelas correspondentes com iproute2 e regras para acomodá-las.

echo "Configurando regras de Mangle para eth0..."
$IP ru add from ${NET_EXT_IP0} lookup 1
$IP ro add table 10 default via ${NET_EXT_GW0} dev ${NET_EXT_INT0}
$IP ru add fwmark 1 table 10
$IP ro fl ca

O primeiro comando iproute2 adiciona uma regra dizendo para nosso IP de interface 1 (Virtua) faça suas procuras através da marca 1, anteriormente adicionada ao pacote tcp/ip. O segundo comando adiciona uma tabela, 10, que tem como gateway padrão o gateway especificado nas configurações do script. Então ele fez todos os pacotes receberem uma marca 1. Finalmente ele limpa a tabela de roteamento para termos um início limpo. Fazemos o mesmo com a segunda interface:

echo "Configurando regras de Mangle para eth2..."
$IP ru add from ${NET_EXT_IP2} lookup 2
$IP ro add table 20 default via ${NET_EXT_GW2} dev ${NET_EXT_INT2}
$IP ru add fwmark 2 table 20
$IP ro fl ca

Agora devemos ter certeza de que as traduções de endereçamento (NAT) estejam nos lugares corretos:

echo "Configurando regras de spoofing..."
$IPTABLES -t nat -A POSTROUTING -o ${NET_EXT_INT2} -j SPOOF_ETH2
$IPTABLES -t nat -A POSTROUTING -o ${NET_EXT_INT0} -j SPOOF_ETH0

Isso garante que pacotes de saída tenham seu endereço ip externo correto. Agora nos certificaremos de que a máquina tenha o seu gateway padrão, que neste caso, é uma rota de caminhos múltiplos:

echo "Adicionando rota default..."
$IP ro add default equalize nexthop via ${NET_EXT_GW2} dev \
${NET_EXT_INT2} weight 1 nexthop via ${NET_EXT_GW0} dev \
${NET_EXT_INT0} weight 1

Isso não faz nada além de dar à máquina a habilidade de sair usando uma das duas rotas de caminho múltiplo com pesos iguais, isto é, com probabilidades iguais. A última coisa que devemos fazer é ter certeza de que a máquina faz o redirecionamento de pacotes corretamente e também desabilitarmos o filtro de pacotes reversos, para que os pacotes possam entrar livremente em ambas as interfaces:

echo "Desabilitando filtro de caminho reverso..."
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

echo "Habilitando redirecionamento de pacotes..."
echo 1 > /proc/sys/net/ipv4/ip_forward
Página anterior     Próxima página

Páginas do artigo
   1. Objetivos
   2. Configurações do kernel e pacotes adicionais
   3. Definições e metodologia
   4. Configurações de roteamento
   5. Conclusão
   6. Script completo
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Instalação do OpenJDK e Oracle JDK 11 no Ubuntu e Debian

Criando servidor de arquivos GNU/Linux com RAID virtual e DFS em rede Windows

Controle de banda no Apache 1.3.X com mod_bandwidth (Slackware)

Instalação e configuração do J2SE

GNU/Linux integrado ao AD do Windows Server 2003

  
Comentários
[1] Comentário enviado por bhl em 24/03/2005 - 08:41h

Mas se a sua conexão do Virtua cair, os pacotes poderão tentar sair pela rota do gateway do Virtua e terão problemas (isso aconteceu comigo).

Esse script é para balanceamento de carga (load balance) e não redundância de link. Ou estou enganado?

[2] Comentário enviado por fabio em 24/03/2005 - 09:18h

Olá bhl,

Bom, vou me meter no assunto, espero não estar falando bobagem :)

Se um dos links cair, o kernel "descobre" que o link caiu e passa a rotear somente pelo outro link. Repare que as duas rotas tem a mesma prioridade na tabela de roteamento do kernel, por isso o balanceamento. A redundância e balanceamento nesse caso se devem ao recurso de multi path routing habilitado no kernel.

Só faço uma ressalva, se um dos links cair, o kernel descobre, mas se ele voltar, o kernel fica sem saber, pois a rota para esse dispositivo foi desabilitada. Uma sugestão é pôr um script no cron para pingar as interfaces de rede da máquina a cada minuto. Um simples ping na interface de rede que voltou já é o suficiente para o kernel saber que ela está no ar novamente e restaurar a rota de pacotes pra ela.

[]'s

[3] Comentário enviado por mrbits em 29/03/2005 - 16:12h

Nao esta falando bobagem nao. Mandou muito bem e esta coberto de razao. Se uma das conexoes cair e voltar, o kernel vai ficar sem saber, sendo necessario um restart no roteamento.

[4] Comentário enviado por efloriani em 06/04/2005 - 01:34h

Ola galera,,

Estou com um problema, que seria o seguinte:
Tenho 1 link e 1 ADSL, duas conexoes internet.
Meus usuarios passam pelo proxy squid, e vao para a internet, atraves de qualquer 1 das conexoes com a internet, porem, preciso fazer com q o servidor de email local soh saia pelo link e nunca pela ADSL.

Como fazer?
Agradeco a atencao desde jah.

Edwin Floriani

[5] Comentário enviado por genixsky em 09/05/2005 - 09:02h

Olá pessoal.

Gostaria de saber, como fazer para testar esse processo com dois link speedy de 400, sendo que um deles já está em operação na rede. Pois não posso parar a rede para realizar este teste.

Pensei em colocar em uma máquina da rede ligada diretamente a interface com o ip do link válido 200.0.0.0. A minha idéia e tentar simular um link speedy em um computador para verificar c o kernel realmente manteria total acesso. Isso é possível?


[6] Comentário enviado por jaca_diego em 15/05/2005 - 18:26h

Olá achei muito bom o script so q tenhu uma duvida quanto ao multi path routing, uso conectiva 10 como posso abilitar isso no kernel ou como faço pra ver c ja esta abilitado??
obrigado
nota 10

[7] Comentário enviado por segalla em 15/11/2005 - 12:19h

Pessoal,

Estou usando FC3 com kernel 2.6, montei um ambiente de teste e rodei o script acima.

A parte de balanceamento ta rodando perfeito mas o kernel não está "descubrindo" a queda de uma rota e continua fazendo balaceamento entre as duas placas.

Alguém tem alguma sugestão?

Abs,

Segalla

[8] Comentário enviado por crulim em 20/04/2006 - 15:21h

Boa tarde a todos!!!

Estou vendo a necessidade de criar um balanceamento de carga aqui na empresa. Tenho firewall Linux Conectiva 8 com kernel 2.4. Estou com as seguintes duvidas sobre o script de balanceamento.

1º Aqui na empresa é proxy transparente redirecionado da 80 para 2100, será que o pacotes da rede interna passarão pelo redirecionameto e serão balanceados através dos dois links?

2º Como já foi informado nos comentarios acima, como resolver quando um dos links cair, o script de ping que é executado no cron, faz o kernel reconhecer o link que tinha caido. Mas aqui na empresa tenho um link da telefonica com ip fixo, e a cada 35 dias o link caia, e sou obrigado a autenticar com a senha. Se eu tiver dois links da telefonica, como farei para autentica os links seperados, por que o kernel vai esta utilizando o link que esta no ar, e no navegador terei que acessar o link que caio para autentica. Como farei esta operação?

Fico no aguardo da ajuda.

Obrigado.

Ass Claudio Rulim
E-mail: crulim@uol.com.br

[9] Comentário enviado por marquinhos1875 em 20/07/2006 - 21:48h

ola brothes livres
estou com problemão
tenho dois links dadicados com o load balance do link a seguir
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2252&pagina=3
bom funciona as mil maravilhas a não ser pelo fato de alguns sites (por motivos de seguranças) verificarem o ip de requisição ai (bummm) o servidor derruba a conexão, pois ele detectam dois ips diferentes (um de cada link)
tenho certeza ki o iptables pode resolver isso, mais preciso de ajuda
algem se habilita?
favor .... o link e muito caro e estou perdendo $$$$$$$$$!!!!!!!!!!

[10] Comentário enviado por standart em 22/07/2006 - 14:50h

Olá amigo!!!

Preciso muitissimo de uma orientação....Inves de 2 links eu preciso fazer com 3 links...em que pontos do script terei de auterar?

Peço que me ajude..

isaac@barreirasnet.com.br

[11] Comentário enviado por fabiolima em 13/09/2006 - 15:24h

Boa tarde mrbits,

Faço da pergunta do CRULIN a minha!!!!!

Aguardo resposta

[12] Comentário enviado por gilson_ctm em 07/10/2006 - 17:26h

Olá amigos, apliquei esse excelente script mais tenho um probleminha que está esquetando minha cabeça. Acontece que o msn, putty e donwloads caem constantimente. me ajuuuuuude!

[13] Comentário enviado por removido em 11/11/2006 - 20:01h

pq o autor nao responde nenhuma pergunta ?

[14] Comentário enviado por joabes em 23/11/2006 - 17:25h

Afinal esse script faz a divisão do trafego entre os links? ou é para um link assumir quando outro cair?

Cordialmente
Joabes

[15] Comentário enviado por balani em 12/12/2006 - 01:44h

marquinhos1875, não entendi direito o seu problema.

[16] Comentário enviado por baratinha em 13/04/2007 - 14:04h

Caro bhl eu trabalho em uma empresa de rastreamento e desejo ter um link de backup, mas os modulos que ficam nos caminhões apontam somente para um ip fixo. Fazendo esse roteamento seria possivel quando um link cair o outro entrar automatico?

[17] Comentário enviado por iadias em 11/06/2007 - 20:23h

o link esta off line alguem poderia me enviar ????

[18] Comentário enviado por pankdo em 10/09/2007 - 12:27h

posso usar essa solucao em comjunto com o squid?
todos os pacotes vindos da rede interna sao entregues ao squid
e depois sao divididos entre os links de saida??

desde ja grato

e artigo MUITO SHOW ja ta nos meus favoritos

[19] Comentário enviado por papel em 22/01/2008 - 18:30h

Caro amigo, tô com um problemão p/ configurar meu proxy com conexão ADSL. Já q vc tem experiência nesse tipo de configuração poderia me passar como eu faria.
Segue abaixo o link contendo a minha dúvida.
Muito obrigado e Viva O Linux!!!!

http://www.vivaolinux.com.br/comunidades/verTopico.php?codigo=191&codtopico=13485

[20] Comentário enviado por tecnoenger em 02/02/2008 - 20:17h

O link do script * http://www.mrbits.com.br/tutoriais/redundantconn.sh esta com permissão negada para acesso.

[21] Comentário enviado por Wolf_RN em 16/07/2008 - 20:31h

Caros amigos, estou com 2 links, um da 1mb da VELOX e outro 1mb da JETCOM, preciso de informações para fazer a redundancia, que quando um caia o outro assuma e ao voltar seja reconhecido automaticamente, alguém me da um passo a passo de como fazer..?? Agradeço.

[22] Comentário enviado por rickardofm em 21/07/2008 - 10:18h

Olá... CAROS... esse script acima é muito show para iniciantes em sistemas de balanceamento em linux e funciona muito bem, porém algumas
coisas deve ser incrementados. O msn na sua rede por exemplo vai se desconectar toda hora... mas isso é simples resolver marque
os pacotes dele para sair por um único link, isso vale p/ outros serviços tbm.
Utilizei um parecido fazendo o mesmo marcando todos os pacotes de cada interface nos forwards, utilizando kernel 2.4.x e utilizei o
mesmo com kernel 2.6.x q se comportou com um certo melhor desempenho devido a um fato importante, sem marcação de pacotes
q isso não precisou ser feito e funcionou perfeitamente, claro não esquecendo de marcar somente o msn e outros serviços.
Outra dúvida de todos é quanto a um link cair... bom vc pode resolver isso com um script simples no seu crontab vendo os gateways
se estão online.
Agora o fato q mata é um q parece q ninguem observou ainda... trabalho num provedor de internet eu tenho um server como
descrevi acima com o kernel 2.6.x e o q acontece é q quando um download é iniciado ele pode se congelar a qualquer momento
devido ao balanceamento trocar as conexões de lugar isso sim é um PROBLEMÃO q ainda não descobri a solução.
Té mais.
funcionando bem... com 4 LINKS de operadoras distintas e um fato acontece com os downloads

[23] Comentário enviado por ronaldho em 15/09/2008 - 12:07h

Achei muito interessante o script do amigo, quero lhe parabenizar pela atitude e inciativa e vale lembrar que este problema é muito comum e que esta iniciativa ajuda muita gente. Foi de grande ajuda com certeza, porém temos que notar que a solução fica um pouco incompleta com relação ao teste do link para perceber a queda de uma das conexões, eu particularmente procuro uma solução pra este problema a muito tempo e consegui uma solução baseada também em script que ajuda pra solucionar este problema da redundância de conexão. Vale lembrar que não é a reinvenção da roda e sim um complemento importante pra quem deseja implementar a solução citada acima. Existe uma documentação falando a respeito do problema que pode ser de grande ajuda.

http://blog.taragana.com/index.php/archive/how-to-load-balancing-failover-with-dual-multi-wan-adsl-c...

[24] Comentário enviado por comfaa em 17/09/2008 - 15:34h

uma duvida,
o gateway do usuario é um só né ?

[25] Comentário enviado por hugodeco em 20/08/2009 - 16:50h

Quem tiver alguma dúvida sobre este artigo me passa um e-mail e resolveremos então.
Eu lido com firewalls unix em grandes servidores e a pouco descobri esse mundo de comunidades e blogs
Antigamente não me sobrava muito tempo

hugodeco@hotmail.com
esse é meu e-mail e msn !

[26] Comentário enviado por nox6000 em 31/08/2009 - 08:37h

O que tenho que fazer de diferente para configurar 2 velox em um servidor e que esses velox NÃO TENHAM IP FIXO.

Tem alguma ideia?

[27] Comentário enviado por carlos.renato em 20/05/2011 - 11:15h

Parabéns pelo artigo.....no meu caso tenho speedy com ip fixo e virtua com ip dinamico, como faço para usar seu script?

Abraço, Carlos

[28] Comentário enviado por rudiberto em 30/01/2013 - 19:31h

Olá pessoal,

Tenho no meu servidor gateway (Debian Squeeze), 3 placas de rede, eth0 (rede interna), eth1 (Link Velox) e eth2 (Link GVT). Eu gostaria de fazer o seguinte: todo o acesso aos domínios .gov.br, .edu.br e .blogspot.com, sair pela eth1 (Link velox) e o restante sair pela eth2 (Link GVT. Esse é só um exemplo do cenário, é claro que a quantidade de domínios será maior.

Já pesquisei bastante na internet e até agora não encontrei nada que resolva o meu problema, solicito aos amigos do Software Livre, que me ajudem a encontrar uma solução para esse problema.

[29] Comentário enviado por marquinhos1875 em 01/02/2013 - 10:04h

Ei rudiberto, pesquise roteamento por destino, daí você cria duas listas e chame-as com um "for" no seu firewall.
Existe muito material sobre roteamento por origem na net, pra adaptar para destino e fácil.
Só tem um problema, eu desconheço o uso de coringas com iptables, então teria que trabalhar com o domínio completo, algo como *.gov.br não funciona


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts