Roteamento de entrada/saída com iproute e iptables

Na internet tem muita documentação relacionada com o balanceamento de saída com 2 ou mais links de internet, mas nenhuma documentação relacionada quando você quer ter seus servidores ( email, web, terminal service etc) respondendo para a internet por todos seus links disponíveis.

[ Hits: 38.770 ]

Por: Tiago Henrique Pires em 15/11/2008 | Blog: http://tiagonux.blogspot.com


Introdução



Bom pessoal, depois de muito estudo em cima do iproute e iptables para fazer funcionar o roteamento avançado de entrada e saída para redirecionamento de portas por mais de um link de internet, resolvi postar a solução.

Na internet tem muita documentação relacionada com o balanceamento de saída com 2 ou mais links de internet, mas nenhuma documentação relacionada quando você quer ter seus servidores ( email, web, terminal service etc) respondendo para a internet por todos seus links disponíveis.

Essa solução resolve seu problema da seguinte maneira:
  • Sua empresa tem 2 links de internet ou mais;
  • Você tem servidores disponibilizando recursos para a internet como smtp, pop3, web, rdp etc;
  • Quer que seja transparente para todos quando um link de internet para de funcionar, você pode via DNS round-robin fazer que um host responda por 2 IPs válidos ou mais. Isso seria ótimo para seu servidor de email. São 2 IPs respondendo por smtp e pop3 e caso um link caia o outro fica respondendo normalmente. O DNS é nosso amigo!

Veja a topologia que iremos nos basear para criar as regras de iptables e iproute:
Linux: topologia de rede
Na topologia acima temos 3 servidores em nossa rede disponibilizando serviços web, pop3, smtp e terminal service à internet.

Na configuração da zona de DNS do domínio utilizamos round-robin para todos os serviços. Cada serviço tem um nome e 2 IPs válidos respondendo por esse nome de DNS.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Script de roteamento
Outros artigos deste autor

Firewall/Proxy (solução completa)

Shared Config com Apache a la brasileira

Montando um servidor X com o Linux

Leitura recomendada

Firewall para o dia a dia

Firewall rápido e seguro com iptables

Arno Iptables Firewall (poderoso e simples)

Firewall profissional

Controle de banda com Slackware 10 + CBQ + Iptables + DHCP

  
Comentários
[1] Comentário enviado por renato.leite em 15/11/2008 - 20:11h

Otimo artigo, ta muito bom mesmo =]

[2] Comentário enviado por cassimirinho em 15/11/2008 - 20:31h

Belo trabalho!

Sensacional!

[3] Comentário enviado por downloadd em 17/11/2008 - 09:39h

Dúvidas...
1. Como é possível fazer o DNS reverso funcionar com dois links?

2. Neste script você mostra como fazer a priorização de certas portas e diz por qual link tal porta irá sair, mas pelo que vi, esta faltando a divisão de carga entre os links.
Como ficaria por exemplo se caso eu quisesse somar os dois links WAN com a marcação de pacotes?

3. Fazendo a marcação de pacotes em um link muito requisitado, irá ocupar uma maior taxa de processamento? Lentidão?

4. Quem tem mais prioridade, a regra 0 ou a 255?
Parabéns pelo artigo, esta bem explicado.

[4] Comentário enviado por danilotm em 17/11/2008 - 10:31h

Olá Tiago, tinha um sistema parecido, porém tive alguns problemas para efetuar este tipo de roteamento.
Acredito que esse artigo me auxiliará bastante a reatar esse sistema com dois links de Internet.

Parabéns e abraços.

Danilo

[5] Comentário enviado por tiagonux em 17/11/2008 - 15:00h

Olá a todos

Em resposta das dúvidas de downloadd :

1 - O DNS reverso será configurado nos servidores de DNS para cada IP. Você pode ter configurar normalmente em seu servidor caso a operadora de telecom tenha passado isso para você. Ou pedir para as operadoras de Telecom configurar o DNS reverso para cada IP.

