UltraSurf – Bloqueio definitivo

 Clusterweb, Firewall, Leitura Recomendada, Linux, Redes  Comentários desativados em UltraSurf – Bloqueio definitivo
fev 252013
 
Introdução

Que tal passar horas planejando e configurando o controle de acesso a conteúdo de uma rede, ir dormir feliz da vida com o gostinho do dever cumprido e acordar no dia seguinte, com o pesadelo de saber que foi tudo em vão, pois os usuários estão acessando o conteúdo bloqueado normalmente?

O objetivo aqui não é entrar na discussão se o controle de acesso a conteúdo deve ou não ser realizado na navegação WEB de uma empresa, instituições de ensino, residências ou onde quer se seja.

O fato é que, se por algum motivo, determinado conteúdo teve que ser bloqueado ou monitorado, este deve ser bloqueado, ou monitorado, de forma que os usuários da rede não consigam burlar tais controles. Sendo necessário assim, prever e tratar todos os possíveis desvios que, eventualmente, os usuários tentem utilizar para burlar os controles estipulados.

Muitas são as técnicas que os usuários de uma rede de computadores acabam recorrendo na tentativa, em geral com sucesso, de burlar os controles impostos. Entre essas técnicas, podemos citar como exemplo:

  • https;
  • tunneling;
  • socks;
  • proxy anônimo;
  • webproxy;
  • ferramentas como HotSpot Shield, HideIpPlatinum, JAP ou o implacável UltraSurf.

Sendo o UltraSurf, atualmente, a grande dor de cabeça de muitos administradores de redes, e o grande motivador deste trabalho.

O foco aqui não é detalhar o comportamento ou uso de todas as técnicas ou ferramentas acima citadas, afinal, facilmente você encontra este conteúdo na Internet.

Aqui vamos bater de frente com o grande vilão da vez, o UltraSurf, indo na sequência vendo os meios utilizados, já com sucesso, para banir em definitivo, esta e todas as técnicas e ferramentas citadas da rede.

UltraSurf – Problemas comuns

Pense, se existisse um aplicativo executável, não instalável, com menos de 1.4 MB, que ao ser executado, por exemplo de um pendrive, passasse dando ‘risada’ pelos bloqueios de conteúdo configurados em sua rede, sem sequer deixar rastros, ou então te dar tchau!

Pois é, esse aplicativo já existe, e se chama UltraSurf!

O UltraSurf, desenvolvido pela empresa UltraReach, foi desenvolvido para burlar qualquer bloqueio de conteúdo configurado na rede.

Ao ser executado, conecta-se com seus servidores e cria uma espécie de proxy local na máquina do usuário, saindo toda a navegação realizada pelo usuário por esse proxy local, passando assim, por cima de qualquer controle de conteúdo imposto.

Ao rodar o UltraSurf, ele inicia sua busca incansável por uma brecha no firewall, por onde possa passar e estabelecer a conexão com seus servidores externos. Inicialmente, tenta estabelecer a conexão via porta 443 em um dos endereços IP de seus infinitos servidores, não conseguindo via porta 443, passa a tentar a conexão em uma série de outras portas, e incansavelmente, segue esta rotina de ir trocando porta e IP, até conseguir estabelecer a conexão.

Confesso aqui, que chega a ser divertido ficar monitorando todo esse processo via tcpdump.

Caso não tenha êxito na conexão padrão, vamos imaginar que você já tenha realizado bloqueios que o impediram de conectar, o usuário vai ao UltraSurf e facilmente configura o IP e porta de um servidor proxy, que pode ser o próprio proxy da sua rede, ou então um externo, conseguindo dessa forma, fazer a conexão com um de seus servidores por dentro do proxy informado.

Aproveito, e deixo aqui meus parabéns à equipe por trás desta respeitável ferramenta!

Problemas comuns na tentativa do bloqueio

Na busca por meios de bloqueio do UltraSurf na Internet, é comum cair em alternativas que sugerem bloquear uma relação interminável de endereços IP, tidos como sendo os servidores utilizados para conexão, bloquear a porta 443, liberando esta somente para os IPs necessários para uso na rede, utilizar o Snort etc…

Sendo comum ver nos comentários dos posts, coisas do tipo: “comigo funcionou perfeitamente!”, “testando com a versão X funciona, mas com a Y não”, “comigo continua acessando normalmente”, “rodo o UltraSurf e o Snort não detecta que ele está rodando”.

