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.705 ]

Por: Glaucio Klipel em 07/12/2007


Marcando corretamente os pacotes com o iptables



Nesta parte é onde ocorre a maioria dos erros do pessoal.

SEMPRE vejo nos fóruns o pessoal mandando marcar os pacotes de determinada porta com a tabela mangle. Não deixa de estar certo, mas deixa muito a desejar quanto a funcionalidade do negócio!

Precisamos entender como as conexões no segundo link serão feitas. No caso, se conferir a tabela main do iproute2:

ip route show table main

Podemos perceber que o gateway é o link 1. Se conferir agora a tabela postgres:

ip route show table postgres

Percebemos que o gateway é o link 2. Mas temos que entender que todas as conexões por padrão, entram e saem pela tabela main, então precisamos desviar tudo que queremos que entre e saia para a tabela postgres, ou seja, para a tabela que criamos com o valor 200 no rt_tables.

Quando tentamos conectar pela internet em algum serviço pelo link 2, depois de criadas as tabelas de roteamento e efetivadas as regras, até conseguimos conexão, porém o serviço recebe a conexão pelo link 2, mas envia os dados pelo link 1! Por quê? Porque o padrão de roteamento é a tabela main, e não a tabela que criamos, pois ainda não mechemos em nenhum tráfego.

É aí onde se deve dar mais atenção, pois não devemos somente marcar os pacotes com a tabela PREROUTING do iptables. Dessa forma não vai funcionar! Depois de muito pesquisar, cheguei às seguintes regras:

iptables -t mangle -A POSTROUTING -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 5432 -j MARK --set-mark 1
iptables -t mangle -A INPUT -p tcp --dport 5432 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -p tcp --dport 5432 -j MARK --set-mark 1

Note que estou marcando o tráfego da porta 5432 de ORIGEM e DESTINO. Usando o --sport estou indicando que o tráfego da porta de origem 5432 deverá receber uma marca '1'. Analise bem as regras e veja que as regras valem tanto pra --sport quanto pra --dport. Por quê? Por que o meu Linux precisa saber que a porta de destino 5432 vai receber conexões pelo link 2 e a porta de origem 5432 vai SAIR pelo link 2, que está respondendo na tabela que criamos no rt_tables!

Marque tudo! Entrada, saída, pré-roteamento e pós-roteamento.

Pronto, agora todos os pacotes safadões do PostgreSQL estão dedurados!

Página anterior     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

Script de Firewall com redirecionamento de portas em Linux Debian

Como criar um firewall de baixo custo para sua empresa

IPTables - Desvendando o mistério

Shorewall, uma excelente opção para firewall Linux

Firewall seguro com o IPTables

  
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