2 - O Script não faz priorização de pacotes, o objetivo dele é rotear os pacotes na entrada pelos links. Ele marca o pacote quando ele entrar por um determinado link e assim o pacote voltar pelo link que entrou.

3 - Você pode até fazer um load balance, mas ai ele se encaixa na saída. No script é feito um roteamento mais avançado na entrada do pacote. Você poderá até usar o cbq para criar regras de controle de banda por protocolo ( smtp,pop3) para diminuir a carga de um link.

4 - As regras de roteamento são lidas apartir da prioridade 0. Caso um pacote se encaixe em uma regra de roteamento ele é processado caso não ele vai até o final e poderá ser processado pela ultima regra.

Obrigado a todos que gostaram do artigo, qualquer dúvida estou a disposição.

[6] Comentário enviado por clovesjr em 18/11/2008 - 08:50h

Muito bom....

Eu já uso o balanceamento de saída para dois links na empresa onde trabalho mas sempre tive este problema para o tráfego de entrada... Ŕealmente é como vc disse, tem muita documentação dizendo como fazer o balanceamento de saída mas não como tratar corretamente o tráfego de entrada...

Seu artigo me ajudou muito...

Parabéns...

[]s

Cloves Jr

[7] Comentário enviado por alvaromo em 18/11/2008 - 09:54h

Rapaz, achei show este teu artigo. Creio que quem já passou por situação semelhante e não conseguiu resolver, sabe dar real valor ao teu artigo.

Muito show!!!

Alvaro Mendes

[8] Comentário enviado por sebastianosilva em 18/11/2008 - 23:36h

caro amigo estou com um modem Gi-Link WL-2404BRG AP-Plus e nao estou conserguido configura ele come e que eu fasso ,para internete vida

[9] Comentário enviado por bluesball em 19/11/2008 - 10:31h

Gostei muito... estou adaptando para implementar aqui na empresa...

qualquer dúvida ... sei onde t encontrar...heheh

[]' s

[10] Comentário enviado por danusio em 15/05/2009 - 19:14h

Gostaria de Saber onde foi declarado a variavel LINK_WAN2?

[11] Comentário enviado por tiagonux em 19/05/2009 - 21:27h


Hahhaha vendo pela figura eu tenho os 2 links em um switch. Assim não é necessário inserir uma outra placa de rede.

[12] Comentário enviado por terranova em 29/06/2009 - 11:02h

Alguém já conseguiu rotear conexões da porta 80, porta 25 para outros servidores usando load bance ?

[13] Comentário enviado por gi em 13/07/2009 - 10:17h

olá..
preciso de ajuda, para configurar a seguinte regra no meu firewall iptables..
é o seguinte tem um portal dentro da minha rede interna que esta funcionando neste endereço .72.16.1.21 na porta 8080, e quero que ele redirecione para a máquina 182.16.1.2.
quando eu clico no link da pagina onde ele tem que fucionar diz o seguinte este endereço 200.101.122.43:8090 não pode conectar.
como eu faço para poder funcionar na rede interna quando eu clicar no link?
eu fiz a seguinte regra e não funcionou..
iptables -t nat -A PREROUTING -p tcp -s 172.16.1.21 -sport 8080 REDRECT 182.16.1.2:8090
ou
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 200.101.43 -p tcp --dport 8090 -j DNAT --to-destination 182.16.1.2:8090
não sei ja tentei um monte de regras e nenhuma funcionou, será que pode me ajudar.

200.101.122.43- endereço do moldem
172.....- endereço da rede interna
192....-endereço da rede

obrigada pela atenção!
gisele.


[14] Comentário enviado por suportlinux em 17/09/2009 - 01:42h

Caro

Amigo

Eu estou configurando 2 links em uma maquina firewall ..

e estou usando o seu artigo ..

mas por que não sei ..

