Você está na página 1de 7

Conexes redundantes Internet utilizando Linux

Autor: MrBiTs <mrbits at linuxmasters.com.br> Data: 23/03/2005 Objetivos O presente documento destina-se a criar um balanceamento de duas conexes ADSL existentes em uma mesma mquina Linux . Ao seu final, o leitor estar capacitado a configurar uma mquina Linux contendo duas (ou mais) conexes ADSL, Cable ou similares (com IP fixo) de forma que essas conexes sejam utilizadas tanto para recepo quanto envio de informaes para a Internet, bem como serem utilizadas em balanceadores de carga no modelo Round Robin.

Introduo
Com o advento dos links de alta velocidade fcil hospedar servios em um computador domstico. Mas o que acontece quando o link cai? Uma soluo bvia possuir um link redundante de Internet com outro provedor e possuir a mquina configurada para trabalhar com esses dois links. Para configurar uma mquina Linux com conexo redundante Internet, esse artigo cobrir a configurao da mquina para trabalhar corretamente as conexes e balancear a carga entre os dois (ou mais) links. No fazem parte do escopo desse artigo a instalao do Linux e configuraes avanadas de firewall. O artigo presume que o leitor possua todos os conhecimentos necessrios de operaes em Linux, atravs de shell (linha de comando), criao de scripts, conhecimentos de TCP/IP e outras tarefas administrativas do sistema operacional. Presume que ambas as conexes Internet estejam ativas e, individualmente, funcionando. Presume que as interfaces de rede estejam corretamente configuradas.

Configuraes do kernel e pacotes adicionais Kernels das sries 2.2 ou superiores possuem suporte a tcnicas avanadas de roteamento requeridas configurao de load balance e rotas default mltiplas. As seguintes opes de networking do kernel devem estar ativadas e compiladas:

CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLE=y CONFIG_IP_ROUTE_MULTIPATH=y Os pacotes iptables e iproute devem ser instalados no sistema.

Ambiente de testes
Para testes das configuraes foi utilizado um Pentium III 800GHZ com 256MB RAM e 40GB HD. O host de produo uma mquina Pentium III 500, com 128MB RAM e 8GB HD, destinada exclusivamente s tarefas de roteamento e firewall. A mquina de testes possui Linux RedHat 8.0, com as atualizaes disponveis de rhn.redhat.com, kernel 2.4.27 customizado, iptables 1.2.8 e iproute 2.4.7. As conexes de internet utilizadas so: Virtua Double Flash 600, conectada a eth0; Switch 3COM 3300, conectado a eth1, para rede interna; Speedy Businness 600, conectada a eth2.

Definies e metodologia Por padro, pacotes TCP/IP so roteados a partir do exame do endereo IP de destino e verificao de uma rota para a rede de destino na tabela de roteamento. Essa tabela pode ser vista com o comando "netstat -r". Se uma rota encontrada, o pacote enviado para a interface de rede, seno o pacote enviado para o seu gateway default. Para a maioria dos sistemas conectados diretamente internet, o default gateway um ISP. Em nosso caso, isso significa que toda conexo de sada para a Internet vai para fora da interface DSL. Este no o comportamento desejado em um ambiente com conexes redundantes. Quando voc adiciona um cable modem ao seu sistema, voc no quer as conexes ao seu cable modem respondidas usando sua conexo DSL. Para solucionar esse comportamento, o sistema no pode possuir uma rota default nica. Deve possuir rotas estticas baseadas em regras pr-definidas pelo administrador ou deve poder rotear pacotes dinamicamente, baseado num algoritmo de roteamento de caminhos mltiplos (multipath routing algorithm) com pesos. Decidimo-nos pela segunda metodologia, por ser mais simples e possuir maior flexibilidade.

Configuraes de roteamento

Para nosso sistema de redundncia funcionar, devemos ter uma rota de caminhos mltiplos no sistema e tabelas de roteamento separadas que gerenciaro o trfego e o enviaro para a interface apropriada no tempo apropriado. Nosso trabalho inicia-se com as configuraes de variveis, que tornaro a vida um pouco mais fcil. Mas, antes, o sha-bang! #!/bin/bash echo "Configurando Variveis..." # Localizao do comando iptables IPTABLES=/sbin/iptables # Localizao 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 endereos IP das interfaces eth0 e eth2 no so os endereos 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 configurao 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 sero 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 criaro uma chave na tabela Mangle, chamada ETH0. Os terceiro e quarto comandos destinam-se a depurao 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 atravs 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 permitiro que os pacotes possuam os endereos 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 ns. De novo, a terceira linha serve apenas para depurao. A ltima linha a que realmente cuida do processamento. Ela certifica-se que o endereo IP de nossa primeira interface externa anexado a todo o trfego que ser roteado atravs 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) faa suas procuras atravs da marca 1, anteriormente adicionada ao pacote tcp/ip. O segundo comando adiciona uma tabela, 10, que tem como gateway padro o gateway especificado nas configuraes do script. Ento ele fez todos os pacotes receberem uma marca 1. Finalmente ele limpa a tabela de roteamento para termos um incio 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 tradues de endereamento (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 sada tenham seu endereo ip externo correto. Agora nos certificaremos de que a mquina tenha o seu gateway padro, que neste caso, uma rota de caminhos mltiplos:

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 no faz nada alm de dar mquina a habilidade de sair usando uma das duas rotas de caminho mltiplo com pesos iguais, isto , com probabilidades iguais. A ltima coisa que devemos fazer ter certeza de que a mquina faz o redirecionamento de pacotes corretamente e tambm 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 Concluso Agora somos capazes de enviar pacotes para ambas as interfaces igualmente. Se a mquina possuir servidores como HTTPD, NAMED, FTPD, entre outros, conexes para ambos os IPs devero funcionar corretamente. A partir desse esquema de trabalho, novas interfaces e conexes podem ser facilmente adicionadas. A expanso do trabalho, com adies de novas regras de iptables, nos possibilita rotear certo tipo de trafego para uma interface especfica, por exemplo.

Script completo O script completo pode ser baixado em: http://www.mrbits.com.br/tutoriais/redundantconn.sh

Inicializao do sistema
Com reduntantconn.sh salvo em /usr/local/bin, mude as suas permisses de execuo e adicione uma chamada a ele no arquivo rc.local de sua mquina para ativar todas as configuraes de conexes redundantes durante o boot.

http://www.vivaolinux.com.br/artigo/Conexoes-redundantes-a-Internet-utilizando-Linux Voltar para o site

Você também pode gostar