Dois links de ADSL em um mesmo servidor

Neste artigo mostrarei como fiz para dividir o tráfego de uma empresa entre dois links ADSL ligados em um mesmo servidor utilizando iptables e iptoute2.

[ Hits: 55.802 ]

Por: Ricardo Jacomel em 09/07/2004


A divisão



Neste artigo mostrarei como fiz para dividir o tráfego de uma empresa em dois links ADSL ligados em um mesmo servidor utilizando iptables e iproute2. Como no meu caso o grande problema era o acesso aos e-mails que ficam em um provedor externo, dividi o tráfego de maneira que acessos POP e SMTP saíssem por um dos links e o restante dos serviços por outro. Nada impede que você personalize o script abaixo de maneira que atenda às suas necessidades.

A configuração do meu servidor e dos meus links é a seguinte:
  • Ambiente testado:
    • Distribuição: Fedora Core 2
    • 2 links ADSL de 1,5 Mb


  • A máquina possui 3 interfaces de rede:
    • Intranet: eth0 - 192.168.100.0/24
    • ADSL1: eth1 - 10.0.0.1/24 - Gateway: 10.0.0.138
    • ADSL2: eth2 - 10.1.1.2/24 - Gateway: 10.1.1.1

Neste exemplo, os serviços de e-mail passam pelo ADSL2 e os demais serviços pelo ADSL1. O gateway padrão da máquina é o 10.0.0.138 (do ADSL1). Não há configuração de gateway específico por interface. Segue o script que efetua a divisão dos links:

#!/bin/sh

# Interface da Intranet
IF_LAN='eth0'

# Interfaces ADSL
IF_ADSL1='eth1'
IF_ADSL2='eth2'

# Gateways dos ADSL (IPs dos roteadores)
GW_ADSL1='10.0.0.138'
GW_ADSL2='10.1.1.1'

# Mascarar saídas para os dois ADSL
------------------------------------------------------------
iptables -t nat -A POSTROUTING -o $IF_ADSL1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF_ADSL2 -j MASQUERADE

# Marca com "2" os pacotes que saem pelas portas 25 (SMTP) e 110 (POP)
------------------------------------------------------------
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 25 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 110 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 110 -j MARK --set-mark 2

# Joga serviços de e-mail (pacotes marcados com 2) para o ADSL2
------------------------------------------------------------
ip rule add fwmark 2 table 20 prio 20
ip route add default via $GW_ADSL2 dev $IF_ADSL2 table 20

# Atualiza tabela de roteamento
# ------------------------------------------------------------
ip route flush cache

Dúvidas, mail-me: ricardo@jacomel.com.br

Links relacionados e consultados:
   

Páginas do artigo
   1. A divisão
Outros artigos deste autor

Firewall rápido e seguro com iptables

Monitoramento de MSN com imsniff

Leitura recomendada

Script de firewall e análise de log

Firewall bridge + iptables + layer7 + ipp2p

Firewall com Iptables: direto ao assunto (RHEL5 e Fedora)

Introdução ao Firewall Linux

Estrutura do IPTables 2: a tabela nat

  
Comentários
[1] Comentário enviado por removido em 09/07/2004 - 13:39h

Cara muito loko, estava querendo fazer umas paradas dessas, demorooo vou implementar aqui no trampo... Parabéns cara !!!

[2] Comentário enviado por lacierdias em 14/07/2004 - 08:44h

Cara mandou muito bem irmão....parada animal....rs

[3] Comentário enviado por gustavo_marcon em 07/08/2004 - 17:22h

Excelente artigo cara... Mas fiquei com uma dúvida, se o modem não for roteador, e a autenticação PPPOE precisar ser feita no servidor como fica? Tem como fazer as duas autenticações PPPOE no mesmo server?

[4] Comentário enviado por rjacomel em 08/08/2004 - 12:33h

Sinceramente não sei se é possível duas autenticações PPPoE no mesmo servidor... Mas caso isto seja possível, o princípio do artigo continua o mesmo...

Ricardo Jacomel

[5] Comentário enviado por bygga em 08/10/2004 - 10:27h

Cara muito bom o teu artigo, mas e se eu quiser que passe todo o trafego pelos dois não e-mails por um e o resto pelo outro é só não colocar as regras para os e-mails...

Att,

Mário Henrique.

[6] Comentário enviado por rjacomel em 08/10/2004 - 11:24h

Desta maneira você teria que fazer um balanceamento dos links. Recomendo que você acesse o link abaixo, que explica como fazer este balanceamento automático.

http://www.altoriopreto.com.br/case1_tech1.php