não esta funcionando com os dois links só com 1

pode me ajudar


[15] Comentário enviado por tiagonux em 17/09/2009 - 08:11h

Como está o ambiente seu?? Scritp ?

Lembrando que não é só usar o script de roteamento as regras de firewall também devem estar preparadas para o ambiente.

[16] Comentário enviado por suportlinux em 17/09/2009 - 18:04h

Ok

Ai vai o meu script de firewall

#!/bin/bash
IPTABLES=`which iptables`
# -----------------------
PME="eth0"
GVT="eth1"
VPN="tun0"
# -----------------------
VLAN_SOFT=10.1.x.0/24
VLAN_TELEFONIA=10.10.2.0/26
# -----------------------
PME_GW="201.x.x.xx"
GVT_GW="200.xx.xx.xx"
# -----------------------
LINK_PME="eth0"
LINK_GVT="eth1"
REDE_INT="eth3"
# -----------------------
IP_PME="201.x.x.h"
IP_GVT="200.x.x.y"
# -----------------------
MAIL_PORT=22,25,80,110
WWW_PORT=80,81,82,443,1533
WWW_PORT0=8008,8080,8081,8082
# -----------------------
case $1 in
start)
echo "|=====================================================|"
echo "|:Script de Firewall - IPTABLES |"
echo "|:Criado por: Eduardo Gomes |"
echo "|:Técnico em Informática |"
echo "|:suportlinux@yahoo.com.br |"
echo "|:Uso: /etc/init.d/firewall |"
echo "|:$HOSTNAME:.............................ok:|"
echo "|=====================================================|"
echo "|:LIMPANDO AS REGRAS DO FIREWALL:..................ok:|"
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X
$IPTABLES -F -t nat
$IPTABLES -X -t nat
$IPTABLES -F -t mangle
$IPTABLES -X -t mangle
$IPTABLES -Z -t mangle
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "|:Create Reject-and-log-SSH-Bruteforce:............ok:|"
$IPTABLES -N REJECT-SSH
$IPTABLES -A REJECT-SSH -j DROP -m recent --rcheck --name SSH --seconds 60 --hitcount 10
$IPTABLES -A REJECT-SSH -j LOG --log-prefix SSH-Bruteforce:
$IPTABLES -A REJECT-SSH -j REJECT -p tcp --reject-with tcp-reset
$IPTABLES -A REJECT-SSH -j REJECT
echo "|:Blacklist SSH:...................................ok:|"
$IPTABLES -N ssh
$IPTABLES -N blacklist
$IPTABLES -A blacklist -m recent --name blacklist --set
$IPTABLES -A blacklist -j LOG --log-prefix 'SSH REJECTED: '
$IPTABLES -A blacklist -j REJECT
# ------------------------------------------------------------
# echo "|:Inclua aqui teus ips para não sofrer o bloqueio:.ok:|"
# $IPTABLES -A ssh -i eth1 -s 10.10.10.13/32 -p tcp --dport 22 -j ACCEPT
# ------------------------------------------------------------
$IPTABLES -A ssh -m recent --set --name couting1
$IPTABLES -A ssh -m recent --update --name couting1 --seconds 20 --hitcount 3 -j blacklist
$IPTABLES -A ssh -j ACCEPT
echo "|:Kill SSH Brute-force attacks:....................ok:|"
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 60 --hitcount 4 -j REJECT-SSH
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
echo "|:Liberar as portas principais do servidor:........ok:|"
$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 25 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 1571 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 1723 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 5060 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 9998 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 10000:20000 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 10024 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 10025 -j ACCEPT
echo "|:REGRAS DE INPUT:.................................ok:|"
$IPTABLES -A INPUT -p icmp -s 10.10.1.0/27 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.2.0/26 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.3.0/25 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.7.0/25 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.10.0/24 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.20.20.0/24 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p tcp --syn -s 10.10.1.0/27 --dport 3128 -j ACCEPT
$IPTABLES -A INPUT -p tcp --syn -s 10.10.2.0/26 --dport 3128 -j ACCEPT
$IPTABLES -A INPUT -p icmp -j DROP
$IPTABLES -A INPUT -j LOG --log-prefix "INPUT Barrado: "
$IPTABLES -A INPUT -j REJECT
$IPTABLES -P INPUT DROP
echo "|:REGRAS DE PREROUTING E REDIRECIONAMENTO:.........ok:|"
echo "|:..........************* QoS *************........ok:|"
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 10000:20000 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 10000:20000 -j TOS --set-tos 16
# echo "|:..........************* HTB *************........ok:|"
# $IPTABLES -t mangle -A POSTROUTING -p udp --sport 10000:20000 -j MARK --set-mark 0x10
# $IPTABLES -t mangle -A POSTROUTING -p udp --sport 5060 -j MARK --set-mark 0x10
# $IPTABLES -t mangle -A PREROUTING -p udp --dport 10000:20000 -j MARK --set-mark 0x10
# $IPTABLES -t mangle -A PREROUTING -p udp --dport 5060 -j MARK --set-mark 0x10
#$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 10.10.2.4
#$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 5060:5080 -i eth0 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 5060:5080 -i eth1 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 10000:20000 -i eth0 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 10000:20000 -i eth1 -j DNAT --to 10.10.2.4
# echo "|:Proxy transparente para toda as redes:...........ok:|"
# $IPTABLES -A PREROUTING -t nat -p tcp -s $TELEFONIA --dport 80 -j REDIRECT --to-port 3128
# $IPTABLES -A PREROUTING -t nat -p tcp -s $SOFT --dport 80 -j REDIRECT --to-port 3128
echo "|:Marcar pacotes para usar o Link 1:...............ok:|"
$IPTABLES -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -d $IP_PME -m conntrack --ctorigdst $IP_PME -j MARK --set-mark 1 -m mark --mark 0
echo "|:Marcar pacotes para usar o Link 2:...............ok:|"
$IPTABLES -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -d $IP_GVT -m conntrack --ctorigdst $IP_GVT -j MARK --set-mark 2 -m mark --mark 0
$IPTABLES -t mangle -A PREROUTING -i eth0 -j CONNMARK --save-mark
$IPTABLES -t mangle -A PREROUTING -i eth1 -j CONNMARK --save-mark
$IPTABLES -t mangle -A PREROUTING -i eth3 -p tcp -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
echo "|:................................:...........ok:|"
# echo "|:Proxy transparente para toda as redes:...........ok:|"
# ip route del default
# echo "|:................................:...........ok:|"
# ip rule del prio 10 table main
# ip rule del prio 19 fwmark 1 from 192.168.1.3 table link1
# ip rule del prio 20 fwmark 2 from 192.168.1.3 table link2
# ip rule del prio 21 fwmark 3 from 192.168.1.3 table link1
# ip rule del prio 22 fwmark 4 from 192.168.1.3 table link2
# ip rule del prio 23 fwmark 5 from 192.168.1.2 table link1
# ip rule del prio 24 fwmark 6 from 192.168.1.2 table link2
# ip rule del prio 25 fwmark 7 from 192.168.1.4 table link1
# ip rule del prio 26 fwmark 8 from 192.168.1.4 table link2
ip rule add prio 30 table link1
# echo "|:Configurando as tabelas de cada Link:............ok:|"
if ! cat /etc/iproute2/rt_tables | grep -q '^250'
then
echo "250 link1" >> /etc/iproute2/rt_tables
fi
#
if ! cat /etc/iproute2/rt_tables | grep -q '^251'
then
echo "251 link2" >> /etc/iproute2/rt_tables
fi
echo "|:Flush nas tabelas:...............................ok:|"
ip route flush table link1
ip route flush table link2
echo "|:Falo que prioridade a tabela main tem:...........ok:|"
# ip rule add prio 10 table main
echo "|:Falo quem é o gateway da tabela link1:...........ok:|"
ip route add default proto static via $PME_GW src $IP_PME table link1
echo "|:Falo quem é o gateway da tabela link2:...........ok:|"
ip route add default proto static via $GVT_GW src $IP_GVT table link2
# Crio a regra de roteamento para cada tabela de acordo com a marcação do pacote
echo "|:Pacotes http que entraram pela tabela link1:.....ok:|"
ip rule add fwmark 1 from 10.10.2.4 table link1 prio 19
echo "|:Pacotes http que entraram pela tabela link2:.....ok:|"
ip rule add fwmark 2 from 10.10.2.4 table link2 prio 20
# pacotes pop3 que entraram pela tabela link1
#ip rule add fwmark 3 from 192.168.1.3 table link1 prio 21
#ip rule add prio 30 table link1

