Nesse artigo mostrarei como configurar, iniciar e autenticar 2 (dois) links ADSL em um mesmo servidor, além de fazermos um balanceamento nesses links aliviando muito o tráfego de nossa rede. Falaremos também um pouco sobre roteamento avançado em Linux, pois iremos usar esse incrível recurso disponível para fazer o balanceamento.
Quando tive meu primeiro problema de alto tráfego em uma empresa que presto serviço, observei que precisaria usar algum recurso disponível no Linux para que eu pudesse contratar um segundo link de conexão com a internet, bem como utilizar os dois simultaneamente.
Tal empresa possuía um link ADSL (velox) de 1MB, porém o link estava ficando saturado em grande parte do dia (e isso porque já fazia controle de banda e cache de HTTP também!), dando para perceber a dimensão da rede. Meu objetivo era contratar mais um velox de 1MB, configurá-lo no mesmo servidor e construir um Advanced Router em Linux. O Kernel do Linux pode nos proporcionar a utilizar os recursos de roteamento dinâmico e roteamento estático.
* Característica de um Advanced Router fazendo roteamento dinâmico
1. Com o servidor tendo duas saídas de internet, o kernel iria utilizar as duas, porém para a primeira requisição que chegasse da LAN ele utilizaria a saida1 de internet, para a segunda requisição ele utilizaria a saida2, para a terceira requisição ele utilizaria a saida1 e assim por diante.
Eu teria uma desvantagem com esse recurso, pois suponhamos que se um IP fizesse uma requisição de download de um arquivo de 600MB e o mesmo fosse um IP de propriedade do dono da empresa, onde a sua velocidade de link configurada fosse de 512Kbps com prioridade máxima para esse IP. Quando o download fosse se estabelecer, ele obrigatoriamente teria que sair por um link, consumindo assim quase todo o recurso desse link. Porém, quando uma outra requisição fosse passar por esse link já saturado pela conexão do dono da empresa, a conexão ficaria lenta e quem desse a sorte de sair pela as outras iria se dar bem. Podemos observar nesse hipotético exemplo onde temos 2Links de 1MB cada, onde jamais iremos conseguir fazer um download com a taxa de 2MB e sim fazer 2 downloads com a taxa de 1MB cada.
Mesmo com essa desvantagem, eu queria utilizar esse recurso na empresa, pois não iria me preocupar com a queda de qualquer um dos links, pois o kernel já se encarrega de fazer os ajustes em suas rotas automaticamente. Mas depois de muito estudo e pesquisa, pude comprovar que esse recurso não funciona com NAT. Ou seja, ele funciona muito bem em uma rede com IP válido, onde o servidor faria realmente um papel de roteador. Não irei abordar nesse artigo por quê esse recurso não funciona com NAT, pois é um problema difícil de ser explicado e melhor entendido na prática (eu mesmo só fui entender vendo esse problema acontecer).
* Característica de um Advanced Router fazendo roteamento estático
1. Com o servidor tendo duas saídas de internet, o kernel poderia utilizar algumas classes ou IP's para sair especificamente pela saida1 ou saida2. Isso seria um roteamento feito por origem de IP's ou classes de uma rede.
Por exemplo: os IP's de origem sendo 10.12.0.10 e 10.12.0.11 teriam como rota específica a saida2 de internet ou as classes de origem sendo 10.13.0.0/24 e/ou 10.14.0.0/24 também teriam como rota específica a saida2 de internet.
2. Também poderia usar um excelente recurso de marcação de pacotes para fazermos o roteamento. Com isso, podemos marcar todos os pacotes com destino aos serviços http, pop, smtp, etc.... Sendo assim, podemos rotear esses pacotes marcados com um número qualquer pela saida2. Com isso podemos definir o seguinte esquema de roteamento:
Pacotes com destino aos serviços de http e https vão sair pela saida2 de internet e o restante irá sair pela saida1.
A pergunta que deve está na cabeça dos leitores que estão lendo artigo nesse exato momento é a seguinte:
E se um dos links cair? O kernel irá fazer a mudança de rota automaticamente?
R.: Não. Se um dos links cair, teremos que fazer a mudança de rota na mão mesmo. No final desse artigo iremos ver tudo isso na prática, onde as coisas irão ficar mais claras.
No meu caso, eu já sabia que o maior vilão de consumo de link era o protocolo http e em virtudes disso elaborei uma saída específica para esse serviço, sendo o link2. Os demais protocolos seriam roteados a saírem pelo link1.
O recurso de roteamento estático no kernel do Linux é extremamente estável, podendo ser adaptado para diferentes situações.
Nota: Estes recursos encontram-se disponíveis a partir da série de kernel 2.4.20 ou superior.
Antes de começar, gostaria de dizer que a distribuição usada para fazer a estrutura de um Advanced Router foi um Slackware 10.1 (instalação full), tendo como hardware um Pentium MMX com 64MB. Você pode construir seu servidor em qualquer distro, bastando apenas ter os seguintes pacotes instalados:
No Linux pode-se ter múltiplas tabelas de roteamento no kernel. Estas tabelas são identificadas por um número variando de 1 a 255 ou por um nome de acordo com o arquivo /etc/iproute2/rt_tables. Com novas tabelas pode-se criar uma flexível estrutura para implementar uma Política de Roteamento.
Abaixo temos o conteúdo do arquivo /etc/iproute2/rt_tables:
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
* 255 local: A tabela "local" contém rotas para endereços locais, esses endereços locais estão localizados no próprio computador, como os endereços que ele possui, a rede dele mesmo e seus broadcast. NUNCA, nunca manipule essa tabela ou retire-a da ordem nas regras. Ela não é útil para o roteamento de uma rede, só para o próprio computador.
* 254 main: Tabela de roteamento principal. É nela que que ficam as rotas quando adicionamos com o comando route ou ip route. Essa tabela armazena as rotas das redes disponíveis localmente, bem como a rota padrão adicionada com o comando route ou ip route.
* 253 default: A tabela "default" é uma tabela solitária, quase nunca é usada se você tem um "default gateway" na tabela "main".
Normalmente, quando existe um "default gateway" na tabela "main", um pacote nunca chega a tabela "default".
NOTA: NUNCA, nunca, nunca confunda tabela "default" com "default gateway". "default gateway" é uma rota dentro de uma tabela, "default" é uma tabela. Nome parecido para coisas diferentes.
Veremos agora a saída do comando ip route show table main:
# ip route show table main
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
Podemos ver que existem diferentes rotas dentro da tabela de roteamento main. Como já disse, essa é a tabela principal de roteamento do kernel e tem como default gateway o ip do roteador que é o 200.217.72.1, além de rotas para a rede local como a rede 10.12.0.0/24 que tem como destino de saída a interface eth0.
Agora vamos às regras:
Elas definem em que ordem as tabelas serão consultadas. A prioridade vai de 0 até 32767 em ordem crescente, o menor número tem maior prioridade.
As regras não tem nomes, apenas números de prioridade. Já as tabelas têm números e podem ser referenciadas por nomes no arquivo /etc/iproute2/rt_tables.
Por curiosidade iremos ver a saída do seguinte comando:
# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Temos que ficar atentos que números de tabelas nada têm a ver com número de regras. A regra 200 nada tem a ver com a tabela 200. Podemos observar também que podemos ver a prioridade das tabelas onde a tabela main possui uma prioridade maior que a tabela default (por ser a tabela principal de roteamento).
Nota: Quanto menor for o número, maior a prioridade de roteamento. Nesse caso a tabela "main" possui o número 32766, que é menor que 32767 e como conseqüência a tabela main tem prioridade maior que a tabela default. O valor máximo de prioridade é 32767, que por padrão já se encontra em uso, bastando apenas utilizarmos prioridades menores que 32766.
Para começarmos a brincar, vamos agora criar uma tabela de roteamento. Mas lembre-se que por enquanto nada vai acontecer com essa tabela, pois ainda não inserimos uma rota nela. Para criarmos uma tabela de roteamento, basta abrir o arquivo /etc/iproute2/rt_tables inserindo a seguinte linha em seu final:
200 velox2
O arquivo ficaria da seguinte forma:
# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
200 velox2
Pronto, criamos uma tabela de roteamento chamada velox2. Agora vamos ver o conteúdo dessa tabela com o seguinte comando:
# ip route show table velox2
Como vimos, esse comando não resultou em nada. Isso porque a tabela que acabamos de criar não possui rotas inseridas dentro dela. Para frisar, vamos rever a conteúdo da tabela de roteamento chamada main, que por sinal possui rotas e regras dentro dela:
# ip route show table main
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
Bom, já criamos nossa primeira tabela de roteamento. Espero que todos que estão lendo esse artigo consigam diferenciar tabelas de roteamento sobre rotas ou regras dentro de uma tabela de roteamento. Também tentei explicar a função da tabela de roteamento main e as rotas contidas dentro dela, mas que ficarão claras no final do artigo, onde faremos isso tudo na prática.
No próximo capítulo, iremos configurar as duas conexões ADSL no mesmo servidor e inserir uma rota na tabela de roteamento que criamos.
Primeiramente vamos configurar apenas uma conexão para ficar mais fácil de entender. Iremos assumir também que o tipo de velox a ser configurado é empresarial e vamos baixar um autenticador configurado para autenticar no empresarial. Você só deve ajustá-lo caso não seja do Rio de Janeiro, pois esse se encontra configurado para se autenticar pelo Rio. Baixe o autenticador em:
Assumirei nesse exemplo as seguintes configurações:
* eth0 --> LAN (10.12.0.0/16);
* eth1 --> Ligada ao Modem ADSL 1;
* eth2 --> Ligada ao Modem ADSL 2.
Iremos digitar o seguinte comando para configurar a primeira conexão ADSL:
# adsl-setup
Welcome to the Roaring Penguin ADSL client setup. First, I will run some checks on your system to make sure the PPPoE client is installed properly...
Looks good! Now, please enter some information:
USER NAME
>>> Enter your PPPoE user name:
Nesse ponto colocamos o número do telefone como login. Ex: 2126xxxxxx
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth1):
Nesse ponto dizemos que o modem1 está com sua conexão de rede ligada em eth1.
>>> Enter the demand value (default no):
Só pressionar <enter>
>>> Enter the DNS information here:
Digite a palavra 'server', assim dizemos que iremos receber via DHCP um servidor DNS.
>>> Please enter your PPPoE password:
Número do telefone como senha.
>>> Please re-enter your PPPoE password:
Redigite o numero do telefone.
>>> Choose a type of firewall (0-2):
Escolha a opção 0 (zero).
>>> Accept these settings and adjust configuration files (y/n)?
Digite 'y' para salvar suas configurações.
Pronto. Nosso primeiro velox já está configurado. Repare que ele gerou um arquivo /etc/ppp/pppoe.conf e um outro arquivo chamado /etc/ppp/pap-secrets.
O arquivo /etc/ppp/pppoe.conf trata da configuração da conexão ADSL. O arquivo /etc/ppp/pap-secrets armazena os logins e senhas da conexão ADSL.
Dê uma olhada no conteúdo dos dois arquivos. Abaixo eu resumi o meu arquivo pppoe.conf com as opções que iremos utilizar e pap-secrets:
# vim /etc/ppp/pppoe.conf
ETH='eth1'
USER='212xxxxxx'
DEMAND=no
DNSTYPE=SERVER
PEERDNS=yes
DNS1=
DNS2=
DEFAULTROUTE=yes
CONNECT_TIMEOUT=30
CONNECT_POLL=2
ACNAME=
SERVICENAME=
PING="."
CF_BASE=`basename $CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
SYNCHRONOUS=no
CLAMPMSS=1412
LCP_INTERVAL=20
LCP_FAILURE=3
PPPOE_TIMEOUT=80
FIREWALL=NONE
LINUX_PLUGIN=
PPPOE_EXTRA=""
PPPD_EXTRA=""
# vim /etc/ppp/pap-secrets
# PAP authentication file: /etc/ppp/pap-secrets
# This file should have a permission of 600.
# ~# chmod 600 /etc/ppp/pap-secrets
# Username Server Password IP addresses
"216xxxxxx" * "216xxxxxx"
Nota: Ainda estamos na configuração do primeiro link ADSL. Por hora está tudo configurado para subir o primeiro link ADSL, porém estou fazendo questão em dar ênfase no conteúdo desses dois arquivos porque iremos trabalhar somente com esses dois para configurarmos o segundo link ADSL.
Agora iremos subir o link ADSL com o comando adsl-start e depois veremos se tudo ocorreu bem com o comando ifconfig ppp0:
Pronto. Se aparecer algo assim, sua primeira conexão ADSL já subiu e está pronta para ser autenticada. Agora iremos autenticar a conexão com o script que citei no início desse capítulo. Autentique com o seguinte comando:
# ./velox.pl
Se tudo ocorrer bem, sua conexão foi autenticada corretamente e seu Linux já está pronto para navegar na internet, porém ainda não irá compartilhar a conexão com a rede local porque ainda não fizemos o NAT. Agora partiremos para a configuração do segundo link ADSL.
Nesse ponto eu já sei que o primeiro link ADSL (ppp0) está levantado e autenticado. Falta então subir o segundo link ADSL (ppp1) e autenticá-lo. Defini que a rota padrão seria a ppp0 e ppp1 seria uma segunda rota, porém eu iria utilizar o link ppp1 como saída do protocolo http.
É importante dizer, que todo o pacote gerado no próprio servidor ou localhost, vai sair especificamente pelo ppp0, pois eu falei no início desse artigo que os pacotes gerados pelo localhost não entram na tabela que criamos e porque o script de autenticação vai ser executado no próprio servidor. Por isso, todo pacote gerado no localhost sairá pelo primeiro link ADSL(ppp0).
A maior dificuldade nessas horas é com a maldita autenticação que a telemar exige no seu serviço ADSL (velox). Com isso, só iremos conseguir autenticar o link ppp1 excluindo a rota padrão ppp0 e incluindo a rota padrão com ppp1. Em seguida rodamos o script de autenticação para autenticar ppp1 e depois excluímos a rota padrão ppp1 e adicionamos novamente a rota padrão ppp0. Você vai entender melhor isso na prática, onde iremos fazer com um exemplo.
Por hora vamos nos encarregar de subir o segundo link ADSL (ppp1). Primeiro faça uma cópia do seu arquivo pppoe.conf, pois iremos subir o segundo link ADSL(ppp1) em cima do arquivo de configuração que iremos criar agora.
# cp /etc/ppp/pppoe.conf /etc/ppp/pppoe2.conf
Mostrarei agora como ficaria o conteúdo desse segundo arquivo e aí você faz uma comparação com o primeiro e veja o que mudou (basicamente muda muito pouco).
# vim /etc/ppp/pppoe2.conf
#(aqui eu digo que modem2 está ligado na eth2 'muito lógico')
ETH='eth2'
#(boto o número do telefone da segunda linha)
USER='212yyyyyyy'
DEMAND=no
DNSTYPE=SERVER
PEERDNS=yes
DNS1=
DNS2=
#abaixo digo para o roteador não me passar
# uma rota padrão, pois defini em minhas políticas que a
# rota padrão é o da ppp0. Por isso não quero que o roteador
# me passe um gateway padrão.
DEFAULTROUTE=no
CONNECT_TIMEOUT=30
CONNECT_POLL=2
ACNAME=
SERVICENAME=
PING="."
CF_BASE=`basename $CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
SYNCHRONOUS=no
CLAMPMSS=1412
LCP_INTERVAL=20
LCP_FAILURE=3
PPPOE_TIMEOUT=80
FIREWALL=NONE
LINUX_PLUGIN=
PPPOE_EXTRA=""
PPPD_EXTRA=""
Feito isso, basta apenas adicionar em /etc/ppp/pap-secrets o segundo login e senha (que é o número do segundo telefone). Veja como ficou meu pap-secrets:
# vim /etc/ppp/pap-secrets
# PAP authentication file: /etc/ppp/pap-secrets
# This file should have a permission of 600.
# ~# chmod 600 /etc/ppp/pap-secrets
# Username Server Password IP addresses
"216xxxxxx" * "216xxxxxx"
"216yyyyyy" * "216yyyyyy"
Nosso segundo velox já possui arquivo de configuração para ele, faltando apenas um último passo. Execute os seguintes comandos:
Em seguida abra o script adsl-start2 e modifique dentro dele as seguintes linhas:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf;
* Onde estiver setado para usar o arquivo adsl-connect, mude para adsl-connect2;
* Onde estiver setado para usar o arquivo adsl-status, mude para adsl-status2.
Agora abra o script adsl-status2 e modifique dentro dele a única linha:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf.
Agora abra o script adsl-connect2 e modifique dentro dele a única linha:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf.
Agora abra o script adsl-stop2 e modifique dentro dele a única linha:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf.
Feito isso, já estamos prontos para subirmos nosso segundo link ADSL (ppp1). Vai ter que ficar da seguinte maneira:
* O script adsl-start levantará o primeiro link ADSL(ppp0);
* O script adsl-stop derrubará ppp0;
* O script adsl-start2 levantará o segundo link ADSL(ppp1);
* O script adsl-stop2 derrubará ppp1.
Antes de subir o segundo link ADSL(ppp1), vamos dar uma olhada na nossa tabela principal de roteamento (tabela main), pois no momento iremos nos concentrar somente nela para que podemos autenticar nossos dois links ADSL.
No momento vamos ver como se encontra a tabela de roteamento main antes de subimos o segundo velox e depois subiremos o segundo link ADSL (ppp1), onde veremos novamente o conteúdo dessa mesma tabela:
# ip route show table main
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
Como podemos observar no novo conteúdo da tabela de roteamento main, o segundo link ADSL (ppp1) se encontra como uma rota de saída dentro da tabela main, mas não é a rota padrão dessa tabela, afinal a rota padrão dessa tabela ainda pertence ao primeiro link ADSL (ppp0).
Também temos que autenticar o segundo link ADSL (ppp1) para que o mesmo esteja disponível para tráfego. Para executarmos essa tarefa, temos que primeiro excluir a rota padrão da tabela main. Observe a seguinte seqüência de comandos que se encarrega de fazer isso. Assim, você vai se adaptar às suas necessidades:
# ip route del default dev ppp0 via 200.217.72.1 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
# ip route add default dev ppp1 via 200.217.72.56 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.56 dev ppp1
# ./velox.pl
# ip route del default dev ppp1 via 200.217.72.56 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
# ip route add default dev ppp0 via 200.217.72.1 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
No exemplo acima fiz um passo a passo para vermos como funciona o processo de autenticação de 2 velox. Já que agora estamos com os 2 velox configurados e autenticados, vamos adicionar uma rota na tabela de roteamento que criamos chamada "velox2".
O procedimento acima é necessário ser feito toda vez que seu link ADSL cair (independente se for ppp0 ou ppp1). A solução para isso é que o daemon pppd invoca toda vez que ele consegue estabelecer uma conexão o script /etc/ppp/ip-up e /etc/ppp/ip-down caso a conexão caia. Ele também passa parâmetros para esse script como ip do gateway, se conexão é ppp0 ou ppp1, ip da interface ppp0 ou ppp1, dentre outros.
O mais interessante nisso tudo é que quando subimos uma conexão ADSL no Linux, ficam residentes 3 processos referentes à ela. São eles:
* adsl-connect
* pppd
* pppoe
Muitos já devem ter ouvido falar que o velox funciona muito melhor no Linux do que no Windows, mas a minoria sabe explicar o por quê? Depois de muitos dias pesquisando, fui descobrir que o protocolo PPP instalado no Linux possui algoritmos internamente para checar se existe algum problema no meio físico de uma conexão assíncrona. Podem acreditar, pois mesmo sem passar um byte qualquer no canal estabelecido, esse protocolo consegue identificar se existe problema no meio físico. Sendo assim, os processos pppd e pppoe caem caso exista algum erro no meio físico ou coisas parecidas como um problema no modem ADSL. Porém, o processo adsl-connect fica tentando de tempos em tempos subir a conexão ppp e quando essa se estabelece, automaticamente o pppd passa os parâmetros já citados para o script /etc/ppp/ip-up.
Por isso é só você fazer seus scripts para reautenticação caso um deles caiam. Eu já fiz os meus, onde se um cair ele muda de rota automaticamente para o link que ficar de pé e vice versa, além de também serem feitas as reautenticações. No próximo capítulo faremos o NAT e iremos mexer com a nossa tabela de roteamento que criamos.
Primeiramente devemos mexer em algumas variáveis de kernel. O seguinte comando ativa o roteamento no kernel:
# echo 1 > /proc/sys/net/ipv4/ip_forward
O procedimento abaixo desliga o rp_filter, que é um filtro contra pacotes IP "marcianos". Esses pacotes são aqueles que deveriam ter chegado por uma interface, porém chegam por outra. O rp_filter visa detectar pacotes spoofados, o que é uma boa idéia. Porém, no nosso caso, os pacotes podem ir e voltar por mais de uma interface, a filtragem do "cartesiana" do rp_filter falha. Portanto, temos que desligá-lo e reforçarmos as segurança das interface privadas com regras de firewall criadas por nós. Iremos fazer esse desligamento criando um script chamado "rc.marcianos" com o seguinte conteúdo e sem seguida execute esse script:
NOTA: Nada vai acontecer quando você executar esse script, por isso não se assuste.
#!/bin/bash
# liberar marcianos
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
/usr/bin/echo 0 > $i
done
Inserindo uma rota na nova tabela de roteamento
Lembra que lá no início nós criamos uma tabela de roteamento chamada "velox2"?! Agora nós vamos inserir um rota nessa tabela, para depois então inserirmos uma regra nela. Mas antes vamos listar o conteúdo dela:
# ip route show table velox2
Como vimos, não existe nenhuma rota na tabela de roteamento velox2. Agora vamos inserir uma rota default nessa tabela e em seguida visualizar novamente o conteúdo dessa tabela de roteamento:
# ip route add default dev ppp1 via 200.217.76.56 table velox2 # ip route show table velox2
default via 200.217.72.56 dev ppp1
Pronto, a rota já foi criada nessa tabela. Falta apenas inserirmos uma regra para essa rota que acabamos de criar na tabela de roteamento velox2.
Inserindo uma regra na nova tabela de roteamento
Primeiramente, vamos marcar todos os pacotes provenientes da LAN com destino aos serviços http com a seguinte regra de iptables e logo em seguida irei inserir uma regra nessa tabela de roteamento. Observe a seqüência de comandos:
# iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
Bom, a tabela tem uma rota, os pacotes já estão marcados, mas nenhum pacote vai cair nela, pois não há regras para isso, então temos que colocá-la:
# ip rule add fwmark 1 lookup velox2
Depois de qualquer mudança nas tabelas de roteamento, e necessário digitarmos o comando abaixo para as novas regras vigorarem.
# ip route flush cached
Tudo pronto, agora só falta fazer o NAT para que as máquinas da LAN possam acessar a internet, sendo que os pacotes com destino a porta 80 sairão pela interface ppp1 e os demais sairão pela interface ppp0.
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
Da forma que fizemos agora, todos os pacotes com destino a serviços http sairão pelo segundo link (ppp1) e o restante irá sair pelo primeiro link (ppp0). A rota padrão na tabela main é ppp0 e a rota padrão da tabela "velox2" é ppp1.
Suponhamos que eu quero retirar a regra que incluirmos na tabela "velox2" fazendo com que todo o tráfego saia pelo primeiro link (ppp0). Observem a seguinte seqüência de comandos:
# ip rule del fwmark 1 lookup velox2
# ip route flush cached
Pronto. Todo o tráfego já está saindo nesse momento pelo primeiro link (ppp0). Repare que só excluindo a regra que inserimos na tabela "velox2" deixa a rota default na tabela "velox1". Ou seja, podemos inserir quantas rotas quisermos, mas de nada adianta se não existirem regras para utilização dessas rotas.
Agora irei fazer diferente. Como excluir a regra que tinha colocado na tabela "velox2", terei que criá-la novamente, porém irei fazer um roteamento por ip de origem para flexibilizar um pouco mais o artigo. Observe a seguinte seqüência de comandos:
# ip rule add from 10.12.0.20 lookup velox2
# ip rule add from 10.12.0.21 lookup velox2
# ip rule add from 10.12.0.22 lookup velox2
# ip route flush cached
Como podemos observar, inseri regras na tabela "velox2" dizendo que todos os pacotes cujo ip de origem seja 10.12.0.20, 10.12.0.21 e 10.12.0.22 devem sair pelo segundo link de internet (ppp1). Posso também atribuir uma regra para uma rede inteira.
NOTA: Eu não precisaria excluir a primeira regra referente a marcação de pacotes que criei pela primeira vez. Poderia muito bem deixar saindo pelo segundo link (ppp1) todos os pacotes com destino aos serviços de http além dos ip´s 10.12.0.20, 10.12.0.21 e 10.12.0.22.
Nesse capítulo pretendi abordar o básico sobre Advanced Router. Todos sabemos que a documentação sobre o pacote iproute2 é bastante escassa. Falta falar sobre prioridades de regras, custo de roteamento dentre outros. Mas quem quiser aprender mais sobre esses recursos, é só da uma pesquisada na internet que irá achar bastante.
Também decidi escrever aqui em cima do velox, pois tive uma certa dificuldade para configurar e autenticar 2 velox em um mesmo servidor, mas nada impede de você usar esses recursos em links dedicados mesmo (o que funcionaria melhor devido a não necessidade de autenticação).
Espero que ao lerem esse artigo, consigam visualizar com um pouco mais de clareza esse recurso fantástico disponível no kernel do Linux, podendo adaptar as suas necessidades de implementação.
Pergunta
Hayxonz
Nesse artigo mostrarei como configurar, iniciar e autenticar 2 (dois) links ADSL em um mesmo servidor, além de fazermos um balanceamento nesses links aliviando muito o tráfego de nossa rede. Falaremos também um pouco sobre roteamento avançado em Linux, pois iremos usar esse incrível recurso disponível para fazer o balanceamento.
Quando tive meu primeiro problema de alto tráfego em uma empresa que presto serviço, observei que precisaria usar algum recurso disponível no Linux para que eu pudesse contratar um segundo link de conexão com a internet, bem como utilizar os dois simultaneamente.
Tal empresa possuía um link ADSL (velox) de 1MB, porém o link estava ficando saturado em grande parte do dia (e isso porque já fazia controle de banda e cache de HTTP também!), dando para perceber a dimensão da rede. Meu objetivo era contratar mais um velox de 1MB, configurá-lo no mesmo servidor e construir um Advanced Router em Linux. O Kernel do Linux pode nos proporcionar a utilizar os recursos de roteamento dinâmico e roteamento estático.
* Característica de um Advanced Router fazendo roteamento dinâmico
1. Com o servidor tendo duas saídas de internet, o kernel iria utilizar as duas, porém para a primeira requisição que chegasse da LAN ele utilizaria a saida1 de internet, para a segunda requisição ele utilizaria a saida2, para a terceira requisição ele utilizaria a saida1 e assim por diante.
Eu teria uma desvantagem com esse recurso, pois suponhamos que se um IP fizesse uma requisição de download de um arquivo de 600MB e o mesmo fosse um IP de propriedade do dono da empresa, onde a sua velocidade de link configurada fosse de 512Kbps com prioridade máxima para esse IP. Quando o download fosse se estabelecer, ele obrigatoriamente teria que sair por um link, consumindo assim quase todo o recurso desse link. Porém, quando uma outra requisição fosse passar por esse link já saturado pela conexão do dono da empresa, a conexão ficaria lenta e quem desse a sorte de sair pela as outras iria se dar bem. Podemos observar nesse hipotético exemplo onde temos 2Links de 1MB cada, onde jamais iremos conseguir fazer um download com a taxa de 2MB e sim fazer 2 downloads com a taxa de 1MB cada.
Mesmo com essa desvantagem, eu queria utilizar esse recurso na empresa, pois não iria me preocupar com a queda de qualquer um dos links, pois o kernel já se encarrega de fazer os ajustes em suas rotas automaticamente. Mas depois de muito estudo e pesquisa, pude comprovar que esse recurso não funciona com NAT. Ou seja, ele funciona muito bem em uma rede com IP válido, onde o servidor faria realmente um papel de roteador. Não irei abordar nesse artigo por quê esse recurso não funciona com NAT, pois é um problema difícil de ser explicado e melhor entendido na prática (eu mesmo só fui entender vendo esse problema acontecer).
* Característica de um Advanced Router fazendo roteamento estático
1. Com o servidor tendo duas saídas de internet, o kernel poderia utilizar algumas classes ou IP's para sair especificamente pela saida1 ou saida2. Isso seria um roteamento feito por origem de IP's ou classes de uma rede.
Por exemplo: os IP's de origem sendo 10.12.0.10 e 10.12.0.11 teriam como rota específica a saida2 de internet ou as classes de origem sendo 10.13.0.0/24 e/ou 10.14.0.0/24 também teriam como rota específica a saida2 de internet.
2. Também poderia usar um excelente recurso de marcação de pacotes para fazermos o roteamento. Com isso, podemos marcar todos os pacotes com destino aos serviços http, pop, smtp, etc.... Sendo assim, podemos rotear esses pacotes marcados com um número qualquer pela saida2. Com isso podemos definir o seguinte esquema de roteamento:
Pacotes com destino aos serviços de http e https vão sair pela saida2 de internet e o restante irá sair pela saida1.
A pergunta que deve está na cabeça dos leitores que estão lendo artigo nesse exato momento é a seguinte:
E se um dos links cair? O kernel irá fazer a mudança de rota automaticamente?
R.: Não. Se um dos links cair, teremos que fazer a mudança de rota na mão mesmo. No final desse artigo iremos ver tudo isso na prática, onde as coisas irão ficar mais claras.
No meu caso, eu já sabia que o maior vilão de consumo de link era o protocolo http e em virtudes disso elaborei uma saída específica para esse serviço, sendo o link2. Os demais protocolos seriam roteados a saírem pelo link1.
O recurso de roteamento estático no kernel do Linux é extremamente estável, podendo ser adaptado para diferentes situações.
Nota: Estes recursos encontram-se disponíveis a partir da série de kernel 2.4.20 ou superior.
Antes de começar, gostaria de dizer que a distribuição usada para fazer a estrutura de um Advanced Router foi um Slackware 10.1 (instalação full), tendo como hardware um Pentium MMX com 64MB. Você pode construir seu servidor em qualquer distro, bastando apenas ter os seguintes pacotes instalados:
* iptables 1.2.7 ou superior
* iproute2
* rp-pppoe-3.x (para configurarmos nossa conexão ADSL)
Tabelas de roteamento
No Linux pode-se ter múltiplas tabelas de roteamento no kernel. Estas tabelas são identificadas por um número variando de 1 a 255 ou por um nome de acordo com o arquivo /etc/iproute2/rt_tables. Com novas tabelas pode-se criar uma flexível estrutura para implementar uma Política de Roteamento.
Abaixo temos o conteúdo do arquivo /etc/iproute2/rt_tables:
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
* 255 local: A tabela "local" contém rotas para endereços locais, esses endereços locais estão localizados no próprio computador, como os endereços que ele possui, a rede dele mesmo e seus broadcast. NUNCA, nunca manipule essa tabela ou retire-a da ordem nas regras. Ela não é útil para o roteamento de uma rede, só para o próprio computador.
* 254 main: Tabela de roteamento principal. É nela que que ficam as rotas quando adicionamos com o comando route ou ip route. Essa tabela armazena as rotas das redes disponíveis localmente, bem como a rota padrão adicionada com o comando route ou ip route.
* 253 default: A tabela "default" é uma tabela solitária, quase nunca é usada se você tem um "default gateway" na tabela "main".
Normalmente, quando existe um "default gateway" na tabela "main", um pacote nunca chega a tabela "default".
NOTA: NUNCA, nunca, nunca confunda tabela "default" com "default gateway". "default gateway" é uma rota dentro de uma tabela, "default" é uma tabela. Nome parecido para coisas diferentes.
Veremos agora a saída do comando ip route show table main:
# ip route show table main
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
Podemos ver que existem diferentes rotas dentro da tabela de roteamento main. Como já disse, essa é a tabela principal de roteamento do kernel e tem como default gateway o ip do roteador que é o 200.217.72.1, além de rotas para a rede local como a rede 10.12.0.0/24 que tem como destino de saída a interface eth0.
Agora vamos às regras:
Elas definem em que ordem as tabelas serão consultadas. A prioridade vai de 0 até 32767 em ordem crescente, o menor número tem maior prioridade.
As regras não tem nomes, apenas números de prioridade. Já as tabelas têm números e podem ser referenciadas por nomes no arquivo /etc/iproute2/rt_tables.
Por curiosidade iremos ver a saída do seguinte comando:
# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Temos que ficar atentos que números de tabelas nada têm a ver com número de regras. A regra 200 nada tem a ver com a tabela 200. Podemos observar também que podemos ver a prioridade das tabelas onde a tabela main possui uma prioridade maior que a tabela default (por ser a tabela principal de roteamento).
Nota: Quanto menor for o número, maior a prioridade de roteamento. Nesse caso a tabela "main" possui o número 32766, que é menor que 32767 e como conseqüência a tabela main tem prioridade maior que a tabela default. O valor máximo de prioridade é 32767, que por padrão já se encontra em uso, bastando apenas utilizarmos prioridades menores que 32766.
Para começarmos a brincar, vamos agora criar uma tabela de roteamento. Mas lembre-se que por enquanto nada vai acontecer com essa tabela, pois ainda não inserimos uma rota nela. Para criarmos uma tabela de roteamento, basta abrir o arquivo /etc/iproute2/rt_tables inserindo a seguinte linha em seu final:
200 velox2
O arquivo ficaria da seguinte forma:
# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
200 velox2
Pronto, criamos uma tabela de roteamento chamada velox2. Agora vamos ver o conteúdo dessa tabela com o seguinte comando:
# ip route show table velox2
Como vimos, esse comando não resultou em nada. Isso porque a tabela que acabamos de criar não possui rotas inseridas dentro dela. Para frisar, vamos rever a conteúdo da tabela de roteamento chamada main, que por sinal possui rotas e regras dentro dela:
# ip route show table main
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
Bom, já criamos nossa primeira tabela de roteamento. Espero que todos que estão lendo esse artigo consigam diferenciar tabelas de roteamento sobre rotas ou regras dentro de uma tabela de roteamento. Também tentei explicar a função da tabela de roteamento main e as rotas contidas dentro dela, mas que ficarão claras no final do artigo, onde faremos isso tudo na prática.
No próximo capítulo, iremos configurar as duas conexões ADSL no mesmo servidor e inserir uma rota na tabela de roteamento que criamos.
Primeiramente vamos configurar apenas uma conexão para ficar mais fácil de entender. Iremos assumir também que o tipo de velox a ser configurado é empresarial e vamos baixar um autenticador configurado para autenticar no empresarial. Você só deve ajustá-lo caso não seja do Rio de Janeiro, pois esse se encontra configurado para se autenticar pelo Rio. Baixe o autenticador em:
* http://www.guilherme.eti.br/velox.pl
Assumirei nesse exemplo as seguintes configurações:
* eth0 --> LAN (10.12.0.0/16);
* eth1 --> Ligada ao Modem ADSL 1;
* eth2 --> Ligada ao Modem ADSL 2.
Iremos digitar o seguinte comando para configurar a primeira conexão ADSL:
# adsl-setup
Welcome to the Roaring Penguin ADSL client setup. First, I will run some checks on your system to make sure the PPPoE client is installed properly...
Looks good! Now, please enter some information:
USER NAME
>>> Enter your PPPoE user name:
Nesse ponto colocamos o número do telefone como login. Ex: 2126xxxxxx
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth1):
Nesse ponto dizemos que o modem1 está com sua conexão de rede ligada em eth1.
>>> Enter the demand value (default no):
Só pressionar <enter>
>>> Enter the DNS information here:
Digite a palavra 'server', assim dizemos que iremos receber via DHCP um servidor DNS.
>>> Please enter your PPPoE password:
Número do telefone como senha.
>>> Please re-enter your PPPoE password:
Redigite o numero do telefone.
>>> Choose a type of firewall (0-2):
Escolha a opção 0 (zero).
>>> Accept these settings and adjust configuration files (y/n)?
Digite 'y' para salvar suas configurações.
Pronto. Nosso primeiro velox já está configurado. Repare que ele gerou um arquivo /etc/ppp/pppoe.conf e um outro arquivo chamado /etc/ppp/pap-secrets.
O arquivo /etc/ppp/pppoe.conf trata da configuração da conexão ADSL. O arquivo /etc/ppp/pap-secrets armazena os logins e senhas da conexão ADSL.
Dê uma olhada no conteúdo dos dois arquivos. Abaixo eu resumi o meu arquivo pppoe.conf com as opções que iremos utilizar e pap-secrets:
# vim /etc/ppp/pppoe.conf
ETH='eth1'
USER='212xxxxxx'
DEMAND=no
DNSTYPE=SERVER
PEERDNS=yes
DNS1=
DNS2=
DEFAULTROUTE=yes
CONNECT_TIMEOUT=30
CONNECT_POLL=2
ACNAME=
SERVICENAME=
PING="."
CF_BASE=`basename $CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
SYNCHRONOUS=no
CLAMPMSS=1412
LCP_INTERVAL=20
LCP_FAILURE=3
PPPOE_TIMEOUT=80
FIREWALL=NONE
LINUX_PLUGIN=
PPPOE_EXTRA=""
PPPD_EXTRA=""
# vim /etc/ppp/pap-secrets
# PAP authentication file: /etc/ppp/pap-secrets
# This file should have a permission of 600.
# ~# chmod 600 /etc/ppp/pap-secrets
# Username Server Password IP addresses
"216xxxxxx" * "216xxxxxx"
Nota: Ainda estamos na configuração do primeiro link ADSL. Por hora está tudo configurado para subir o primeiro link ADSL, porém estou fazendo questão em dar ênfase no conteúdo desses dois arquivos porque iremos trabalhar somente com esses dois para configurarmos o segundo link ADSL.
Agora iremos subir o link ADSL com o comando adsl-start e depois veremos se tudo ocorreu bem com o comando ifconfig ppp0:
# adsl-start
# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr: 200.164.113.232 P-t-P:200.217.72.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:8330 errors:0 dropped:0 overruns:0 frame:0
TX packets:9678 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:3204411 (3.0 Mb) TX bytes:1071164 (1.0 Mb)
Pronto. Se aparecer algo assim, sua primeira conexão ADSL já subiu e está pronta para ser autenticada. Agora iremos autenticar a conexão com o script que citei no início desse capítulo. Autentique com o seguinte comando:
# ./velox.pl
Se tudo ocorrer bem, sua conexão foi autenticada corretamente e seu Linux já está pronto para navegar na internet, porém ainda não irá compartilhar a conexão com a rede local porque ainda não fizemos o NAT. Agora partiremos para a configuração do segundo link ADSL.
Nesse ponto eu já sei que o primeiro link ADSL (ppp0) está levantado e autenticado. Falta então subir o segundo link ADSL (ppp1) e autenticá-lo. Defini que a rota padrão seria a ppp0 e ppp1 seria uma segunda rota, porém eu iria utilizar o link ppp1 como saída do protocolo http.
É importante dizer, que todo o pacote gerado no próprio servidor ou localhost, vai sair especificamente pelo ppp0, pois eu falei no início desse artigo que os pacotes gerados pelo localhost não entram na tabela que criamos e porque o script de autenticação vai ser executado no próprio servidor. Por isso, todo pacote gerado no localhost sairá pelo primeiro link ADSL(ppp0).
A maior dificuldade nessas horas é com a maldita autenticação que a telemar exige no seu serviço ADSL (velox). Com isso, só iremos conseguir autenticar o link ppp1 excluindo a rota padrão ppp0 e incluindo a rota padrão com ppp1. Em seguida rodamos o script de autenticação para autenticar ppp1 e depois excluímos a rota padrão ppp1 e adicionamos novamente a rota padrão ppp0. Você vai entender melhor isso na prática, onde iremos fazer com um exemplo.
Por hora vamos nos encarregar de subir o segundo link ADSL (ppp1). Primeiro faça uma cópia do seu arquivo pppoe.conf, pois iremos subir o segundo link ADSL(ppp1) em cima do arquivo de configuração que iremos criar agora.
# cp /etc/ppp/pppoe.conf /etc/ppp/pppoe2.conf
Mostrarei agora como ficaria o conteúdo desse segundo arquivo e aí você faz uma comparação com o primeiro e veja o que mudou (basicamente muda muito pouco).
# vim /etc/ppp/pppoe2.conf
#(aqui eu digo que modem2 está ligado na eth2 'muito lógico')
ETH='eth2'
#(boto o número do telefone da segunda linha)
USER='212yyyyyyy'
DEMAND=no
DNSTYPE=SERVER
PEERDNS=yes
DNS1=
DNS2=
#abaixo digo para o roteador não me passar
# uma rota padrão, pois defini em minhas políticas que a
# rota padrão é o da ppp0. Por isso não quero que o roteador
# me passe um gateway padrão.
DEFAULTROUTE=no
CONNECT_TIMEOUT=30
CONNECT_POLL=2
ACNAME=
SERVICENAME=
PING="."
CF_BASE=`basename $CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
SYNCHRONOUS=no
CLAMPMSS=1412
LCP_INTERVAL=20
LCP_FAILURE=3
PPPOE_TIMEOUT=80
FIREWALL=NONE
LINUX_PLUGIN=
PPPOE_EXTRA=""
PPPD_EXTRA=""
Feito isso, basta apenas adicionar em /etc/ppp/pap-secrets o segundo login e senha (que é o número do segundo telefone). Veja como ficou meu pap-secrets:
# vim /etc/ppp/pap-secrets
# PAP authentication file: /etc/ppp/pap-secrets
# This file should have a permission of 600.
# ~# chmod 600 /etc/ppp/pap-secrets
# Username Server Password IP addresses
"216xxxxxx" * "216xxxxxx"
"216yyyyyy" * "216yyyyyy"
Nosso segundo velox já possui arquivo de configuração para ele, faltando apenas um último passo. Execute os seguintes comandos:
# cp /usr/sbin/adsl-connect /usr/sbin/adsl-connect2
# cp /usr/sbin/adsl-start /usr/sbin/adsl-start2
# cp /usr/sbin/adsl-stop /usr/sbin/adsl-stop2
# cp /usr/sbin/adsl-status /usr/sbin/adsl-status2
Em seguida abra o script adsl-start2 e modifique dentro dele as seguintes linhas:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf;
* Onde estiver setado para usar o arquivo adsl-connect, mude para adsl-connect2;
* Onde estiver setado para usar o arquivo adsl-status, mude para adsl-status2.
Agora abra o script adsl-status2 e modifique dentro dele a única linha:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf.
Agora abra o script adsl-connect2 e modifique dentro dele a única linha:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf.
Agora abra o script adsl-stop2 e modifique dentro dele a única linha:
* Onde estiver setado para usar o arquivo pppoe.conf, mude para pppoe2.conf.
Feito isso, já estamos prontos para subirmos nosso segundo link ADSL (ppp1). Vai ter que ficar da seguinte maneira:
* O script adsl-start levantará o primeiro link ADSL(ppp0);
* O script adsl-stop derrubará ppp0;
* O script adsl-start2 levantará o segundo link ADSL(ppp1);
* O script adsl-stop2 derrubará ppp1.
Antes de subir o segundo link ADSL(ppp1), vamos dar uma olhada na nossa tabela principal de roteamento (tabela main), pois no momento iremos nos concentrar somente nela para que podemos autenticar nossos dois links ADSL.
No momento vamos ver como se encontra a tabela de roteamento main antes de subimos o segundo velox e depois subiremos o segundo link ADSL (ppp1), onde veremos novamente o conteúdo dessa mesma tabela:
# ip route show table main
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
# adsl-start2
# ifconfig
ppp0 Link encap:Point-to-Point Protocol
inet addr:200.164.113.232 P-t-P:200.217.72.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:11686943 errors:0 dropped:0 overruns:0 frame:0
TX packets:13171560 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:4148304848 (3956.1 Mb) TX bytes:1847128396 (1761.5 Mb)
ppp1 Link encap:Point-to-Point Protocol
inet addr:200.141.102.240 P-t-P:200.217.72.56 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:13784549 errors:0 dropped:0 overruns:0 frame:0
TX packets:11222948 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:2845088039 (2713.2 Mb) TX bytes:3448333476 (3288.5 Mb)
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
Como podemos observar no novo conteúdo da tabela de roteamento main, o segundo link ADSL (ppp1) se encontra como uma rota de saída dentro da tabela main, mas não é a rota padrão dessa tabela, afinal a rota padrão dessa tabela ainda pertence ao primeiro link ADSL (ppp0).
Também temos que autenticar o segundo link ADSL (ppp1) para que o mesmo esteja disponível para tráfego. Para executarmos essa tarefa, temos que primeiro excluir a rota padrão da tabela main. Observe a seguinte seqüência de comandos que se encarrega de fazer isso. Assim, você vai se adaptar às suas necessidades:
# ip route del default dev ppp0 via 200.217.72.1 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
# ip route add default dev ppp1 via 200.217.72.56 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.56 dev ppp1
# ./velox.pl
# ip route del default dev ppp1 via 200.217.72.56 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
# ip route add default dev ppp0 via 200.217.72.1 table main
# ip route show table main
200.217.72.56 dev ppp1 proto kernel scope link src 200.141.102.240
200.217.72.1 dev ppp0 proto kernel scope link src 200.164.113.232
10.12.0.0/24 dev eth0 proto kernel scope link src 10.12.0.1
127.0.0.0/8 dev lo scope link
default via 200.217.72.1 dev ppp0
No exemplo acima fiz um passo a passo para vermos como funciona o processo de autenticação de 2 velox. Já que agora estamos com os 2 velox configurados e autenticados, vamos adicionar uma rota na tabela de roteamento que criamos chamada "velox2".
O procedimento acima é necessário ser feito toda vez que seu link ADSL cair (independente se for ppp0 ou ppp1). A solução para isso é que o daemon pppd invoca toda vez que ele consegue estabelecer uma conexão o script /etc/ppp/ip-up e /etc/ppp/ip-down caso a conexão caia. Ele também passa parâmetros para esse script como ip do gateway, se conexão é ppp0 ou ppp1, ip da interface ppp0 ou ppp1, dentre outros.
O mais interessante nisso tudo é que quando subimos uma conexão ADSL no Linux, ficam residentes 3 processos referentes à ela. São eles:
* adsl-connect
* pppd
* pppoe
Muitos já devem ter ouvido falar que o velox funciona muito melhor no Linux do que no Windows, mas a minoria sabe explicar o por quê? Depois de muitos dias pesquisando, fui descobrir que o protocolo PPP instalado no Linux possui algoritmos internamente para checar se existe algum problema no meio físico de uma conexão assíncrona. Podem acreditar, pois mesmo sem passar um byte qualquer no canal estabelecido, esse protocolo consegue identificar se existe problema no meio físico. Sendo assim, os processos pppd e pppoe caem caso exista algum erro no meio físico ou coisas parecidas como um problema no modem ADSL. Porém, o processo adsl-connect fica tentando de tempos em tempos subir a conexão ppp e quando essa se estabelece, automaticamente o pppd passa os parâmetros já citados para o script /etc/ppp/ip-up.
Por isso é só você fazer seus scripts para reautenticação caso um deles caiam. Eu já fiz os meus, onde se um cair ele muda de rota automaticamente para o link que ficar de pé e vice versa, além de também serem feitas as reautenticações. No próximo capítulo faremos o NAT e iremos mexer com a nossa tabela de roteamento que criamos.
Primeiramente devemos mexer em algumas variáveis de kernel. O seguinte comando ativa o roteamento no kernel:
# echo 1 > /proc/sys/net/ipv4/ip_forward
O procedimento abaixo desliga o rp_filter, que é um filtro contra pacotes IP "marcianos". Esses pacotes são aqueles que deveriam ter chegado por uma interface, porém chegam por outra. O rp_filter visa detectar pacotes spoofados, o que é uma boa idéia. Porém, no nosso caso, os pacotes podem ir e voltar por mais de uma interface, a filtragem do "cartesiana" do rp_filter falha. Portanto, temos que desligá-lo e reforçarmos as segurança das interface privadas com regras de firewall criadas por nós. Iremos fazer esse desligamento criando um script chamado "rc.marcianos" com o seguinte conteúdo e sem seguida execute esse script:
NOTA: Nada vai acontecer quando você executar esse script, por isso não se assuste.
#!/bin/bash
# liberar marcianos
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
/usr/bin/echo 0 > $i
done
Inserindo uma rota na nova tabela de roteamento
Lembra que lá no início nós criamos uma tabela de roteamento chamada "velox2"?! Agora nós vamos inserir um rota nessa tabela, para depois então inserirmos uma regra nela. Mas antes vamos listar o conteúdo dela:
# ip route show table velox2
Como vimos, não existe nenhuma rota na tabela de roteamento velox2. Agora vamos inserir uma rota default nessa tabela e em seguida visualizar novamente o conteúdo dessa tabela de roteamento:
# ip route add default dev ppp1 via 200.217.76.56 table velox2 # ip route show table velox2
default via 200.217.72.56 dev ppp1
Pronto, a rota já foi criada nessa tabela. Falta apenas inserirmos uma regra para essa rota que acabamos de criar na tabela de roteamento velox2.
Inserindo uma regra na nova tabela de roteamento
Primeiramente, vamos marcar todos os pacotes provenientes da LAN com destino aos serviços http com a seguinte regra de iptables e logo em seguida irei inserir uma regra nessa tabela de roteamento. Observe a seqüência de comandos:
# iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
Bom, a tabela tem uma rota, os pacotes já estão marcados, mas nenhum pacote vai cair nela, pois não há regras para isso, então temos que colocá-la:
# ip rule add fwmark 1 lookup velox2
Depois de qualquer mudança nas tabelas de roteamento, e necessário digitarmos o comando abaixo para as novas regras vigorarem.
# ip route flush cached
Tudo pronto, agora só falta fazer o NAT para que as máquinas da LAN possam acessar a internet, sendo que os pacotes com destino a porta 80 sairão pela interface ppp1 e os demais sairão pela interface ppp0.
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
Da forma que fizemos agora, todos os pacotes com destino a serviços http sairão pelo segundo link (ppp1) e o restante irá sair pelo primeiro link (ppp0). A rota padrão na tabela main é ppp0 e a rota padrão da tabela "velox2" é ppp1.
Suponhamos que eu quero retirar a regra que incluirmos na tabela "velox2" fazendo com que todo o tráfego saia pelo primeiro link (ppp0). Observem a seguinte seqüência de comandos:
# ip rule del fwmark 1 lookup velox2
# ip route flush cached
Pronto. Todo o tráfego já está saindo nesse momento pelo primeiro link (ppp0). Repare que só excluindo a regra que inserimos na tabela "velox2" deixa a rota default na tabela "velox1". Ou seja, podemos inserir quantas rotas quisermos, mas de nada adianta se não existirem regras para utilização dessas rotas.
Agora irei fazer diferente. Como excluir a regra que tinha colocado na tabela "velox2", terei que criá-la novamente, porém irei fazer um roteamento por ip de origem para flexibilizar um pouco mais o artigo. Observe a seguinte seqüência de comandos:
# ip rule add from 10.12.0.20 lookup velox2
# ip rule add from 10.12.0.21 lookup velox2
# ip rule add from 10.12.0.22 lookup velox2
# ip route flush cached
Como podemos observar, inseri regras na tabela "velox2" dizendo que todos os pacotes cujo ip de origem seja 10.12.0.20, 10.12.0.21 e 10.12.0.22 devem sair pelo segundo link de internet (ppp1). Posso também atribuir uma regra para uma rede inteira.
NOTA: Eu não precisaria excluir a primeira regra referente a marcação de pacotes que criei pela primeira vez. Poderia muito bem deixar saindo pelo segundo link (ppp1) todos os pacotes com destino aos serviços de http além dos ip´s 10.12.0.20, 10.12.0.21 e 10.12.0.22.
Nesse capítulo pretendi abordar o básico sobre Advanced Router. Todos sabemos que a documentação sobre o pacote iproute2 é bastante escassa. Falta falar sobre prioridades de regras, custo de roteamento dentre outros. Mas quem quiser aprender mais sobre esses recursos, é só da uma pesquisada na internet que irá achar bastante.
Também decidi escrever aqui em cima do velox, pois tive uma certa dificuldade para configurar e autenticar 2 velox em um mesmo servidor, mas nada impede de você usar esses recursos em links dedicados mesmo (o que funcionaria melhor devido a não necessidade de autenticação).
Espero que ao lerem esse artigo, consigam visualizar com um pouco mais de clareza esse recurso fantástico disponível no kernel do Linux, podendo adaptar as suas necessidades de implementação.
Créditos: Guilherme Rezende de Almeida
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.