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!
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!
[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
[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
[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!
[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.
[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
[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.
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.
[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
[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?