Ricardo


[7] Comentário enviado por pogo em 06/01/2005 - 09:29h

kra, muito bom o artigo! vou implementar aqui na empresa... vlw!

[8] Comentário enviado por butkam em 08/03/2005 - 12:44h

será que tem como eu colocar.. ao invés de porta.. colocar por ip???
tipo assim... alguns ips saem pelo link adsl 1 e outros saem pelo link adsl 2.... criando 2 arquivos com os ips... aqui é tudo estático.

ass.: butkam

[9] Comentário enviado por alessandro lelli em 29/05/2005 - 14:12h

Eh possivel colocar dois links, sendo um ADSL e outro cabo(net)
Alessandro lellis

[10] Comentário enviado por marcosfnet em 07/11/2005 - 11:03h

Amigos, já tenho um Link ADSL 800kbps num servidor Conectiva 10 servindo como gateway de uma rede com 30 computadores, só que está lento o acesso, eu queria colocar mais 01 Link de 800kbps no mesmo servidor, ai o link ia ficar 1.6mbps, ai resolveria meu problema, será que tem como vocês me passarem as coordenadas para fazer isso. Tipo assim:

eth0 = 192.168.1.1 - Entrada ADSL 01
eth1 = 192.168.1.2 - Entrada ADSL 02
eth2 = 192.168.0.1 - Gateway com link final de 1.6mbps

Obrigado!

[11] Comentário enviado por lanna_cf em 09/02/2006 - 11:31h

Bom dia,

fiz o balanceamento e esta ok, mas estou tento problemas p/ acessar um servidor que esta atras do firewall pela porta 3389 (Terminal Services).
alguem sabe pq?

