Conexões de entrada e saída com 2 links em um servidor

Neste artigo mostrarei como fazer para aceitar conexões em um servidor com 2 links usando iproute2 e iptables de forma simples e prática. Encontrei várias dúvidas não sanadas na maioria dos fóruns em que pesquisei e agora consegui fazer isso funcionar. Mãos a obra!

[ Hits: 78.301 ]

Por: Glaucio Klipel em 07/12/2007


Início



Há algum tempo me deparei com um problema na empresa em que trabalhava. Tínhamos um sistema PostgreSQL que receberia conexões de filiais pela internet, mas tínhamos relativamente pouca banda para suportar navegação dos usuários mais conexões ao sistema em um mesmo link.

Foi então que contratamos um segundo link ADSL para dar conta do serviço sem influenciar na banda de navegação. Seria até um milagre fazer funcionar tudo sem interferências visíveis, pois a estrutura conta com:
  • 50 computadores na rede local acessando simultaneamente a internet;
  • 1 servidor PostgreSQL;
  • 30 computadores que acessam o PostgreSQL pela internet simultaneamente;
  • 1 Link ADSL PPPoA BrasilTelecom 800/320 Kbps.

E enfim, o que resolveria o problema:
  • 1 Link ADSL PPPoE BrasilTelecom 608/512 Kbps.

Nem cbq resolveria o problema, então resolvi correr atrás de como fazer as conexões de entrada do PostgreSQL para o servidor usando o link 608/512 sem que outros computadores usassem o mesmo link.

Deixei funcionando um bom tempo com o tráfego do servidor PostgreSQL inteiro desviado para o link 2, mas não era isso que eu queria e não é isso que a maioria que busca essa solução quer! Eu queria somente o tráfego de entrada e saída do servidor PostgreSQL na porta 5432 saindo pelo link 2!

Então, finalmente, cheguei a uma solução 100% eficaz.

    Próxima página

Páginas do artigo
   1. Início
   2. Tabelas de roteamento no iproute2
   3. Marcando corretamente os pacotes com o iptables
   4. O iproute2 tomando conta dos pacotes
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Desvendando as regras de Firewall Linux Iptables

Addon URL Filter - Filtrando URLs no seu firewall

Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).

Implementando prioridade nos serviços com TOS no Iptables

Firewall para o dia a dia

  
Comentários
[1] Comentário enviado por rrinfor em 08/12/2007 - 20:24h

Ótimo artigo glaucio_klipel!

Queria aprender algo com vc, pois minha necessidade em relação a essa solução é o contrário, exemplo:

Tenho um link de 2MB da Embratel, configurado em um Server HP ML350 G5 da HP, onde roda: Iptables, squid, DNS e NTP, onde atendo 200 usuários, mas queira aliviar esse link com uma conexão via satélite da RAGIO que é somente descida (down), como eu procederia no iproute e iptables para que eu pudesse fazer esse balanceamento e dividir o tráfego http de descida da embratel com o ragio??

Exemplos de conf:

Roteador Cisco 2811 = eth0 = 200.200.200.1
Ragio Conexão down = eth1 = 10.10.0.1
Rede Local = eth2 = 192.168.0.254

Realmente preciso dessa solução se vc puder me ajudar, fique a vontade para mandar e-mails ou me adicionar no msn, franklin_all@hotmail.com


abraços e boa sorte!

Robson Franklin

[2] Comentário enviado por marx599 em 11/12/2007 - 10:01h

Muito bom o artigo, mas seria possível fazer com que 2 links fossem compartilhados para uma mesma placa de rede, usando um servidor linux, iptable e tudo mais...

Exemplo:

eth0 | eth1 para eth2

ou isso seria impossível devido só poder colocar um só roteador padrão na eth2??

[3] Comentário enviado por glaucio_klipel em 11/12/2007 - 13:06h

rrinfor, te adiciono no msn pra poder trocar uma ideia melhor blz?

marx, se é o que eu entendi, vc quer ligar dois roteadores em duas placas de redes diferentes e que tenha saída em uma placa para a rede interna ao inves de ligar os dois roteadores em uma placa de rede só, é isso???

no caso, dá pra ligar em uma placa de rede somente ou dá pra ligar em duas, tanto faz! a única coisa é proceder como os exemplos, mas com ips para as diferentes placas de rede.

Se o caso for compartilhar dois links com uma placa de rede só e fazer com q eth0 e eth1 com diferentes redes acessem, dá pra fazer tranquilo também, siga o exemplo:

eth0: 192.168.1.0/24
eth1: 172.168.15.0/24
eth2: 10.1.1.2/32 com gateway 10.1.1.1