ip route flush cache

echo "|:ATIVA O MASCARAMENTO DE SAÍDA:...................ok:|"
$IPTABLES -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo "|:ATIVAR O REDIRECIONAMENTO NO ARQUIVO IP_FORWARD:.ok:|"
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "|:REGRAS DE FORWARD:...............................ok:|"
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
echo "|:IPS COM PRIVILEGIOS ESPECIAIS:...................ok:|"
$IPTABLES -A FORWARD -s 10.10.2.4/32 -j ACCEPT
$IPTABLES -A FORWARD -s 10.10.2.5/32 -j ACCEPT
echo "|:Liberar portas de saída:.........................ok:|"
$IPTABLES -A FORWARD -p tcp --dport 21 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 21 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 22 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 22 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 25 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 25 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 53 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 53 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 5060 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 5060 --sport 1024:65535 -j ACCEPT
#$IPTABLES -A FORWARD -j LOG --log-prefix "FORWARD Barrado: "
#$IPTABLES -A FORWARD -j REJECT
$IPTABLES -P FORWARD ACCEPT
echo "|:REGRAS DE OUTPUT:................................ok:|"
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "|:..........************* QoS *************........ok:|"
$IPTABLES -t mangle -A OUTPUT -p udp --dport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 10000:20000 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 10000:20000 -j TOS --set-tos 16
$IPTABLES -P OUTPUT ACCEPT
;;
stop)
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X
$IPTABLES -F -t nat
$IPTABLES -X -t nat
$IPTABLES -F -t mangle
$IPTABLES -X -t mangle
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
;;
stats)
$IPTABLES -nL
;;
restart)
$0 stop
$0 start
;;
nat)
$IPTABLES -L -v -t nat -n
;;
mangle)
$IPTABLES -t mangle -L
;;
*)
echo "Usage: $0 [start|stop|stats|restart|nat|mangle]"
;;
esac