[]`s

Lanna

[12] Comentário enviado por W@P em 10/04/2006 - 09:48h

E podemos tambem redirecionar o trafego de programas p2p para um dos links sem preojudicar a navegação.

Muito bom o artigo

[13] Comentário enviado por gustao em 01/07/2006 - 00:33h

Valeu pelo artigo !!!

so que estou com o mesmo caso do <gustavo_marcon> ...

nos modems um é router e outro bridge ...
o pppoe seta umas rotas doidas la ...

tipo para sair para o modem router, sai beleza ...
mais para sair para o bridge nao sai nem a pau ...

parece que ele da conflito com as rotas ...
cume q nois cuncerta isso ???

valeu !!

[14] Comentário enviado por joabes em 24/11/2006 - 13:43h

Cara, show de bola seu artigo, só que achei dois problemas.

Primeiro é que o linux não navega, ou seja, os clientes navegam blz, mais o linux fica em looping. Como corrijir?

Segundo, se o cabra acessa um e-mail no hotmail, não consegue, pois diz estar em conflito, o que fazer?

Cordialmente
Joabes

[15] Comentário enviado por fontebon em 07/12/2006 - 22:55h

Muito bom ...vou testar...
Uma pergunta: Posso marcar pacotes que vem pela porta 80 e mandar sair pelo meu melhor link e deixar o resto que e meio transparente para o usuario saindo pelo outro link?
Outra coisa preciso mecher nas configuracoes do iproute? tipo rt_tables?
Ou e so alterar os ips e rodar o seu script?


[16] Comentário enviado por rjacomel em 08/12/2006 - 09:27h

No meu script marco os pacotes SMTP (25/TCP) e POP3 (110/TCP) para que saiam pelo segundo link. Você pode fazer isto com HTTP, apenas marcando a porta 80/TCP.

[17] Comentário enviado por hugodcs em 07/03/2007 - 22:55h

Existe uma forma de conseguir acessar um servidsor atravez de dois links diferentes?

Ex. Tenho um servidor com velox e link embratel, tento acessar de fora ( outro lugar da internet) pelo velox e/ou pelo link ?

Já tentei marcar os pacotes mas a volta do pacote não vem marcada, ai não tem como eu filtrar!!!

Agradesso desde agora!

[18] Comentário enviado por gzanatta00 em 04/04/2007 - 21:17h

amigo tenho um link de 1 mb que entra e roteia pela eth0, e a eth1 sai pra minha rede com ip 10.1.1.0, quero colocar um adsl pra ajudar na porta eth2, mas eu quero definir que o ip 10.1.1.50 navegue pelo link e o 10.1.1.60 navegue pelo adsl, como eu faco, se vc souber de um artigo me indique

[19] Comentário enviado por alphamax em 05/05/2008 - 12:07h

cara se eu quiser fazer esse esquema com apenas uma placa respondendo para 2 link te internet tipo:
imaginemos dois links indo para um switch; vai... um speedy e um virtua e apenas um cabo indo do swuitch para e eth0, a qual também responde para a interface "virtual" eth0:1

eth0 200.200.x.y (speedy)
e
eth0:1 200.200.y.x (virtua)

será que funcionaria?
pois em meu pc já não tem mais espaço para espetar PCI, digamos que é um caso bastante especial.


Valew,bom topico

[20] Comentário enviado por NADALETO em 17/05/2008 - 18:09h

17 DE MAIO DE 2008
JAÚ SP
Necessito conetar 2 pcs, em média distância, usando em cada um um modem adsl e estes sejam ligados por um par de fios. A ligação também poderá ser feita via LP da companhia telefônica local.

[21] Comentário enviado por removido em 20/05/2009 - 21:31h

Parabens Novamente, exelente!

Abracos

Flw

[22] Comentário enviado por jokerman em 09/09/2009 - 16:06h

Caro Ricardo,

parabens pelo artigo. Muito bom! Implementei com sucesso...Só estou tendo um pouco de dificuldade para marcar no link2 pacotes que "entram" na rede.

Por exemplo; faço ssh na 22. Utilizo o seu exeplo e crio um PREROUTING para a porta 22. FUNCIONA! Faço ssh para outra maquina e saio pelo link2.

Agora, qual seria a regra para determinar que quem tentar entrar no servidor via ssh utilize também o llink2??

[23] Comentário enviado por metall em 16/09/2009 - 13:16h

PARABENS AI rjacomel

Legitima Receita de BOLO.....

Perfect.

Teria uma Duvida ai no Script fala de Saida... certo...

e como ficaria a partede de Entrada....

Exemplo.... faço um requisicao num Lugar X ele vai sair pelo LINK 2 ai presico que a resposta tambem volte pelo Link 2

Como seria o Procedimento para isso?

Desde já Agradecemos sua Receita...

[24] Comentário enviado por jeff.jno em 19/09/2009 - 00:54h

Parabéns pelo artigo,
Está bem claro e consiso. Acho que vai me ajudar bastante. Por acaso alguem saberia me dizer, se teria como eu marcar apenas um endereço interno para utilizar a "ADSL2" e o restante para utilizar a "ADSL1"?

[25] Comentário enviado por jokerman em 05/11/2009 - 12:53h

Caro Ricardo,

parabéns pelo artigo. Pra mim funcionou tudo ok no CentOS 5.2, EXCETO....o squid!

Na verdade, pelos testes que eu fiz observei que todo o direcionamento que eu faço, vale para as estações, mas não para o proprio servidor.

Como teste fiz o seguinte:

Criei uma regra para a porta 23, para que o meu telnet para fora, saisse pelo LINK2:

100.100.1.100, ETH2

Se eu vou na estaçao de trabalho da rede e abro um putty, faço o telnet normal e vejo pelo "w" que realmente eu "vim" do ip ligado

na ETH2. Ate aí tudo bem.

Se eu tento fazer um telnet estando logado no proprio servidor, ele simplesmente trava.

Ora, como a origem do squid é o proprio servidor está acontecendo com ele o mesmo travamento.
A minha pergunta seria a seguinte: como criar regras no iptables para determinar a mudança de trafego não só para o que vem das estações de trabalho , mas também para o que vem do proprio servidor?
(tentei utilizar o comando tcp_outgoing_address no squid.conf mas nao funcionou....)

Agradecido.



[26] Comentário enviado por fernanda.falcon em 07/03/2011 - 10:13h

Bom Dia,
Estou com um problema... Fiz as configurações e qdo me conecto via terminal server ele entra pela eth2 e se conecta na estação, mas qdo ele muda de link para a eth1(onde está meu outro link) a conexão com o terminal services cai.Preciso descobrir uma maneira de mesmo o link alterando a conexão se identifica pela porta pela qual foi aberta.
Muito Obrigada.

[27] Comentário enviado por fontebon em 07/03/2011 - 17:43h

Talvez marcando pacotes na porta 3389 para ela sai sempre por um link.

[28] Comentário enviado por joaopaulobiesek em 31/01/2014 - 11:00h

Bom dia,
muito bom gostei muito so que eu queria, fazer algo parecido sera que poderia me ajudar?
rjacomel, e possivel colocar o servidor para indentificar que quando caio um link ele puxa o outro?
tenho 2 link um de 10mb e um de 2mb um embratel e outro velox. so que o velox cai muito ai quando o velox caise ele jogase o trafego da rede toda no embratel de 2mb e possivel ??


Contribuir com comentário