adicione normalmente as tabelas de roteamento e defina os gateways nas referidas tabelas, após isso use o iptables para marcar os pacotes vindos de cada rede, por ex.:
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 172.168.15.0/24 -j MARK --set-mark 2

assim vc marcou os pacotes de cada rede, no caso, sempre vai existir o roteador padrão na tabela main, então não seria necessário marcar as duas redes. Você só vai precisar desviar uma mesmo! eheheh

Depois disso vc mostra qual é a saída padrão para a rede marcada com o comando

ip rule add fwmark 1 lookup <TABELA_SECUNDARIA>

no caso o fwmark é a marcação que vc fez antes no iptables...

Dá pra fazer um monte de coisas com o iptables + iproute2, se vc seguir as logicas das regras do artigo vc entende perfeitamente como fazer as conexões de entrada pelo 2 link saírem ainda pelo 2 link... é complicadinho, mas dah pra fazer miseria heheheheh

abraços!!!

[4] Comentário enviado por Feltes em 13/12/2007 - 10:05h

Olá Pessoal,
Eai Glaucio poderia me adiciona no seu msn tb para trocar umas idéias.. felipe_feltes@hotmail.com
Eu estava com esse mesmo problema e o que faltava era INPUT OUTPUT, mas agora funcionou legal!

Abraço!

[5] Comentário enviado por celsof2 em 26/03/2008 - 05:57h

wlwwwwwwwwww eu estava precisando disso kra..........

[6] Comentário enviado por hfl.titansware em 01/07/2008 - 02:02h

Opa!
Só uma dúvida!!

iptables -t mangle -A POSTROUTING -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1

O /32 é mascara cheia OK?
tem alguma nessecidade de botar /32?

Grato

[7] Comentário enviado por glaucio_klipel em 10/12/2008 - 18:22h

não há necessidade do /32 não... eu sempre uso, mas se não quiser...

[8] Comentário enviado por andersonmanzano em 13/12/2008 - 11:23h

Glaucio Klipel, este artigo caiu do ceu...

Cara, Nao manjo muito de linux, mas tenho uma empresa com estações Win Xp e servidor de dados linux(Red Hat 9- c/ Samba) com apenas uma placa eth0, rodando postgreSQL e que recebe conexao pela porta 5432, com internet roteada de gateway-192.168.0.1, até ai td tava conectando blz ; O problema é que agora eu precisei instalar mais uma internet com gateway - 192.168.0.3 , e fiquei com 2 links precisando de conexao simultanea na porta 5432 do meu linux.

As duas internet sao speedy business com ips externos fixos e roteados com dlink wbr 2310 - ambos conf. porta 5432 para o ip do serv. linux - 192.168.0.101

Se altero o gateway do serv. linux p 192.168.0.1 conexao perfeita (telnet ok) , se altero pra 192.168.0.3 tb rola; mas as duas juntas nao rola.

Qual a magica....

Obrigado...

[9] Comentário enviado por glaucio_klipel em 16/12/2008 - 12:30h

Cara, você configurou corretamente as tabelas de roteamento? Nunca se coloca dois gateways na tabela main, a não ser em um caso de load balancing, senão seu server vai se perder!

Manda uma descrição dos passos que você fez no meu e-mail... gklipel [em] gmail [ponto] com


[10] Comentário enviado por metall em 20/11/2009 - 06:48h

Glaucioooooooooooooo Kenga [*****]!
Parabens pelo artigo muito bom!

hiahaiahiahaiahiahaiahiahahaiahiahia


[11] Comentário enviado por kamionero em 19/01/2010 - 15:17h

Olá glaucio_klipel.. Parabéns pelo artigo. Estou com um probleminha para habilitar este processo em minha rede.

Seguinte.
Tenho 2 links.

1) eth0 - Link OI Dedicado
2) eth2 (ppp0) - ADSL Empresarial OI (Ip Fixo)

3) eth1 - Rede interna.

Gostária de fazer a seguinte divisão.

* Todo o trafego gerado na rede interna sair e entrar pelo link de ADSL (eth2) (Default GW);
* Todo o trafego externo direcionado ao link OI Dedicado entrar e sair por este link em todas as portas.
* Todo o trafego externo direcionado a ADSL entrar e sair por esta ADSL em todas as portas.

Segue o script que estou utilizando para tentar fazer este processo (baseado em seu script).
iptables=/sbin/iptables
ip=/sbin/ip

#tabela adsl
$ip route add 192.168.10.0/24 dev eth1 table adsl
$ip route add 10.1.1.1/32 dev ppp0 table adsl
$ip route add default dev ppp0 table adsl

#tabela link
$ip route add 192.168.10.0/24 dev eth1 table link
$ip route add 10.2.2.0/24 dev eth0 table link
$ip route add default dev eth0 via 10.2.2.1 table link
$ip route flush cached

