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.
Abaixo está o script que usa iptables e iproute, qualquer problema encontrado com ele por favor relatem para correção. Estou trabalhando em uma outra versão desse script para ficar transparente até a navegação da rede interna caso o link principal de comunicação dela com a internet sai do ar.
Nesse cenário tenho 3 servidores:
192.168.1.2 - servidor web - porta 80
192.168.1.3 - servidor de email - portas 25 e 110
192.168.1.4 - servidor de terminal service - porta 3389
#!/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á respondendo
# a partir da internet pela quantidade de links que tiver.
# Envolve os softwares iproute e iptables
# O script não 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ão resetadas.
# Variáveis
#
# Gateways de cada link
LINK1_GW="200.200.xx.1"
LINK2_GW="189.40.xx.1" #
# Interface de rede ligada aos links e interface ligada a DMZ e rede interna
#
LINK_WAN1="eth1"
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álidos
# virtualmente na mesma placa de rede.
#
LINK1_IP="200.200.xx.2"
LINK2_IP="189.40.xx.2" #
IPTABLES=`which iptables` #
# Você pode chamar esse script de dentro do seu script de firewall atual, mas fazendo
# as devidas alterações de redirecionamento de portas.
# Regras de marcação de pacotes com iptables e seu módulo CONNMARK
#
# Reseto tudo da tabela Mangle
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -t mangle -Z #
# Você deve ter um redirecionamento de portas para cada pacote entrando em cada link
# para seu servidor específico.
# 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 #
# 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_WAN1 -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 é onde acontece a mágica. 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óruns que li a dúvida maior é
# essa, o porque do pacote não 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ção do iptables e com ajuda do tcpdump concluí isso.
# 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 #
# E quando o pacote retorna entrando pela interface interna é lembrado 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 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 #
# Configurando se necessário 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 é o gateway da tabela link1
ip route add default proto static via $LINK1_GW src $LINK1_IP table link1 # # Falo quem é o gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK1_IP table link2 # # Crio a regra de roteamento para cada tabela de acordo com a marcação 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.2 table link1 prio 23 # # pacotes web que entraram pela tabela link2
ip rule add fwmark 6 from 192.168.1.2 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ê queira 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
[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.
[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...
[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
[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?
[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
#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.
[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
#
[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.