7
Conexões 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 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. Introdução Com o advento dos links de alta velocidade é fácil hospedar serviços em um computador doméstico. Mas o que acontece quando o link cai? Uma solução óbvia é possuir um link redundante de Internet com outro provedor e possuir a máquina configurada para trabalhar com esses dois links. Para configurar uma máquina Linux com conexão redundante à Internet, esse artigo cobrirá a configuração da máquina para trabalhar corretamente as conexões e balancear a carga entre os dois (ou mais) links. Não fazem parte do escopo desse artigo a instalação do Linux e configurações avançadas de firewall. O artigo presume que o leitor possua todos os conhecimentos necessários de operações em Linux, através de shell (linha de comando), criação de scripts, conhecimentos de TCP/IP e outras tarefas administrativas do sistema operacional. Presume que ambas as conexões Internet estejam ativas e, individualmente, funcionando. Presume que as interfaces de rede estejam corretamente configuradas. Configurações do kernel e pacotes adicionais Kernels das séries 2.2 ou superiores possuem suporte a técnicas avançadas de roteamento requeridas à configuração de load balance e rotas default múltiplas. As seguintes opções de networking do kernel devem estar ativadas e compiladas:

Conexões redundantes à Internet utilizando Linux [Artigo]

Embed Size (px)

Citation preview

Page 1: Conexões redundantes à Internet utilizando Linux [Artigo]

Conexões 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 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.

Introdução

Com o advento dos links de alta velocidade é fácil hospedar serviços em um computador doméstico. Mas o

que acontece quando o link cai? Uma solução óbvia é possuir um link redundante de Internet com outro

provedor e possuir a máquina configurada para trabalhar com esses dois links. Para configurar uma máquina

Linux com conexão redundante à Internet, esse artigo cobrirá a configuração da máquina para trabalharcorretamente as conexões e balancear a carga entre os dois (ou mais) links.

Não fazem parte do escopo desse artigo a instalação do Linux e configurações avançadas de firewall. O artigo

presume que o leitor possua todos os conhecimentos necessários de operações em Linux, através de shell (linha

de comando), criação de scripts, conhecimentos de TCP/IP e outras tarefas administrativas do sistema

operacional. Presume que ambas as conexões Internet estejam ativas e, individualmente, funcionando. Presume

que as interfaces de rede estejam corretamente configuradas.

Configurações do kernel e pacotes adicionais

Kernels das séries 2.2 ou superiores possuem suporte a técnicas avançadas de roteamento requeridas à

configuração de load balance e rotas default múltiplas. As seguintes opções de networking do kernel devem

estar ativadas e compiladas:

Page 2: Conexões redundantes à Internet utilizando Linux [Artigo]

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 configurações foi utilizado um Pentium III 800GHZ com 256MB RAM e 40GB HD. O host de

produção é uma máquina Pentium III 500, com 128MB RAM e 8GB HD, destinada exclusivamente às tarefas

de roteamento e firewall.

A máquina de testes possui Linux RedHat 8.0, com as atualizações disponíveis de rhn.redhat.com, kernel

2.4.27 customizado, iptables 1.2.8 e iproute 2.4.7. As conexões de internet utilizadas são:

Virtua Double Flash 600, conectada a eth0;Switch 3COM 3300, conectado a eth1, para rede interna;

Speedy Businness 600, conectada a eth2.

Definições e metodologia

Por padrão, pacotes TCP/IP são roteados a partir do exame do endereço IP de destino e verificação de uma

rota para a rede de destino na tabela de roteamento. Essa tabela pode ser vista com o comando "netstat -r". Seuma rota é encontrada, o pacote é enviado para a interface de rede, senão o pacote é enviado para o seugateway default.

Para a maioria dos sistemas conectados diretamente à internet, o default gateway é um ISP. Em nosso caso,

isso significa que toda conexão de saída para a Internet vai para fora da interface DSL. Este não é ocomportamento desejado em um ambiente com conexões redundantes. Quando você adiciona um cable modem

ao seu sistema, você não quer as conexões ao seu cable modem respondidas usando sua conexão DSL.

Para solucionar esse comportamento, o sistema não pode possuir uma rota default única. Deve possuir rotasestáticas baseadas em regras pré-definidas pelo administrador ou deve poder rotear pacotes dinamicamente,

baseado num algoritmo de roteamento de caminhos múltiplos (multipath routing algorithm) com pesos.Decidimo-nos pela segunda metodologia, por ser mais simples e possuir maior flexibilidade.

Configurações de roteamento

Page 3: Conexões redundantes à Internet utilizando Linux [Artigo]

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 tempoapropriado.

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 iptablesIPTABLES=/sbin/iptables

# Localização do comando ipIP=/sbin/ip

# Interface Externa 1 - VirtuaNET_EXT_INT0=eth0

# IP VirtuaNET_EXT_IP0=201.1.1.102# Default Gateway Virtua

NET_EXT_GW0=201.1.1.1

# Interface internaNET_INT_INT1=eth1

# IP internoNET_INT_IP1=192.168.0.1

# Subnet internaNET_INT_SUB1=24

# Rede internaNET_INT_NET1=192.168.0.0

# Interface externa 2 - SpeedyNET_EXT_INT2=eth2

# IP SpeedyNET_EXT_IP2=200.100.90.80

# Default Gateway SpeedyNET_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

Page 4: Conexões redundantes à Internet utilizando Linux [Artigo]

$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 primeiratabela 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 funcionandocorretamente. 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 é aque 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.

Page 5: Conexões redundantes à Internet utilizando Linux [Artigo]

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 umatabela, 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:

Page 6: Conexões redundantes à Internet utilizando Linux [Artigo]

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últiplocom 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

Conclusão

Agora somos capazes de enviar pacotes para ambas as interfaces igualmente. Se a máquina possuir servidores

como HTTPD, NAMED, FTPD, entre outros, conexões para ambos os IPs deverão funcionar corretamente.

A partir desse esquema de trabalho, novas interfaces e conexões podem ser facilmente adicionadas. A

expansão do trabalho, com adições de novas regras de iptables, nos possibilita rotear certo tipo de trafego para

uma interface específica, por exemplo.

Script completo

O script completo pode ser baixado em:

http://www.mrbits.com.br/tutoriais/redundantconn.sh

Inicialização do sistema

Com reduntantconn.sh salvo em /usr/local/bin, mude as suas permissões de execução e adicione umachamada a ele no arquivo rc.local de sua máquina para ativar todas as configurações de conexões redundantes

durante o boot.

Page 7: Conexões redundantes à Internet utilizando Linux [Artigo]

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

Voltar para o site