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

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

Firewall e NAT em FreeBSD com controle de banda e redirecionamento de portas e IPs

Firewall para o dia a dia

Instalando um firewall mínimo em Debian

Balanceamento de link + redundância

Entendendo TCP/IP (Parte 6) - Firewall

  
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