[17] Comentário enviado por suportlinux em 18/09/2009 - 18:57h

Oi

Tiago

Você pode me ....
ajudar........


[18] Comentário enviado por tiagonux em 18/09/2009 - 22:04h

E ai cara,

seguinte as suas regras ofuscaram minha visão rsrsrrss, brincadeira

veja se isso lhe ajuda http://tiagonux.blogspot.com/2008/12/iproute-avanado.html

como cada um tem suas próprias regras de firewall fica dificil te falar sem eu pode executar suas regras em um ambiente com 2 links.

Tente ver o link e de um retorno....

[19] Comentário enviado por suportlinux em 21/09/2009 - 10:35h

Bom
Dia

Tiago

Ainda estou com problemas.....

Sera que é pedir d+ um simples script....

só quero poder se conectar com o porta 80 e 22 em ambos os ips....

o meu E-mail esilva@soft.com.br, suportlinux@yahoo.com.br
Fone 21 3527-0293 21 8112-3463

[20] Comentário enviado por emelicio em 30/03/2010 - 19:04h

Boa Noite!!!

Problema Urgente com roteamento de Links.

Possuo na empresa, 3 Links,

Link 1 - 10.1.1.1
Link 2 - 10.1.1.2
Link 3 - 10.1.1.3

Ampos são ADSL empresarias, da OI, os modens estão em modo Router, os 3 modens estão conectados em um Switch de 8 portas 3com, e no servidor Linux Debian.

