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