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