Informações do Servidor

eth0 - Links - 10.1.1.30
eth1 - Local - 192.168.1.1

Preciso que o link 10.1.1.1 seja usado normalmente para navegação, ja esta perfeito.


E tenho na rede um servidor 2003server com ip 192.168.1.253, que é utilizado para wts externo, gostaria de fazer com que este servidor usasse os links 2 e Link 3.

Eu iria distribuir para os usuários o IP válido do Link2 e Link3, os usuarios vão conectar em ambos os links, uma parte em um link e outra parte em outro link. Só que não sei como faço o redirecionamento no servidor, pois tenho uma placa de rede para os 3 links...

Alguem tem alguma solução? Sem que precise colocar mais 2 placas de rede?

Estou precisando disso urgente!

[21] Comentário enviado por danusio em 30/03/2010 - 21:01h

Amigo, tenho 3 links funcionando em meu servidor, uso o fedora core 7, e tenho apenas 2 placas de rede, segue meu script, talvez possa te ajudar, qualquer coisa posta aqui.

#!/bin/sh
## limpeza das regras iptables
iptables -F -t nat
iptables -Z -t nat
iptables -F -t mangle
iptables -Z -t mangle
iptables -X -t mangle
iptables -t mangle -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -X -t nat
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
## Configurado é uma unica placa de rede 3 ips diferentes ou seja 3 redes
## basta configurar nas maquinas dos usuarios os ips no qual queira que eles passe pelo link x
## link Default: 175.200.2.1
## link 2: 173.200.2.1
## link 3: 174.200.2.1

############# LINK2 ///// os ips abaixo do eth0 é o gateway do modem
ip route del default dev eth0 via 189.59.13.12 table link2
ip route add default dev eth0 via 189.59.13.12 table link2
#
iptables -t mangle -D PREROUTING -i eth1 -s 173.200.2.0/24 -p tcp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth1 -s 173.200.2.0/24 -p tcp -j MARK --set-mark 1
ip rule del from 173.200.2.0/24 lookup link2
ip rule add from 173.200.2.0/24 lookup link2

############# LINK3 ///// os ips abaixo do eth0 é o gateway do modem

ip route del default dev eth0 via 187.58.56.111 table link3
ip route add default dev eth0 via 187.58.56.111 table link3
#
iptables -t mangle -D PREROUTING -i eth1 -s 174.200.2.0/24 -p tcp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth1 -s 174.200.2.0/24 -p tcp -j MARK --set-mark 2
ip rule del from 174.200.2.0/24 lookup link3
ip rule add from 174.200.2.0/24 lookup link3

#
ip route flush cached



iptables -t nat -A POSTROUTING -s 175.200.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 173.200.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 174.200.2.0/24 -j MASQUERADE



iptables -t nat -A PREROUTING -s 175.200.2.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128




#deve adicionar na tabela do iproute as variaveis dos links
#uso o fedora 7 /etc/iproute2/rt_tables

#adicione as seguintes linhas vi /etc/iproute2/rt_tables


35 link2
36 link3



para testar vá em uma maquina do usuario, configure os ips em qual link que você queira que
ele pertença e vá o prompt de comando e digite tracert -d 8.8.8.8 e ele vai mostrar pelo qual link
sua navegação está saindo.

[22] Comentário enviado por mmoreira1979 em 03/10/2010 - 21:01h

Tiago,

Estou tentando adaptar seu script para minha necessidade e fiquei com duvida aqui nestas linhas:

# Falo quem é o gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK1_IP table link2

É assim mesmo ou deveria ser:

# Falo quem é o gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK2_IP table link2


Alterei o IP do link2: $LINK2_IP table link2

Grato pela atencao



[23] Comentário enviado por tiagonux em 04/10/2010 - 08:33h

Mmoreira

Está correta da sua forma,

ip route add default proto static via $LINK2_GW src $LINK2_IP table link2

Vlw

[24] Comentário enviado por mmoreira1979 em 24/06/2011 - 16:36h

tiago
Estou tentando usar seu script para fazer exatamente o que voce fez no exemplo, rotear algumas portas usando 2 links de internet. Fiz as devidas modificacoes no scritp mas nao esta funcionando. Um detalhe é que nao tenho nenhuma regra ainda de firewall definida, apenas o seu script esta sendo executado, formatei uma maquina, instalei o debian lenny e executo o script abaixo. repare que fiz poucas modificacoes, basicamente adicionei os meus enderecos ip e gateway:

#!/bin/bash

# Por tiagonux
# Script que faz um servidor GNU/Linux com mais de um link de internet
# rotear os pacotes destinados a sua DMZ. Sua DMZ ficaráespondendo
# a partir da internet pela quantidade de links que tiver.
# Envolve os softwares iproute e iptables
# O script nãcobre regras de mascaramento de pacotes e nem redirecionamento
# de portas.
# Esse script pode ser chamado pelo script de firewall atual do seu sistema, sendo
# que as regras da tabela mangle sãresetadas.


# Variáis
#
# Gateways de cada link
LINK1_GW="xxx.115.xxx.x1"
LINK2_GW="2xx.1x.xxx.x"
#
# Interface de rede ligada aos links e interface ligada a DMZ e rede interna
#
LINK_WAN1="eth1"
LINK_WAN2="eth2"
LINK_INT1="eth0"
#
# IPs de cada Link. Lembrando que se estiver usando apenas uma placa de rede conectada
# em um switch que tem os 2 links (ou mais) deve-se configurar os IPs vádos
# virtualmente na mesma placa de rede.
#
LINK1_IP="xx7.xxx.xx0.xx"
LINK2_IP="xx1.x7.xx0.x0"
#
IPTABLES=`which iptables`
#
# Vocêode chamar esse script de dentro do seu script de firewall atual, mas fazendo
# as devidas alteraçs de redirecionamento de portas.
# Regras de marcaç de pacotes com iptables e seu móo CONNMARK
#
# Reseto tudo da tabela Mangle
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -t mangle -Z
#
# Vocêeve ter um redirecionamento de portas para cada pacote entrando em cada link
# para seu servidor especíco.
# Aqui marco o pacote que entra pelo link1 com o mark 1 com destino ao IP do LINK1_IP
# e a porta 25 .
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 25 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 1 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 2 com destino ao IP do LINK2_IP
# e a porta 25
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -p tcp --dport 25 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 2 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 3 com destino ao IP do LINK1_IP
# e a porta 110 .
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 110 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 3 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 4 com destino ao IP do LINK2_IP
# e a porta 110
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 110 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 4 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 5 com destino ao IP do LINK1_IP
# e a porta 80
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 80 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 5 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 6 com destino ao IP do LINK2_IP
# e a porta 80
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -p tcp --dport 80 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 6 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 7 com destino ao IP do LINK1_IP
# e a porta 3389
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 3389 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 7 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 8 com destino ao IP do LINK2_IP
# e a porta 3389
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 3389 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 8 -m mark --mark 0
#