Isto se deve ao fato de que a cada nova versão lançada do UltraSurf, novas faixas de IP e portas são utilizadas, o padrão de conexão é redefinido, anulando assim, todos os bloqueios antes configurados, tornando a tentativa de bloqueio do UltraSurf, por este paradigma, totalmente impraticável, trabalhosa e ineficaz.

Como podemos observar na descrição do comportamento do UltraSurf, é comum que técnicas e ferramentas utilizadas para burlar os controles de uma rede façam uso de comportamentos e portas de uso padrão e necessário em uma rede, conseguindo com isso, dificultar bastante as tentativas de bloqueio.

A solução

A solução aqui demostrada foi estudada, configurada, colocada em produção e amplamente testada na rede acadêmica do Senac Lages/SC, onde o objetivo principal foi possibilitar aos alunos do Curso Técnico em Redes de Computadores, turma que se forma no final do primeiro semestre de 2012, a possibilidade de vivenciar problemas reais de campo, possibilitando desta forma, uma construção significativa do conhecimento, e deixando-os preparados para a cruel realidade do mundo do trabalho.

Para resolver o problema, entrou na ‘jogada’ o Mutley, servidor rodando FreeBSD que fornece com exclusividade para toda a rede acadêmica, os serviços: DHCP, DNS, Gateway e Proxy.

O bloqueio do UltraSurf e das outras técnicas relacionadas é relativamente simples, bastando ter as portas corretas fechadas no firewall e o uso de um proxy não transparente.

Na sequência, veremos a estrutura/características do servidor Mutley, as regras aplicadas e as implicações que cada ação reflete.

Estrutura/Características do servidor Mutley

FreeBSD 9 configurado como gateway da rede disponibilizando os seguintes serviços:

  • DHCP
  • DNS
  • PROXY
  • FIREWALL

PF utilizado como firewall, configurado dentro do conceito de politicas Default Deny, onde somente são abertas as portas que realmente são utilizadas na rede.

Portas SSH, 80, 53 e 3128 abertas somente para acesso ao próprio servidor, porta 443 fechada para qualquer uso.

Com isso, já evitamos que seja possível utilizar técnicas de tunneling, socks, proxy anônimo, além de já impedir que o UltraSurf e similares consigam conectar.

Exemplo da regra no PF

# permite às máquinas da redeLan, acessar as portas listadas somente via ipLan
pass in quick on $intLan proto { tcp, udp } from $redeLan to $ipLan port { 53, 80, 3128, 22 } keep state

Squid configurado como proxy NÃO transparente, onde toda navegação, sem exceção, de http, https e ftp, somente será permitida via proxy, estando as respectivas portas devidamente fechadas no firewall.

O Dquid tem sua configuração padrão e dentro da sua necessidade, a única coisa adicionada se deu ao fato de que ferramentas como UltraSurf permitem que seja configurado o endereço de proxy da rede, conseguindo desta forma, funcionar por dentro do proxy mesmo.

Para impedir que isso aconteça, foi criada uma ACL para não permitir a navegação direta por IP.

Exemplo da ACL

# acl para não permitir nagevacao por IP
acl naoIP dstdom_regex -i ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}($|:.+|/))
http_access deny CONNECT naoIP

Revisando a solução

  • Firewall configurado dentro dos padrões de Default Deny;
  • Liberar somente as portas necessárias para funcionamento da rede;
  • Portas SSH, 80, 53 e 3128 liberadas exclusivamente para acesso ao IP da LAN do servidor;
  • Proxy não transparente, atuando como saída exclusiva de HTTP, HTTPS e FTP;
  • Bloqueio no proxy de navegação por IP.

Com estes passos simples, conseguimos com mínimo esforço, eliminar por completo o uso do UltraSurf e das ferramentas, ou técnicas, mencionadas para burlar os controles de conteúdo da rede.

Toda ação, gera uma reação

Claro que toda ação gera um reação, e com o Mutley rodando a todo vapor e os bloqueios funcionando perfeitamente, acabaram surgindo alguns pontos, já devidamente resolvidos, que mereceram um pouco mais de estudo.

Seguem abaixo os problemas detectados e as soluções já implementadas para resolvê-los.

Problemas detectados com a aplicação do Mutley na rede:

Como está sendo utilizado proxy NÃO transparente, há a necessidade de configurar o endereço do proxy nos navegadores para poder navegar, o que pode ser considerado um problema para alguns usuários.

Solução: Para resolver isso, foi implementado no Mutley, a solução de configuração automática de proxy, WPAD.

O WPAD permite que os navegadores, rodando em máquinas Windows, consigam obter, de forma 100% automática, a configuração de proxy da rede via DHCP ou DNS.

Como a base de funcionamento da nossa rede é Windows, com a implantação do WPAD, já ficou resolvido o problema da configuração de proxy nos navegadores.

Nos clientes não-Windows, como por exemplo GNU/Linux, se faz necessária a configuração manual do proxy no navegador.

* A configuração de proxy foi automatizada via WPAD para os navegadores, mas temos uma serie de aplicações que usam as portas 80, HTTPS ou FTP, e que não permitem configuração de proxy automática ou manual em suas interfaces. O Windows Update é um desses casos.

Solução: Para resolver este problema, foram utilizados aplicativos do próprio Windows (proxycfg, netsh winhttp set proxy) para realizar a configuração do proxy a nível de sistema operacional.

Criada uma ACL para liberar a navegação por IP para casos específicos, por exemplo, a realização de FTP.

Exemplo:

# acl para permitir navegacao por ip para ftp
acl ftpporip url_regex ftp://[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*
http_access allow ftpporip

Considerações finais

É isso pessoal, espero que as dicas aqui passadas possam ser úteis.

Reforço que a solução aqui proposta já se encontra em uso a mais de um ano!

Balanceamento de 3 links com redundância no Linux

 Firewall, Linux  Comentários desativados em Balanceamento de 3 links com redundância no Linux
jan 122012
 
Introdução

Seguindo a sequência dos artigos sobre balanceamento e redundância, segue o script atualizado e modificado para uso de três links de internet.

Referência:

Últimas modificações:

  1. Balanceamento de 3 links + Redundância para os 3 links;
  2. Data e Hora dos eventos;
  3. Modificação nas regras para marcar e desmarcar rotas.

Funcionamento:

1. Se cair um link, ele continua fazendo o balanceamento entre 2 links.

2. Caso caiam 2 links, a rede continua funcionando em 1 link.

3. *Soma dos links, é feita da seguinte maneira: 1ª conexão estabilizada pelo link 1, 2ª conexão estabilizada pelo link 2, 3ª conexão estabilizada pelo link 3; estamos usando peso 1:1:1.

4. Os serviços podem ser divididos e remanejados para determinados links usando regras de marcação.

5. Este método de balanceamento e redundância só serve como saída para a Internet.

* Use um programa do tipo download manager que possa dividir o arquivo em partes para testar.

Modificando as tabelas e rotas

Modificando as tabelas e rotas, mudanças em negrito.

1. Acrescente no arquivo rt_tables:

1 gvt
2 brt
3 net

2. Acrescente a nova rota para os três links, abaixo incluo a regra no arquivo rc.local:

ip route flush table gvt #Limpa as rotas no cache da tabela gvt

ip route flush table brt #Limpa as rotas no cache da tabela brt

ip route flush table net #Limpa as rotas no cache da tabela net

ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table gvt
ip route add default via 192.168.1.1 table gvt

ip route add 192.168.2.0/24 dev eth2 src 192.168.2.10 table brt
ip route add default via 192.168.2.1 table brt

ip route add 192.168.3.0/24 dev eth3 src 192.168.3.10 table net
ip route add default via 192.168.3.1 table net

ip rule add from 192.168.1.10 table gvt
ip rule add from 192.168.2.10 table brt
ip rule add from 192.168.3.10 table net

#Esta regra abaixo é responsável pelo balanceamento, vamos dividir a saída com peso 2:1:1, vamos supor que a gvt é 2x
mais rápida com link de 3 mega, link da brt com 1 mega, e link da net com 1 mega.

ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 2 nexthop via 192.168.2.1 dev eth2 weight 1
nexthop via 192.168.3.1 dev eth3 weight 1

ip route flush cache #Limpa as rotas no cache

Dicas

1. Caso queira trabalhar somente com dois links balanceados e três links redundantes, é necessário remover a regra de balanceamento “nexthop via 192.168.3.1 dev eth3 weight 1” dos arquivos “rc.local” e “gwping.sh”, nesse caso os três links ficarão fora do balanceamento.

