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: 75.156 ]

Por: Glaucio Klipel em 07/12/2007


O iproute2 tomando conta dos pacotes



Agora sim! Temos tráfego de entrada e saída corretamente marcados e identificados para podermos desviar o tráfego.

Vamos agora cortar a terra e fazer o canal para ligar com o link 2. Como os pacotes receberam uma marca '1' do firewall, vamos contar pro iproute que os pacotes com marca '1' devem procurar a tabela que criamos, no meu caso, a tabela postgres.

ip rule add fwmark 1 lookup postgres

Note que antes adicionamos as rotas com o comando ip ROUTE, agora usamos o ip RULE. Por quê? Porque estamos adicionando uma REGRA e não mais uma ROTA!

Feito isso, devemos efetivar as regras de roteamento com o comando:

ip route flush cached

Pronto! Agora todo o tráfego que chegar no link 2, entrará pelo link 2, o Linux manda o pacote para o destino certo, que é o nosso servidor PostgreSQL, e retorna para o Linux, que agora sim irá entender que o tráfego da porta 5432 do servidor PostgreSQL DEVE sair pelo link 2!

Há uma forma muito mais simples de se fazer isso, mas preste atenção pois TODO o tráfego do ip que você indicar VAI SAIR E ENTRAR pelo link 2. Se você não se importa com isso, tudo bem, vá em frente. No meu caso isso não é útil pois tenho outros serviços como HTTP e FTP no servidor PostgreSQL e só funcionam com o link 1 que é empresarial, que os gente boa da BrasilTelecom não cortaram tráfego nas portas 80, 20 e 21 já por ser um link de IP fixo e empresarial, diferente dos domésticos com IP dinâmico que até onde eu saiba todas as empresas de telefonia cortam estes serviços. O meu link 2 é um doméstico, portanto, não pude redirecionar todo o tráfego para o link 2 pois não conseguiria fazer funcionar o HTTP e o FTP. Aí vai o comando então:

ip rule add from 192.168.1.102 lookup postgres
ip route flush cached

Pronto, TODO o tráfego está redirecionado. Faça isso SOMENTE no caso de não ter serviços HTTP e FTP ou se o link 2 REALMENTE aceita conexões nas portas que você precisa.

Conclusão

Demorei um belo de um tempo pra entender como funciona esse cruzamento entre o iproute2 e o iptables. As documentações são extremamente escassas e os usuários.... Hmmmm esses sim são escassos... Mas de boa vontade hehehe.

Todos os fóruns que eu passei eu não vi UM sequer que pensasse antes de responder. Se não sabe como fazer ENTRADA e SAÍDA, não responda! Não confunda a pessoa que já está confusa! hahaha

Fazendo dessa forma consegui um resultado 100%, tudo funciona pelo link 1 e somente o tráfego do PostgreSQL entra e sai pelo link 2.

Espero ter sido útil!

Abraço a todos e muito boa sorte!

Página anterior    

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

Montando regras iptables

Criando um firewall simples e compartilhando a conexão usando o IPtables

Firewall Linux - Roteamento avançado usando iproute2 e iptables (load balance)

Abrindo "passagem" para clientes de correio

Como bloquear o Ultrasurf - solução definitiva (iptables + Fail2ban)

  
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, [email protected]


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.. [email protected]ail.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