Tutorial completo e detalhado sobre roteamento avançado no Linux. Explica como fazer "balanceamento de carga" em 2 ou mais links de internet usando iproute2 e iptables no Linux, bem como rotear pacotes pela origem, pela porta e etc.
Certo tempo atrás escrevi um script usando iproute2 e iptables que desenvolvi na ocasião, já que havia a necessidade de utilizar 2 links de internet distintos. Desta vez reescrevi com muito mais detalhes mostrando exatamente como funciona cada passo.
Lembrando que este script foi desenvolvido no Slackware, mas acredito que funcione em qualquer outra distribuição Linux com Kernel 2.4.x e superiores, com algumas poucas modificações.
Quanto aos links, vamos chamá-los de LINK1 e LINK2...
Imagine que você queira que determinado protocolo use o LINK1 e outro protocolo use o LINK2.
Um exemplo fácil seria dizer que mensagens de e-mail SMTP e POP (portas 110 e 25) utilizam o LINK1, enquanto o tráfego de internet (portas 80, 21, 53, 443...) utiliza o LINK2. Isto permitiria que usuários fizessem downloads pesados sem comprometer o tráfego de mensagens, ou ainda, enviar e receber mensagens de e-mail grandes sem interferir na velocidade dos usuários que navegam na Internet.
Um outro exemplo para quem tem Vlans em suas redes seria dizer que a REDE 192.160.0.X utiliza o Link1, enquanto a REDE 192.170.0.X utiliza o LINK2.
Basicamente o processo funciona marcando pacotes que entram e saem do FIREWALL onde o script será implementado com o comando IPTABLES usando Mark, um artifício que faz com que o firewall monte uma tabela dinâmica de todos os pacotes que passam por ele.
Imagine que você tenha um firewall com 4 interfaces, assim vamos chamá-las de: ETH0, ETH1, ETH2 e ETH3, onde ETH0 está conectada à sua LAN interna, a ETH1 conectada em uma DMZ e as interfaces ETH3 e ETH4 conectadas a 2 links distintos.
Se um pacote entrou pela interface ETH0 e saiu pela interface ETH3, é necessário que ele retorne para o mesmo lugar de onde veio. Eis o motivo de marcar os pacotes; caso contrário, eles se utilizarão do DEFAULT GATEWAY do Firewall, que pode não ser o mesmo que você deseja.
Entendendo isto, podemos seguir adiante com nosso script.
[7] Comentário enviado por geovannyjs em 30/03/2007 - 22:09h
E ai chefe?
Cara, tem muito tempo que estou cadastrado no forum, e este é o primeiro artigo que defino como favorito(não que os outros não sejam muito bons), mas o conteudo desse artigo não é muito comum, muito bom cara!
[12] Comentário enviado por linux.vitor em 27/05/2007 - 15:47h
Amigo,
Fiz tudinho que esta falando ai, mas to com um problema,
Os clientes não conseguem acessar paginas novas, como por exemplo, a UOL, so acesso paginas que estao abertas no meu Broswser quando tento abrir um pagina nova ele não acha a pagina???
e tem tambem como eu determinar assim: ip=172.16.0.1 passa pelo link1 ip=172.16.0.3 passa pelo link2???
[13] Comentário enviado por fabricioguzzy em 27/05/2007 - 16:01h
Vitor,
Não faz muito sentido ter aberto uma vez e depois não abrir mais. Cuidado com as variáveis. Muitas pessoas erram nelas. mas na Dúvida limpe os caches logo depois do erro.
ip route flush cache
Quanto à sua pergunta: SIM, É POSSÌVEL.
Veja no final do script, lá tem uma parte que fala exatamente disso, veja:
Você pode utilizar parte do script, se necessário. Por exemplo, se quiser apenas rotear pacotes pela origem, utilize:
ip rule add from 192.160.0.0/24 table 20
ou
ip rule add from 192.160.0.0/24 table 21
Conforme o Link que deseja utilizar.
Onde 192.160.0.0/24 é a origem. Neste exemplo, a rede em questão tem a máscara 255.255.255.0 (/24).
Desta forma, não há necessidade de marcar pacotes e você poderá deletar as linhas do script.
Espero que vc consiga executar corretamente todo o script. Qualquer dúvida me escreva.
[14] Comentário enviado por linux.vitor em 27/05/2007 - 16:17h
Entaum fabricioguzzy,
Eu fiz tudo ai que vc falou, mas o problema de abrir as paginas não resolvel, so resolve se eu colocar essa comando: route add default gw ip_do_roteador, mas com esse comando tudo vai passar so por 1 roteador o do primeiro link.
O que eu reparei e o seguitne, as portas 25,110 que são do meus e-mails que uso no outlook, quando abro o outlook, eu vejo o moden do Link2 piscando, quer dizer que os pacotes estão passando por lah, e outra coisa se coloco em fez de http://www.uol.com.br coloco o IP ele abre normal.
o que pode estar acontecendo... sera que tem q abrir tambem a porta 53 do DNS..
Obrigado pela Atenção
[15] Comentário enviado por fabricioguzzy em 27/05/2007 - 16:39h
Isso mesmo... Toda vez que vc digita um IP ele abre a página, e quando vc digita o nome/dominio ele não abre, trata-se de um problema de DNS (resolução de nomes)
Pode verificar DNS port 53 que é isso mesmo!!!
É isso ai meu amigo...
[16] Comentário enviado por linux.vitor em 27/05/2007 - 16:53h
Entaum, consegui resolver.....
e tambem fiz o eskema do link em cada IP, foi facil, era DNS mesmo o problema, agora so to com 1 problema, não consigu accessar o Servidor pelo ssh (22) pelo ip dele 10.0.0.1 que e da minha rede Interna, so acesso ele pelo ip da placa eth0 172.16.0.7, e tambem não consigo pingar nada pelo servidor??
[17] Comentário enviado por fabricioguzzy em 27/05/2007 - 16:59h
vc quer dizer acessar o FIREWALL por SSH...
para as duas coisas verifique suas regras de (iptables)
Libere apenas o necessário.. cuidado pra não abrir o firewall pra WAN, ok?!
[18] Comentário enviado por linux.vitor em 27/05/2007 - 17:01h
hehe.. .intaum... não rodei me firewall ainda no servidor, ta tudo liberado, somente rodei o seu script... e ele travou o meu acesso ao ssh.. muito estranho...
[19] Comentário enviado por linux.vitor em 27/05/2007 - 21:58h
fabricioguzzy...
vc poderia me ajudar em outra coisa??
Seguinte deu certo aki.. ta tudo blz... mas o que eu percebi e o seguinte, pra funcionar tenho q definir um Router padrão... rout add default gw Ip_de_um_dos_roteadores, se não não navega, so que com eese problema, não consigo acessar de outro lugar pela porta 3389 nos 2 Links Simultaneos?? vc sabe o prq...
Valew..
[20] Comentário enviado por fabricioguzzy em 28/05/2007 - 15:58h
Vitor,
Vc precisa pensar no seguinte.
Você quer acessar 2 lugares diferentes remotamente e simultaneamente.
Então temos 3 locais: Um deles é você e os outros dois vamos chamar de maquina A e maquina B.
Você tem que decidir como vai rotear, por exemplo: DE você PARA máquina A, DE você PARA maquina B. A origem é a mesma, portanto vc tem que criar uma regra de DESTINO. Quando o destino for máquina A saia pelo LINK 1, quando destino for máquina B, saia pelo LINK 2. Entendeu? para isso você nem precisa do meu Script, basta você adicionar regras simples de roteamento.
Quanto à sua pergunta sobre o DEFAULT GATEWAY, está correto, toda máquina tem um DEFAULT GATEWAY. DEFAULT significa NA FALTA. portanto se, não existir regra ou qualquer outra politica de roteamento na máquina o gateway que assumirá é o DEFAULT GATEWAY... Fácil?
Sugiro vc ler algum documento sobre roteamento básico. Você poderá enriquecer seus conhecimentos. Você está tendo dúvidas sobre coisas mais simples do que este script. Confesso que este script é um tanto dificil pra quem não está habituado com roteamento no Linux.
Boa leitura e qualquer coisa escreve ai...
[22] Comentário enviado por fabricioguzzy em 23/06/2007 - 20:53h
Olá caro colega...
Coloque o DEFAULT GATEWAY do firewall pra usar o LINK2, e use o comando até a linha:
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
para marcar os pacotes de porta 80 pra sair pelo LINK1.
Depois o resto das marcas de pacotes vc não precisa colocar...
Cuidado, existem Sites que se utilizam em parte da porta 443 (ssl) e 80 (http), bancos por exemplo, se vc sair com IP´s diferentes poderá ter problemas.
Aconselho vc a usar 80, 443 e 53 pelo mesmo Link.
[23] Comentário enviado por sandrocarva em 01/08/2007 - 12:01h
?comentario=
Fabricio,
Primeiramente parabéns pelo artigo, muito util.
Adaptei ele para minha realidade, mas estou tendo problema.
CentOS 4.4 e tenho 4 interfaces:
etho = link gvt
eth1 = link copel
eth2 = 192.168.1.0/24 - sair pela gvt (eth0)
eth3 = 192.168.2.0/24 - sair pela copel (eth1)
qndo rodo o script da o seguinte erro:
printk: 1 messages suppressed.
MASQUERADE: Route sent us somewhere else.
O script ficou assim:
IF_LAN="eth3"
IF_LINK1="eth0"
IF_LINK2="eth1"
GW_LINK1="192.X.X.253"
GW_LINK2="200.X.X.49"
/sbin/iptables -t nat -A POSTROUTING -o $IF_LINK1 -j MASQUERADE
/sbin/iptables -t nat -A POSTROUTING -o $IF_LINK2 -j MASQUERADE
/sbin/ip rule add from 192.168.1.0/24 table 20
/sbin/ip rule add from 192.168.2.0/24 table 21
/sbin/ip route add default via $GW_LINK1 dev $IF_LINK1 table 20
/sbin/ip route add default via $GW_LINK2 dev $IF_LINK2 table 21
[24] Comentário enviado por fabricioguzzy em 01/08/2007 - 13:56h
Olá Sandro... Muito Obrigado pelas palavras!
Vamos lá...
Você tem 4 interfaces ai certo?
Duas dos Links e duas da rede interna...
Não vejo a variável da ETH2 no seu script... mas td bem...
Se o seu problema é rotear pela origem está mais fácil do que vc imagina...Percebi uma coisa... O gateway do Link1 é um IP frio (inválido)...vc está mascarando o que nele? tem alguém que está mascarando após esse firewall? (NAT)
Você fez no SLACKWARE? CENTOS 4.4??
O Kernel está para suportar roteamento avançado nessa distro?
para maiores dúvidas sobre isso sugiro vc ler esse artigo aqui: http://www.rnp.br/newsgen/9809/rot-linux.html ...postado pelo colega IVO DE CARVALHO...
[25] Comentário enviado por sandrocarva em 02/08/2007 - 10:54h
Fabricio,
Eu de novo,
sim tenho 4 interfaces, 2 dos links e 2 das redes internas.
sobre a ETH2 o script não faz menção a interface da rede interna.
o gateway do link1, é o ip frio que o modem da GVT manda pro servidor, no modem direcionei todas as portas para o servidor linux, estoiu usando o CentOS 4.4 - kernel 2.6.9.
[26] Comentário enviado por xbrennox em 22/08/2007 - 10:39h
Parabéns pelo Artigo Fabricio,
Amanhã estarei implementando ip_route2 aqui na empresa, como já tenho conhecimento avançado em linux firewall e rotas, acredito que não terei problemas, mas tenho 1 duvida. Vamos supor que tenho 2 links WAN e um LAN. se um desses LINKS cai, o que irá acontecer?
se LINK 1 fira fora do ar (link onde está meu gw) , o que irá acontecer com minha rede?
todos passaram a usar o link2 automáticamente?
e se o LINK 2 sair fora do ar? todos que estão na segunda tabela irão usar o link1?
depois que cair o LINK e logo em seguida voltar, as rotas irão permanecer?
Antes de implantar iproute2, queria ter +- essa noção do que irá acontecer nas situações abrangidas acima.
[27] Comentário enviado por fabricioguzzy em 22/08/2007 - 14:00h
Brenno..
Vamos lá.
Este script não faz AUTO BALANCE..ou seja, ele não verifica se os LINKS cairam ou não.. ele porporciona rotas e divisão de carga entre dois ou mais links... O que vc quer é uma solução de LOAD BALANCE AUTOMATICA... Este script é estático. a Solução que vc procura é um tanto mais complicada de se desenhar.. inclusive no mercado as empresas vendem estes produtos a um custo altíssimo...
Não é muito dificil de fazê-lo não... dá trabalho... quem sabe eu desenhe uma solução desses e posto aqui pra galera...
Se um link cair, vc fica sem aquele acesso...já que é um roteamento estático.
Qualquer coisa me escreva!
abraços
Fabrício
[29] Comentário enviado por xbrennox em 22/08/2007 - 16:01h
Fabricio, eu to lendo mais sobre esse assunto, e fiquei em duvida em relação ao seu script.
No seu script você pde os 2 GW das WAN certo?, a tabela main só aceita um GW, se os 2 GW dos links das WAN ficarem ativos, qual o comando que terei que usar para tabela main aceitar os dois GW da minhas WAN?
[32] Comentário enviado por N0fx em 24/09/2007 - 09:31h
Reservei um link apenas para trafego do emule. Sei que a porta do emule varia, mas por enquanto vou testar apenas com a porta 4662 que foi onde detectei mais trafego.
No script adicionei o seguinte:
IP_INET="numero ip 1"
IP_ALIAS1="numero ip 2"
IP_ALIAS2="numero ip 3"
IP_ALIAS3="numero ip 4"
IP_ALIAS4="numero ip 5" #Passar emule por aqui
IF_INET="eth0"
IF_NET1="eth1"
IF_NET2="eth2"
iptables -t mangle -A PREROUTING -i $IF_INET -p tcp --dport 4662 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 4662 -j MARK --set-mark 2
ip rule add fwmark 2 table 20 prio 20
ip route add default via $IP_ALIAS4 dev $IF_INET1 table 20
ip route flush cache
Quando inicio meu firewall da o seguinte erro:
Error: either "to" is duplicate, or "20" is a garbage.
Estou utilizando apenas um table, no restante do script não contém mais nenhum.
O que poderia ser?
[33] Comentário enviado por N0fx em 24/09/2007 - 10:02h
Obrigado...
já identifiquei o erro!
Eu tenho sempre que tirar da minha tabela para poder cadastrar.
Coloquei no stop do meu script o seguinte:
ip rule del fwmark 2 table 20 prio 20
Aí sempre que eu der um restart ele deletará o table 20 para poder adicionar novamente.
[34] Comentário enviado por renatopradop em 15/11/2007 - 22:23h
eu teria como fazer esse balanceamento via URL ? por exemplo... quero que qualquer solicitacao em que o sufixo da URL for .gov.br ele saia pelo Link1 e qualquer outro pelo Link2 ?
[35] Comentário enviado por Feltes em 03/12/2007 - 16:35h
Olá Fabricio,
Como os demais achei mt o seu script..
Mas o problema que eu tenho é o seguinte, tenho 3 modens:
eth0 - rede interna
eth1 - adsl1
eth2 - adsl2
eth3 - adsl3
O modem 1 é o default Gateway de toda rede.. o 2 sai e entra apenas e-mails e o 3 vai entrar duas vpn com as 2 filiais, mas configurei td e as requisiçoes para montar a vpn entra pelo certo 3, mas sai pelo 1, mesmo depois de eu marcar os pacotes pela porta!?
Minha pergunta é tem como eu definir que, quem entrar pelo modem X sai apenas pelo modem X??
[37] Comentário enviado por guigsilva em 17/01/2008 - 18:09h
Muito Bom o artigo !!!!!!
Dos mais interessantes que vi no VOL ultimamente!
Apenas um parênteses, quem estiver utilizando 2 IPs numa placa de rede (alias) tem que definir a var LINKx como ethx -d endereço-ip-da-alias, fiz isso pq aqui no meu deu erro quando tentei aplicar direto
[38] Comentário enviado por mauromx em 31/01/2008 - 16:47h
Excelente artigo !!!!!
Esse tutorial funciona com o squid transparente?
No meu iptables eu direciono a porta 80 para 3128
Fedora Core 6 + squid transp. + iptables
eth0
eth1
eth2
Mas ainda nao consegui ativar o eth2, em rede eu adiciono um novo e pronto? Preciso instalar o iproute2? Alguém, poderia me ajudar nessa jornada?
[39] Comentário enviado por lavoie em 12/03/2008 - 18:00h
muito bom o artigo.
queria te perguntar:
se pelo link 1 eu setar sites bancos
e pelo link2 o restante,
o link1 vai ser somente para site dos bancos?
existe a possibilidade dos dois links trabalharem na rede, quando um estiver com muito uso, utilizar o que estiver com mais folga ?, nao somando como 2mb + 2mb = 4mb, e sim se uma maquina da rede entra pelo link1 e outra pelo link2 mas aleatorio sem setar ip.
[40] Comentário enviado por fabricioguzzy em 14/03/2008 - 03:39h
Lavoie,
Sim, basta vc criar as regras para os Ip´s dos Sites dos bancos e rotear pelo link 1 ou 2 (ou 3 e etc) isso é roteamento simples.
Ex: route add 200.0.0.1 netmask 255.255.255.255 gw 201.0.0.1 (onde, 200.0.0.1 é o IP do site do banco, depois a máscara, depois o Gateway do seu Link, neste caso o exemplo é 201.0.0.1) Veja, são IP´s fictícios. vc precisa trocar pelos que vc tem ai na sua rede... Você pode fazer esta rota ficar persistente também, ou seja, ela ficará no Firewall mesmo depois de um Boot. Edite o /etc/sysconfig/network/routes
Quanto a fazer um balanceamento automático ai a coisa muda. Este script não é tão inteligente assim a ponto de "saber" quanto tráfego vc tem no Link 1 e trocar para o 2. Pretendo desenvolver algo assim mais pra frente, mas preciso de tempo..o que ultimamente está faltando.
Você precisa tomar cuidado ao usar 2 links, pois vc pode ter um roteamento assimétrico, ou seja, pacotes entram por um Link e saem por outro. Isto é bem chato de arrumar depois.
[41] Comentário enviado por juno em 03/06/2008 - 17:47h
Boa tarde
Fabricio,
Parabéns pelo artigo me esclareceu muitas dúvidas, fiz a implementação aqui na empresa mas estou com o problema, será que pode me ajudar ?
Cenário :
Tenho 3 links de internet e a minha rede:
eth0 - rede local
eth1 - gvt
eth2 - virtua
eth3 - ajato
Configurei as tabelas de roteamento conforme o script e funciona perfeitamente para eu poder desviar o tráfego das portas 25, 110, 143 para o virtua e 20 e 21 para o ajato.
Mas quando eu peço para determinado host (192.168.0.22/32) sair pelo link2 (virtua) não acontece nada.
[42] Comentário enviado por diegonsf em 19/06/2008 - 14:23h
?comentario=Ola.... muito bom o seu artigo... so tenho uma duvida... quando eu realizo esse balanciamento de carga... de que forma eu posso fazer o controle de banda? pois quando eu aplico essas regra meu controle de banda fica maluco... so consigo controla o download mais o upload não controlo mais... vc teria alguma ideia sobre isso?
[43] Comentário enviado por rdopke em 27/07/2008 - 14:31h
Gostei do seu artigo. Tenho uma duvida. No caso do adsl mudar o ip como ficam as regras de roteamento ? Estou usando o modem adsl como bridge e o slack via ppoe na eth2 recebe o endererço ip da GVT.
[44] Comentário enviado por sleck_sc em 14/08/2008 - 15:45h
Ola pessoal, primeiramente parabéns pelo sctipt Fabricio, apliquei aqui e esta funcionando bela no trafego de saída, mas estou com um problema e gostaria de saber se alguem pode me ajudar, tenho 2 links, eth0 e eth1, na eth2 esta a minha rede local, na minha rede interna tem um srv Wts na porta 3389, gostaria liberar o acesso a esta porta nos dois links de acesso, quando alguem precisar acessar o wts poderá entrar por qualquer um dois 2 links, hoje não consigo fazer isso , apenas entra por um link e pramim seria fundamental este recurso!
Se alterar o default route para 10.0.0.5 aí navega e td mais... mas não consigo acessar o Servidor de fora via ssh porta 4321
Se alterar o default route para 187.4.253.5 aí consigo acessar de fora, mas não navega...
Acredito que a marcação de pacotes não esteja funcionando de acordo...
Tens alguma idéia do que devo verificar...
[46] Comentário enviado por halleybr em 05/06/2009 - 12:12h
Fala amigo beleza?
Rapaz, parabens pelo artigo me adiantou e muito, porém não funcionou da forma esperada... poderia me dar um help?
Vamos lá...
Temos 2 links agora:
1 Embratel ----> Vlan 192.168.0.0/16 irá acessar por aqui...
2 Mundivox ----> Vlan 192.168.211.0/26 irá acessar por aqui...
Só que, configurei como está no seu script e muito bem explicado mas não vai de forma alguma.... eu vou trafegar ele só me joga pelo default gateway que no caso é a MUNDIVOX...
[47] Comentário enviado por fabricioguzzy em 06/06/2009 - 10:53h
Resposta ao amigo SRF:
Amigo,
Vamos lá... Estou vendo que um dos seus Links não sofre NAT, que é o: 187.4.253.5 - tudo bem.
Já o outro Link: ADSL 10.0.0.5 usa um IP frio, ou seja, o IP quente com certeza está no seu roteador.
Você precisa de uma regra de NAT no Roteador, fazendo forward pra dentro da rede, no caso para a máquina que vc quer acessar. (ex: O próprio Firewall, o que acho péssimo, pois não se deve liberar acesso remoto externo, mesmo que por SSH, para o firewall.)
No seu caso, o pacote nem está chegando no firewall, está morrendo no roteador...
Porque o outro Link funciona? Porque vc não tem NAT nele. O pacote chega diretamente na interface do Firewall.. Uma forma de vc tirar a dúvida é capturando pacotes direto na máquina com o comando TCPDUMP... Faça o teste, mas pelo que vejo, é isso mesmo...
[49] Comentário enviado por halleybr em 07/06/2009 - 10:55h
Fala Fabricio, os meus ips estão alterados... pode ficar tranquilo rsrs...
Seguinte o meu scritp está assim, o que queremos basicamente, quem estiver na Vlan 192.168.211.0/24 sai pelo link1(mundivox) e quem estiver na 192.168.0.0/16 sai pela link2 (Embratel) só que não vai... sempre sai pelo default gateway que é da mundivox...
IF_LAN='eth0'
IF_LINK1='eth2'
IF_LINK2='eth1'
GW_LINK1='200.196.54.55'
GW_LINK2='201.73.46.55'
iptables -t nat -A POSTROUTING -o $IF_LINK1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF_LINK2 -j MASQUERADE
ip rule add from 192.168.211.0/24 table 20
ip rule add from 192.168.0.0/16 table 21
ip route add default via $GW_LINK1 dev $IF_LINK1 table 20
ip route add default via $GW_LINK2 dev $IF_LINK2 table 21
[50] Comentário enviado por riroxi em 14/07/2009 - 15:00h
Em primeiro lugar parabéns pelo seu artigo.
Gostaria de tirar uma dúvida.
Para que seu script funcione é necessário criar a tabela no /etc/iproute2/rt_tables?
No meu caso, gostaria de fazer o seguinte:
ETH0 - > LAN
ETH1 -> VELOX1
ETH2 -> VELOX2
EHT3 -> RADIO
Ip x vai para VELOX1
Ip y vai para VELOX2
Ip z vai para RADIO
Isso inclue todas as portas de origens e destinos.
Bastaria apenas mudar a linha que vc falou no fim?
ip route add default via $GW_VELOX1 dev $IF_VELOX1 table 20
ip route add default via $GW_VELOX2 dev $IF_VELOX2 table 21
ip route add default via $GW_RADIO dev $IF_RADIO table 22
[51] Comentário enviado por oneide em 06/08/2009 - 09:53h
Bom dia Fabrício e demais amigos da lista, tenho um servidor mais ou menos nos mesmos moldes mas com a diferença que é o uso de "nexthop" para fazer load balance entre os links. E uma outra diferença é que eu tenho apenas uma placa de rede de saída, e uso alias na placa para que ela possa ter comunicação com várias redes dos gateways.
O que me ocorre é que os download param na metade, ou até antes... Não consigo que os clientes baixem arquivos sem o auxílio de um gerenciador de download. Pelo que vi, antes do final do download, ele entra em outro nexthop e troca a conexão para outro link e então o download cai.
Alguém tem experiência com isso??? Alguma dica do que pode estar acontecendo???
Segue abaixo o meu script reduzido para não ficar muito grande na lista:
# FAZ SNAT NAS PLACAS DE REDE DE SAIDA
iptables -t nat -I POSTROUTING -o eth2 -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth3 -j MASQUERADE
# CRIA TABELA DE ROTEAMENTO PARA BALANCEAMENTO
ip route add default table 210 nexthop dev $INT_EXT2 via $GW_LINK2 weight 1 nexthop dev $INT_EXT2 via $GW_LINK3 weight 1 weight 1 nexthop dev $INT_EXT2 via $GW_LINK6 weight 1
# MARCA PACOTES GERADOS PELO FIREWALL
# SE NAO MARCADOS SAEM PELO GATEWAY PADRAO DO FIREWALL
# MUDAR O GATEWAY PADRAO VERIFICAR PROBLEMAS EM LINKS DE INTERNET
iptables -t mangle -I OUTPUT -p tcp --dport 80 -j MARK --set-mark 10
# MARCA OS PACOTES PARA ROTEAMENTO EM CASOS ESPECIFICOS DA REDE INTERNA
iptables -t mangle -I PREROUTING -i $INT_INT -p tcp --dport 80 -j MARK --set-mark 2
# CRIANDO REGRAS PARA REDIRECIONAMENTO PARA AS TABELAS
# BALANCEAMENTO DE LINK ADSLs
ip rule add fwmark 10 table 210 prio 208
[53] Comentário enviado por fabricioguzzy em 06/08/2009 - 21:33h
Oneide,
Quando o server encontra uma métrica menor, ele troca... isso derruba sua conexão...
isso ai funciona como um "fail over" claro que com suas devidas resalvas....
Nunca fiz assim não...
Abraços
[54] Comentário enviado por nox6000 em 30/08/2009 - 17:52h
Ola fabricioguzzy,
Primeiramente: parabéns pelo Artigo de excelente qualidade me deu uma luz.
Eu não to conseguindo realizar o balanceamento entre dois links de internet
Minha situação:
Tenho um modem do velox 1MB de IP: 192.168.254.254
Tenho outro modem do velox 1MB de IP: 192.168.1.1
Meus modens não tem ip fixo eles recebem ip a cada nova conexão.
onde:
O primeiro modem é ligado na placa eth0 de ip: 192.168.254.1
O segundo modem é ligado na placa eth1 de ip: 192.168.254.2
e a terceira placa eth2 deve liberar o sinal de internet para a rede ela tem o ip 192.168.254.3
Bem o que eu desejo e receber os dois link's em suas repectivas placas de rede e libera-lo pela eth2 de ip 192.168.254.3
Utilizo o ubuntu desktop 9.04 tem como me passar o que devo fazer para solucionar minha situação especifica?
Eu não quero muita coisa dizer que tal maquina vai navegar por um link e que outra vai navegar por outra ou mesmo que stp e http vai ser por um link e smtp e etc vai ser por outro. Não preciso de nada disso só desejo ter os dois links funcionando e se caso um caia todos os meus computadores continue navegando normalmente.
[55] Comentário enviado por pedroadf em 14/10/2009 - 18:12h
fabricio, show de bola o artigo....parabens....acho q vc iluminou mtas mentes desde de 2007.....depois de varias buscas e tentativas frustradas achei um q realmente pode resolver meu problema....
se puder me dar uma luz eh o seguinte:
meu cenario eh simples
eu tenho: 1 frame e um adsl ligado a um fw...
meu firewall tem 3 interfaces: eth0-->frame eth1-->adsl e eth2--> rede local
oque acontece eh o seginte hj meu trafego todo eh pelo frame(eth0) minha adsl eh boa e ta parada....
eu qeria que o pessoal da minha empresa navega-se pelo adsl, mas o gateway default do firewall eh meu frame...
ai a minha ideia eh, uma parte da minha rede (servidores e ips dos diretores) navegarem pelo frame e o restante sair pelo adsl
vc poderia me dizer como eu conseguiria fazer essa façanha??mas sem usar balanceamento?? se possivel no max eh o pessoal da adsl quando cair o link jogar para o frame?.
ficou show o artigo so n consegui visualizar essa ideia de determinado ips por exemplo: 192.168.0.3 sair pelo frame e o 192.168.0.10 sair pelo adsl
gratooo
aguado um apoio seu
[56] Comentário enviado por fabricioguzzy em 14/10/2009 - 21:57h
PedroAF,
Isso é Simples.. Basta vc fazer roteamento pela origem..
O artigo tem exemplos de como fazer isso... Lá no final dele...
Se preferir ler algo a respeito de Roteamento pela origem apenas, estou postando abaixo dois links de artigos que só falam disso. Os artigos são de outros colegas, não são meus, mas lendo, tenho certeza que funcionam pra vc.
Veja:
[58] Comentário enviado por pedroadf em 20/10/2009 - 15:35h
Fabricio td joia, cara tenho que te agradecer algo simples e funcionou coonforme eu pretendia, fiz um teste onde: parte da minha rede sai pelo frame e e o restante pelo adsl
funcionou legal, agora eu precisava resolver o seguinte ja explorando sua boa vontade, o ADSL como de custume pode falhar, ai eu precisava que o pessoal navega-se pelo frame, oque eu poderia fazer? tem alguma ideia..algo q solucionava.. so precisava disso
que o ADSL falhar vai pro frame e se possivel vice versa....mas se nao somente a primeira hipotese pq o frame so ficou uma vez fora do ar motivo (cortaram o cabo da fibra) hehehe...abracos
[59] Comentário enviado por brunovictor86 em 22/01/2010 - 17:11h
pessoal nao estou conseguindo receber conexao no link2, o meu server esta como o SRF, se mudo o default gatway pra eth1 ai consigo ..
iptables -t nat -F
iptables -t nat -X
iptables -F
iptables -X
IF_LAN='eth2'
IF_LINK1='eth0'
IF_LINK2='eth1'
GW_LINK1='10.1.1.1'
GW_LINK2='201.223.203.1'
iptables -t nat -A POSTROUTING -o $IF_LINK1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF_LINK2 -j MASQUERADE
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 80 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 443 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 3128 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 22 -j MARK --set-mark 3
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 3128 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 3
ip rule add fwmark 2 table 2 prio 2
ip rule add fwmark 3 table 3 prio 3
#ip rule add from 192.160.1.0/24 table 2
ip route add default via $GW_LINK1 dev $IF_LINK1 table 2
ip route add default via $GW_LINK2 dev $IF_LINK2 table 3
ip route flush cache
quando o default gateway esta na rede 10.1.1.1 eu nao consigo acessar de fora o ip '201.223.203.1' pela porta 22...
mas consigo sai pelo '201.223.203.1' na porta 22 pra fora
se alguem puder me ajudar ..
[60] Comentário enviado por mcs_22 em 02/03/2010 - 13:46h
Caro Fabricio,
em primeiro lugar parabens pelo artigo, me ajudou muito aki na empresa, porem estou com um cenario e com dúvidas.
Tenho um servidor linux
placa Eth0 conectado rede interna da empresa.
placa Eth1 conectado a uma de internet para acessos externos.
porem preciso que meu servidor acesse as duas redes, o acesso aos hosts da rede interna funciona normalmente porem preciso de roteamento para o acesso dos computadores da matriz, logo preciso de um GW para isso. Porem para que meu servidor tenha acesso a internet, para os serviços que utilizo preciso tbem do GW2 que esta na interface eth1.
Duvida,
sei que o servidor se perde com dois default gw.
preciso que meu servidor gerencie essas rotas para que o mesmo consiga acessar a rede interna e ter acesso a internet pela outra interface
por exemplo:
qd ping 10.1.1.21 que esta na matriz ele redirecione para eth0 df gw interno.
ping www.uol.com.br ou qualquer serviço que necessite da internet para eth1 df gw externo.
[62] Comentário enviado por demattos em 27/10/2010 - 18:20h
Boa tarde amigo, tenho um dilema para resolver e o seguinte tenho um link com a embratel e uso um roteador cisco 2801 e gostaria e subistituir este roteador por uma maquina linux, vc poderia me auxiliar ou me orinetar como fazer isto.
[64] Comentário enviado por willian.barker em 15/02/2011 - 10:11h
Porque quando eu uso (ip rule add from 192.168.1.1 table "tabela") a conexão e o ping ficam lentos?
Já quando eu uso marcação a conexão é perfeita.
Dê uma olhada nos testes.
Dê uma olhada nos dois testes que fiz com ping o primeiro teste é com marcação da porta 80 e o segundo teste é por ip rule add from ipestacao table tabela.
O problema é que quando eu coloco regra por marcação eu cosigo navegar beleza pela estação, mas quando eu coloco a regra acima a conexão fica lenta.
1º teste:
****************************************************************************
PING google.com (64.233.163.104) 56(84) bytes of data.
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=1 ttl=250 time=165 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=2 ttl=250 time=166 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=3 ttl=250 time=173 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=4 ttl=250 time=175 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=5 ttl=250 time=196 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=6 ttl=250 time=182 ms
2º teste:
****************************************************************************
PING google.com (64.233.163.104) 56(84) bytes of data.
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=1 ttl=53 time=211 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=2 ttl=53 time=63.3 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=3 ttl=53 time=55.4 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=4 ttl=53 time=57.4 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=5 ttl=53 time=56.1 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=6 ttl=53 time=57.5 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=7 ttl=53 time=328 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=8 ttl=53 time=57.4 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=9 ttl=53 time=56.6 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=10 ttl=53 time=71.8 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=11 ttl=53 time=61.0 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=12 ttl=53 time=56.4 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_req=13 ttl=53 time=336 ms
[67] Comentário enviado por joorlando3 em 18/08/2011 - 13:51h
Bom dia!
Alguém conseguiu configurar o load Balance com o squid no mesmo servidor. Segui o guia e deu tudo certo, porém se habilito o squid a navegação para de funcionar.
O que pode ser ser? Tenho que colocar a linha que direciona a conexão para o squid (abaixo) antes do load balance
$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Desde já agradeço.
Depois de um certo tempo pesquisando, consegui fazer o squid funcionar usando o PREROUTING e POSTROUNTING.
[68] Comentário enviado por rwsampaio em 10/08/2012 - 23:29h
Fabrício,
Preciso balancear dois links de 4Mb do mesmo backbone, onde minha rede interna é toda com IP Dinâmico, mas gostaria que os clientes ao acessarem fossem divididos. para que possa usar os dois link´s o mais homogeneos possíveis.
[70] Comentário enviado por genaldo em 18/01/2013 - 00:55h
Parabens pelo trabalho de vcs aqui viu. isso he uma mao na roda e tudo de graça , he preciso agradecer realmente. Vcs sao demais. continuem nos ajudando., muito obrigado
[71] Comentário enviado por sergio_sousa em 01/02/2014 - 00:28h
Muito bom sua dica nota 10 parabéns.
Mas Fabrício usei seu script no meu firewall e acontece que também possuo 2 links um para internet e outro para acessar o sistema, só que, quando digito qualquer site ele navega normalmente, então estar saindo pelo link1, mas quando vou acessar o sistema dar a mensagem de como o meu proxy não deixasse sair, aparece a tela de como se fosse acessar o sistema depois cai. E ai como posso resolver isso. Estou por um fio pois pra semana vai ser aberta a empresa.
[72] Comentário enviado por fabricioguzzy em 02/02/2014 - 11:42h
Sergio Souza,
Você está usando Proxy? Se SIM, veja o comentário número 67] do joorlando3 acima.
Se NÃO, com toda certeza você esqueceu de alguma regra PREROUTING para as portas 80 e 443 (hhtp e https)
Cuidado, alguns sistemas, mesmo sendo Web Based (feitos para serem acessados via browser) usam portas não convencionais como as citadas acima (80 e 443). Verifique se não é o seu caso.
Se for, adicione uma regra para a porta que está faltando.
Boa Sorte ai!
Abraço
Fabricio.
[73] Comentário enviado por frodopuc em 06/04/2015 - 10:32h
Olá amigo, seguinte, ve se pode me ajudar (sou novato na parte de linux, fiquei um tempo sem trabalhar com linux e voltei agora, passando pelo seguinte problema).
Temos 3 ETH, eth0 lan, eth1 link1, eth2 link2.
Quero dizer que somente um computador vai sair pelo link2, por que? Por que ele faz acesso a página do banco do Bradesco na parte juridica e fica caindo pois fica trocando de IP, alternando o link de saida. O site nao aceita isso e derruba o usuário.
Mas somente um computador vai fazer uso desse esquema. O que eu posso fazer? =/
[74] Comentário enviado por schüler em 22/05/2015 - 13:36h
Olá... possuo no meu servidor 3 links (3 interfaces) eth0 = link1, eth1=link2 e eth2=lan... Quero fazer com que determinados sites sejam redirecionados para o link1(eth0) e o resto para o link2(eth1)...
ex, se um usuário da minha rede interna acessar o site www.vivaolinux.com.br o firewall vai jogar o acesso para o link1(eth0), mas se ele acessar o www.google.com.br o firewall vai jogar o acesso para o link2(eth1)...
você poderia me ajudar????
[75] Comentário enviado por hugolinux em 11/01/2017 - 11:16h
Fabrício, ótimo artigo!
Poderia me ajudar numa questão? Hoje tenho um rede da seguinte da seguinte forma:
ETH0: Link Internet 1
ETH1: Link internet 2
ETH2: REdeServidores (DMZ)
ETH3: RedeInterna
Qual seria minha implementação:
Fazer com que meu proxy que tem o ip 172.29.0.15 (rede servidores dmz), que autentica no meu ad 10.x.y.z (rede interna) saia pelo Link de Internet 2 (ETH1)
Quando faço a regra o mesmo sai normalmente, mas deixa de enxergar o autenticador e da rede interna não conseguímos mais acessar o ip da rede servidores.
Resumindo - Regras feitas
172.29.0.15 -> Link de internet 2 - OK
172.29.0.15 -> autenticador 10.x.y.z - NOOK
Rede Interna -> 172.29.0.15 - NOOK
Espero que tenha sido claro e fico grato pela atenção
[76] Comentário enviado por fabricioguzzy em 11/01/2017 - 21:56h
Olá Fabiano,
Já faz alguns anos que montei estes scripts, mas vou tentar te ajudar.
Pela descrição do seu problema me parece que está faltando rota no seu servidor/Firewall.
Faça um teste usando o comando traceroute e veja pra onde é que o firewall está mandando seus pacotes que deveriam ir para a rede Interna...Caso saiba mexer com o tcpdump, tente monitorar os pacotes usando ele.
[77] Comentário enviado por eragoke em 05/06/2017 - 10:58h
Boa tarde preciso de uma ajuda, tenho que implementar mais um link de internet em um servidor que já tem firewall e proxy, só que preciso fazer com que as maquinas usem apenas a internet mas continuem na mesma rede com acesso ao sistema e ao servidor de arquivos.
[78] Comentário enviado por carlos_julianoti em 23/06/2020 - 14:25h
Esses dias houve essa necessidade aqui na empressa que trabalho de usar 2 links de internet passando por um unico firewall, esse post foi uma mar de agua pra resolver esse problema. vlw amigo, continue compartilhando conhecimento.