2. Posso utilizar os três links que ficaram de fora do balanceamento usando a marcação de pacotes, neste caso os três links trabalharão especificamente para um serviço ou um destino, veja exemplo:

#A regra abaixo determina que toda rede interna balanceada irá acessar o Bradesco pelo 3 link:
iptables -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d bradesco.com.br -j MARK –set-mark 0x30

#A regra abaixo determina que toda rede interna balanceada irá acessar as portas 110(pop) e 25(smtp) pelo 3 link:
iptables -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp -m multiport –dports 110,25 -j MARK –set-mark 0x30

3. Cuidado ao trabalhar com regras de marcação, como trabalhamos com redundância se algum link cair e não deletar a marcação feita para ele, o serviço ficará indisponível até o link voltar… para corrigir esse problema adicionei ao arquivo “gwping.sh” a regra para deletar a marcação do link que caiu… é necessário limpar a tabela mangle e adicionar as novas regras de marcação para quando o link voltar.

#Deleta marcação da tabela de roteamento:
ip rule del fwmark 0x30 lookup net prio 3

#Deleta as regras da tabela mangle:
iptables -F -t mangle
iptables -X -t mangle

Obs.: Não esqueça de desativar o balanceamento dos três links se for utilizá-los com marcação de pacotes, caso contrário não funcionará.

4. Na explicação anterior, para a chamada do script no arquivo rc.local, o comando nohup cria um arquivo “nohup.out” e isso gera um grande acúmulo de dados ocupando espaço desnecessário no HD, se esse log não for necessário para você, é possível desativá-lo acrescentando a opção > /dev/null o que jogará todo esse lixo para o buraco negro. Veja como ficaria a linha de comando:

# nohup > /dev/null /etc/link/gwping &

Script gwping.sh

#!/bin/bash -x

IPTABLES=/sbin/iptables

# Convencionalmente ” 0 ” indica sucesso neste script.

# Tempo entre verificações em segundos
SLEEPTIME=5

# Endereço IP ou nome de domínio para o ping. O roteiro baseia-se no domínio a ser pingável e sempre disponível.
TESTIP=200.98.249.120

# Ping Timeout em segundos.
TIMEOUT=3

# Interfaces externas.
EXTIF1=eth1
EXTIF2=eth2
EXTIF3=eth3

# Endereço IP de interfaces externas. Este não é o endereço do gateway.
IP1=192.168.1.10
IP2=192.168.2.10
IP3=192.168.3.10

# Gateway endereços IP. Este é o primeiro (hop) gateway, poderia ser o seu router IP endereço, se tiver sido configurado como o gateway.
GW1=192.168.1.1
GW2=192.168.2.1
GW3=192.168.3.1

# Pesos relativos de rotas. Guarde este para um baixo valor inteiro. Estou usando 1 para GVT porque é 3 vezes mais rápida.
W1=1
W2=1
W3=1

# Nome dos Provedores; utilizar os seus próprios nomes aqui.
NAME1=gvt
NAME2=brt
NAME3=net

# N º de repetições de sucesso ou fracasso antes de mudar status de conexão.
SUCCESSREPEATCOUNT=1
FAILUREREPEATCOUNT=4

## Não mudar nada abaixo desta linha.

# Última link status indica que a macro estado da ligação é determinada.
#Trata-se inicialmente em vigor estabelece encaminhamento mudança adiantado. Não alterar estes valores.
LLS1=1
LLS2=1
LLS3=1

# Última ping estado. Não alterar estes valores.
LPS1=1
LPS2=1
LPS3=1

# Ping atual estatuto. Não alterar estes valores.
CPS1=1
CPS2=1
CPS3=1

# Mudança link status indica que a ligação tem de ser mudado. Não alterar estes valores.
CLS1=1
CLS2=1
CLS3=1

# Conde de repetidos até estatuto ou para baixo estatuto. Não alterar estes valores.
COUNT1=0
COUNT2=0
COUNT3=0

while : ; do
ping -W $TIMEOUT -I $IP1 -c 1 $TESTIP > /dev/null  2>&1
RETVAL=$?

if [ $RETVAL -ne 0 ]; then
echo $NAME1 Down
CPS1=1
else
CPS1=0
fi

if [ $LPS1 -ne $CPS1 ]; then
echo `date +%x” “%X` Ping status changed for $NAME1 from $LPS1 to $CPS1
COUNT1=1
else
if [ $LPS1 -ne $LLS1 ]; then
COUNT1=`expr $COUNT1 + 1`
fi
fi

if [[ $COUNT1 -ge $SUCCESSREPEATCOUNT || ($LLS1 -eq 0 && $COUNT1 -ge $FAILUREREPEATCOUNT) ]]; then
echo `date +%x” “%X` Uptime status will be changed for $NAME1 from $LLS1
CLS1=0
COUNT1=0
if [ $LLS1 -eq 1 ]; then
LLS1=0
else
LLS1=1
fi
else
CLS1=1
fi

LPS1=$CPS1

ping -W $TIMEOUT -I $IP2 -c 1 $TESTIP > /dev/null  2>&1
RETVAL=$?

if [ $RETVAL -ne 0 ]; then
echo `date +%x” “%X` $NAME2 Down
CPS2=1
else
CPS2=0
fi

if [ $LPS2 -ne $CPS2 ]; then
echo `date +%x” “%X` Ping status changed for $NAME2 from $LPS2 to $CPS2
COUNT2=1
else
if [ $LPS2 -ne $LLS2 ]; then
COUNT2=`expr $COUNT2 + 1`
fi
fi

if [[ $COUNT2 -ge $SUCCESSREPEATCOUNT || ($LLS2 -eq 0 && $COUNT2 -ge $FAILUREREPEATCOUNT) ]]; then
echo `date +%x” “%X` Uptime status will be changed for $NAME2 from $LLS2
CLS2=0
COUNT2=0
if [ $LLS2 -eq 1 ]; then
LLS2=0
else
LLS2=1
fi
else
CLS2=1
fi

LPS2=$CPS2

ping -W $TIMEOUT -I $IP3 -c 1 $TESTIP > /dev/null  2>&1
RETVAL=$?

if [ $RETVAL -ne 0 ]; then
echo `date +%x” “%X` $NAME3 Down
CPS3=1
else
CPS3=0
fi

if [ $LPS3 -ne $CPS3 ]; then
echo `date +%x” “%X` Ping status changed for $NAME3 from $LPS3 to $CPS3
COUNT3=1
else
if [ $LPS3 -ne $LLS3 ]; then
COUNT3=`expr $COUNT3 + 1`
fi
fi

if [[ $COUNT3 -ge $SUCCESSREPEATCOUNT || ($LLS3 -eq 0 && $COUNT3 -ge $FAILUREREPEATCOUNT) ]]; then
echo `date +%x” “%X` Uptime status will be changed for $NAME3 from $LLS3
CLS3=0
COUNT3=0
if [ $LLS3 -eq 1 ]; then
LLS3=0
else
LLS3=1
fi
else
CLS3=1
fi

LPS3=$CPS3

if [[ $CLS1 -eq 0 || $CLS2 -eq 0 || $CLS3 -eq 0 ]]; then

if [[ $LLS1 -eq 1 && $LLS2 -eq 0 && $LLS3 -eq 0 ]]; then
echo `date +%x” “%X` Switching to $NAME2 #Se o link 1 cair
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip rule del fwmark 0x10 lookup gvt prio 3
ip rule add from 192.168.3.10 table net
ip rule add from 192.168.2.10 table brt
ip rule add fwmark 0x30 lookup net prio 3
ip rule add fwmark 0x20 lookup brt prio 3
ip route replace default scope global nexthop via $GW2 dev $EXTIF2 weight $W2 nexthop via $GW3 dev $EXTIF3 weight $W3
ip route flush cache
#Para usar a marcação de pacotes descomente as linhas abaixo, e comente a linha acima logo após o
#último comando nexthop para desativar o balanceamento do 3 link ex.: #nexthop via $GW3 dev $EXTIF3 weight $W3
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.6 -j MARK –set-mark 0x30
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp -m multiport –dports 110,25 -j MARK –set-mark 0x20
cat /etc/link/resolv.conf > /etc/resolv.conf

elif [[ $LLS2 -eq 1 && $LLS1 -eq 0 && $LLS3 -eq 0 ]]; then
echo `date +%x” “%X` Switching to $NAME1 #Se o link 2 cair
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip rule del fwmark 0x20 lookup brt prio 3
ip rule add from 192.168.1.10 table gvt
ip rule add from 192.168.3.10 table net
ip rule add fwmark 0x10 lookup gvt prio 3
ip rule add fwmark 0x30 lookup net prio 3
ip route replace default scope global nexthop via $GW1 dev $EXTIF1 weight $W1 nexthop via $GW3 dev $EXTIF3 weight $W3
ip route flush cache
#Para usar a marcação de pacotes descomente as linhas abaixo, comente a linha acima logo após o
#último comando nexthop para desativar o balanceamento do 3 link ex.: #nexthop via $GW3 dev $EXTIF3 weight $W3
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.6 -j MARK –set-mark 0x30
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp –dport 443 -j MARK –set-mark 0x10
cat /etc/link/resolv.conf > /etc/resolv.conf

elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 && $LLS3 -eq 1 ]]; then
echo `date +%x” “%X` Switching to $NAME1 #Se o link 3 cair
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip rule del fwmark 0x30 lookup net prio 3
ip rule add from 192.168.1.10 table gvt
ip rule add from 192.168.2.10 table brt
ip rule add fwmark 0x10 lookup gvt prio 3
ip rule add fwmark 0x20 lookup brt prio 3
ip route replace default scope global nexthop via $GW1 dev $EXTIF1 weight $W1 nexthop via $GW2 dev $EXTIF2 weight $W2
ip route flush cache
#Para usar a marcação de pacotes descomente as linhas abaixo.
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp -m multiport –dports 110,25 -j MARK –set-mark 0x20
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp –dport 443 -j MARK –set-mark 0x10
cat /etc/link/resolv.conf > /etc/resolv.conf

elif [[ $LLS2 -eq 0 && $LLS3 -eq 1 && $LLS1 -eq 1 ]]; then
echo `date +%x” “%X` Switching to $NAME2#Se o link 1 e 3 cair
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip route replace default scope global via $GW2 dev $EXTIF2
ip rule del fwmark 0x10 lookup gvt prio 3
ip rule del fwmark 0x30 lookup net prio 3
ip route flush cache
cat /etc/link/resolv.conf > /etc/resolv.conf

elif [[ $LLS3 -eq 0 && $LLS2 -eq 1 && $LLS1 -eq 1 ]]; then
echo `date +%x” “%X` Switching to $NAME3#Se o link 1 e 2 cair
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip route replace default scope global via $GW3 dev $EXTIF3
ip rule del fwmark 0x20 lookup brt prio 3
ip rule del fwmark 0x10 lookup gvt prio 3
ip route flush cache
cat /etc/link/resolv.conf > /etc/resolv.conf

elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 && $LLS3 -eq 1 ]]; then
echo `date +%x” “%X` Switching to $NAME1#Se o link 2 e 3 cair
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip route replace default scope global via $GW1 dev $EXTIF1
ip rule del fwmark 0x20 lookup brt prio 3
ip rule del fwmark 0x30 lookup net prio 3
ip route flush cache
cat /etc/link/resolv.conf > /etc/resolv.conf

elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 && $LLS3 -eq 0 ]]; then
echo `date +%x” “%X` Restoring default load balancing
echo “Limpando todas as regras da tabela mangle …..”
iptables -F -t mangle
iptables -X -t mangle
echo “Regras limpas …..”
ip route replace default scope global nexthop via $GW1 dev $EXTIF1 weight $W1 nexthop via $GW2 dev $EXTIF2 weight $W2 nexthop via $GW3 dev $EXTIF3 weight $W3
ip rule add from 192.168.1.10 table gvt
ip rule add from 192.168.2.10 table brt
ip rule add from 192.168.3.10 table net
ip rule add fwmark 0x10 lookup gvt prio 3
ip rule add fwmark 0x20 lookup brt prio 3
ip rule add fwmark 0x30 lookup net prio 3
ip route flush cache
#Para usar a marcação de pacotes descomente as linhas abaixo, comente a linha acima logo após o último comando nexthop
#para desativar o balanceamento do 3 link ex.: #nexthop via $GW3 dev $EXTIF3 weight $W3
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.6 -j MARK –set-mark 0x30
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp -m multiport –dports 110,25 -j MARK –set-mark 0x20
#$IPTABLES -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp –dport 443 -j MARK –set-mark 0x10
cat /etc/link/resolv.conf > /etc/resolv.conf
fi
fi
sleep $SLEEPTIME
done