# Aqui énde acontece a máca. Quando simplesmente marcamos um pacote que entra
# por um link de internet ele perde sua marca quando passa pela tabela NAT. Ãnesse
# ponto que todo mundo fica perdido, pois em todos os fós que li a dú maior é# essa, o porque do pacote nãretorna pelo link que ele entrou se eu marquei ele na
# sua entrada.
#
# Acontece que ao passar de uma tabela (mangle) para outra (nat) ele perde a marca.
# Descobri isso lendo a documentaç do iptables e com ajuda do tcpdump concluísso.
# Mas sempre tem uma maneira de resolver esse problema.
# Simplesmente vamos dizer que queremos que seja lembrado a marca anterior do
# pacote.
# Como pode ser visto na regra abaixo, na chain PREROUTING da mangle salvo a marca
# do pacote jogando para o ALVO CONNMARK
#
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -j CONNMARK --save-mark
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -j CONNMARK --save-mark

#
# E quando o pacote retorna entrando pela interface interna éembrado sua marca
# anterior.
# Isso tudo ocorre pela --save-mark da regra anterior e --restore-mark da regra abaixo.
#
$IPTABLES -t mangle -A PREROUTING -i $LINK_INT1 -p tcp -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
#
# Regras de roteamento com iproute
#
# Deletando as regras atuais de roteamento
#
ip route del default
ip rule del prio 10 table main
ip rule del prio 19 fwmark 1 table link1
ip rule del prio 20 fwmark 2 table link2
ip rule del prio 21 fwmark 3 table link1
ip rule del prio 22 fwmark 4 table link2
ip rule del prio 23 fwmark 5 table link1
ip rule del prio 24 fwmark 6 table link2
ip rule del prio 25 fwmark 7 table link1
ip rule del prio 26 fwmark 8 table link2
ip rule add prio 30 table link1
#
# Configurando se necessáo o /etc/iproute2/rt_tables com as tabelas de cada link.
#
if ! cat /etc/iproute2/rt_tables | grep -q '^250'
then
echo "250 link1" >> /etc/iproute2/rt_tables
fi
#
if ! cat /etc/iproute2/rt_tables | grep -q '^251'
then
echo "251 link2" >> /etc/iproute2/rt_tables
fi
#
# Flush nas tabelas
ip route flush table link1
ip route flush table link2
#
# Falo que prioridade a tabela main tem.
ip rule add prio 10 table main
#
# Falo quem é gateway da tabela link1
ip route add default proto static via $LINK1_GW src $LINK1_IP table link1
#
# Falo quem é gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK2_IP table link2
#
# Crio a regra de roteamento para cada tabela de acordo com a marcaç do pacote
#
# pacotes smtp que entraram pela tabela link1
ip rule add fwmark 1 from 192.168.1.3 table link1 prio 19
#
# pacotes smtp que entraram pela tabela link2
ip rule add fwmark 2 from 192.168.1.3 table link2 prio 20
#
# pacotes pop3 que entraram pela tabela link1
ip rule add fwmark 3 from 192.168.1.3 table link1 prio 21
#
# pacotes pop3 que entraram pela tabela link2
ip rule add fwmark 4 from 192.168.1.3 table link2 prio 22
#
# pacotes web que entraram pela tabela link1
ip rule add fwmark 5 from 192.168.1.4 table link1 prio 23
#
# pacotes web que entraram pela tabela link2
ip rule add fwmark 6 from 192.168.1.4 table link2 prio 24
#
# pacotes rdp que entraram pela tabela link1
ip rule add fwmark 7 from 192.168.1.4 table link1 prio 25
#
# pacotes rdp que entraram pela tabela link2
ip rule add fwmark 8 from 192.168.1.4 table link2 prio 26
#
# Caso vocêueira que o resto da rede interna se comunique com a internet pela
# tabela link1
ip rule add prio 30 table link1
#
# Atualizando o cache de roteamento
ip route flush cache




voce pode me ajudar?

[25] Comentário enviado por stefaniobrunhara em 30/06/2017 - 08:59h

Muito bom o artigo, me ajudou na solução de ter um DVR atrás de dois links passando por um servidor Linux. Como sempre vemos os artigos sobre dois links pensamos que o processo só vale para saída, mas o conhecimento acima funciona bem também como entrada.


Contribuir com comentário