#Configurando Firrewal
$iptables -t mangle -A PREROUTING -p tcp -s 192.168.10.0/24 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -s 0/0 -d 10.1.1.1 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -s 0/0 -d 10.2.2.2 -j MARK --set-mark 2

$iptables -t mangle -A INPUT -p tcp -s 0/0 -d 10.1.1.1 -j MARK --set-mark 1
$iptables -t mangle -A INPUT -p tcp -s 0/0 -d 10.2.2.2 -j MARK --set-mark 2

$iptables -t mangle -A FORWARD -p tcp -s 10.1.1.1 -d 192.168.10.0/24 -j MARK --set-mark 1
$iptables -t mangle -A FORWARD -p tcp -s 10.2.2.2 -d 192.168.10.0/24 -j MARK --set-mark 2

$iptables -t mangle -A POSTROUTING -p tcp -s 192.168.10.0/24 -j MARK --set-mark 1

#Configurando o IPROUTE2
$ip rule del fwmark 1
$ip rule add fwmark 1 lookup adsl
$ip rule del fwmark 2
$ip rule add fwmark 2 lookup link

#Muda a rota padrão do sistema
$ip route del default
$ip route add default dev ppp0
$ip route flush cached
###------------------FIM

Porem este não esta funcionando de forma adequada.

Poderia me ajudar a solucionar este problema, acredito estar na marcação dos pacotes.

Obrigado.
Rodrigo.

[12] Comentário enviado por marcoscarraro em 08/05/2012 - 09:46h

Foi de grande ajuda,
Abraços
Marcos Carraro.

[13] Comentário enviado por Neo_X em 21/02/2013 - 17:48h

Como marca uma regra de NAT?

[14] Comentário enviado por cainf em 27/01/2014 - 09:55h

Fala ae Glaucio beleza, minha duvida é mais simples que isso tenho 3 placas

eth0 = recebe a net
eth1 = 192.168.0.250 rede interna
eth2 = 10.0.0.10 = separada para roteadores wireless

A minha rede interna navega normalmente com o iptables/squid

Quero separar a rede e dar acesso total na eth2 que envia o sinal para os roteadores sem fio

O que nao estou conseguindo fazer é liberar a net para esse roteador e nao estou conseguindo acessar o mesmo

Agradeço desde ja

[15] Comentário enviado por glaucio_klipel em 28/01/2014 - 07:26h

Opa cainf, primeiro vc trabalhar com a regra de MASQUERADING para a 10.0.0.0/24

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

Depois proíba todo o tráfego da rede 10 para a 192

iptables -I FORWARD -s 10.0.0.0/24 -d 192.168.0/24 -j DROP

Depois habilite todo o tráfego da 10 para a net

iptables -A FORWARD -s 10.0.0.0/24 ! -d 192.168.0.0/24 -j ACCEPT

Lembre-se de que o ip forwarding tem que estar ativo, veja se vc tem o arquivo /etc/sysctl.conf e modifique a entrada net.ipv4.ip_forward=1 de 0 para 1 e aplique com sysctl -p ou então echo 1 >/proc/sys/net/ipv4/ip_forward

Aos outros que perguntaram, desculpem, mas pelo teor das dúvidas sugiro que procurem um pouco mais de documentação pois a aventura é realmente estudar como funciona a coisa e não receita de bolo.

Abraço!

[16] Comentário enviado por cainf em 30/01/2014 - 15:16h

Amigo Glauco obrigado pela atenção

Olha que fiz apenas coloquei essa regra

ip addr add 192.168.0.5/24 dev eth2

Libera para wireless sem restrições ou seja nao passa pelo squid

So que se eu conectar de um note por wireless vai me trazer um ip da classe A até ai tudo bem porém se eu mapear a minha rede da Classe C ou seja \\192.168.0.250\comum vai me pedir usuario e senha

Coloquei essa regra que tu falou o que realmente deveria barrar

iptables -I FORWARD -s 10.0.0.0/24 -d 192.168.0/24 -j DROP

Mas nao barrou, bom vou tentar outros comando e lhe digo

Mais uma vez obrigado :)

[17] Comentário enviado por ederpaulopereira em 16/02/2015 - 20:11h


Olá amigo. Estou fazendo uns testes com uma routerboard da mikrotik para balanceamento de links de internet. Porém, eu queria que alguns hosts específicos saíssem pelo link dedicado, o restante pode ser balanceado. No entanto, minha rb não conhece os hosts, pois a topologia é algo assim

INTERNET >> ROUTER BOARD >> PROXY(SQUID/IPTABLES) >> REDE LOCAL.

Teria como fazer isso, marcar os pacotes no proxy e pegar essa marcação no mikrotik?

Agradeço;

Eder


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts