INTRODUÇÃO:
A porta 443 é normalmente liberada pelo firewall para repasse, pois caso contrário, os usuários não conseguiriam acessar sites com áreas seguras como um internet banking por exemplo. Assim o Ultrasurf se utiliza deste recurso essencial, estabelecendo várias conexões por esta porta, criando vários "tuneis" que saem da máquina do indivíduo até a máquina firewall (a qual mantém as regras de bloqueio). O firewall então achando que se trata de uma conexão https, permite o repasse do fluxo de dados. Dali pra frente a conexão sai para possíveis proxys anonimos espalhados na internet ou coisa do tipo, permitindo assim a conexão a qualquer endereço de destino, ou seja, o firewall não tem conhecimento real do que se passa naquele fluxo de dados. O retorno das informações ocorre da mesma forma: os pacotes de resposta chegam e entram pelos mesmos "tuneis" estabelecidos na porta 443 do firewall e chegam à máquina do usuário sem maiores complicações. Um fator interessante é que até a velocidade de conexão usando o ultrasurf é bem aceitável, tornando esta ferramenta muito popular entre universitários e usuários de redes com muitos bloqueios.
COMO BLOQUEAR O ULTRASURF:
A única forma de bloquear o ultrasurf é tratando diretamente a porta 443 do firewall da rede. Assim, apresento duas formas de fazer o bloqueio:
a) bloquear totalmente as conexões pela porta 443, porém esta forma bloqueará também o acesso a qualquer site https.
REDE="192.168.100.0/24" #informe a rede interna
iptables -I FORWARD -s $REDE -p tcp --dport 443 -j DROP
b) Com o auxilio do cron, fazer um monitoramento constante do nível de uso da porta 443, analisando quantas conexões cada máquina da rede utiliza pela porta 443. Mediante esta análise, executar o bloqueio apenas para o IP da rede interna que está solicitando muitas conexões pela porta 443, o que é um fator relevante de uso suspeito do ultrasurf, afinal ninguém acessa 5 ou mais bancos simultaneamente ou coisa do tipo! Inicialmente, um total de 8 conexoes https seriam aceitáveis, basta agora adequar esse número à realidade da sua rede, definindo qual o máximo de conexões https que cada maquina pode fazer simultaneamente.
DESCRICAO E UTILIZAÇÃO DO SCRIPT.
Apresentação do script:
Através do parâmetro "verifica", o script faz a verificação IP por IP, analisando quantas conexões pela por 443 cada um possui. Caso esteja acima do limite permitido, uma regra é aplicada especialmente para aquele IP e a porta 443. O desbloqueio é feito através do parámetro "libera" do sccript.
------inicio---------------------------
#!/bin/bash
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
# arquivo : 443-control.sh
# objetivo: tratar o uso suspeito do ultrasurf na porta 443
# autor : Dorival M Machado Junior ( dorivaljunior at gmail.com )
# versao : 2.0
# data : 07-mai-2010
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
I="1" # contador para o while
MAX="8" # maximo de coneccoes permitidas com a porta 443
DATA=$(/bin/date) # pega a data do sistema
IPTABLES="/usr/local/sbin/iptables"
LOG_ULTRASURF="/var/log/log.ultrasurf"
GREP="/bin/grep"
ECHO="/bin/echo"
IPTSTATE="/usr/sbin/iptstate"
TAIL="/usr/bin/tail"
AWK="/usr/bin/awk"
SORT="/usr/bin/sort"
UNIQ="/usr/bin/uniq"
WC="/usr/bin/wc"
LIBERA_443() # libera possiveis bloqueios de repasse a porta 443
{
while [ $I -lt "255" ]; do # enquanto i for menor que 255 faca
IP=$( $ECHO "192.168.100.$I@" ) # ip da maquina atual (o @ evita insercao de outros IPs erroneamente)
RESULTADO_BLOQUEIO=$( $IPTABLES -n -L FORWARD | tr -s [:blank:] @ | $GREP $IP | $GREP 443 )
if [ ! -z "$RESULTADO_BLOQUEIO" ] # se nao estiver vazio a variavel de resultado de bloqueio
then
$IPTABLES -D FORWARD -s $IP -p tcp --dport 443 -j DROP
$ECHO "$DATA: IP $IP liberado para fazer conexoes 443 novamente." >> $LOG_ULTRASURF
fi
let I++ # incrementa contador
done
echo "$DATA: Verificacao de necessidade de liberacao de IPs internos bloqueados para porta 443 realizada." >>
$LOG_ULTRASURF
}
VERIFICA_443() # verifica uso abusivo da porta 443
{
while [ $I -lt "255" ]; do # enquanto i for menor que 255 faca
IP=$( $ECHO "192.168.100.$I" ) # ip da maquina atual
# vendo quantas conexoes com destino a porta 443 foram estabelecidas para o IP
RESULTADO_IP=$( $IPTSTATE -s 192.168.100.$I -D 443 -1 | $TAIL -n +4 | $AWK '{print $2}' | $SORT | $UNIQ | $WC
-l )
if [ $RESULTADO_IP -gt $MAX ] # se o resultado eh maior que MAX, entao
then
$IPTABLES -I FORWARD -s $IP -p tcp --dport 443 -j DROP # bloqueia repasse do IP para a porta 443
$ECHO "$DATA: IP $IP utilizando $RESULTADO_IP conexoes pela porta 443; bloqueando acesso a esta
porta." >> $LOG_ULTRASURF # gerando resultado no arquivo de log
fi
let I++ # incrementa contador
done
echo "$DATA: Verificacao de uso suspeito do ultrasurf realizada." >> $LOG_ULTRASURF
}
AJUDA()
{
echo "$0 - Tratamento de uso suspeito do ultrasurf"
echo ""
echo "Opcoes:"
echo " verifica - verifica o uso abusivo de forward para a porta 443"
echo " libera - libera possiveis bloqueios de forward para a porta 443"
echo " help - ajuda"
echo ""
}
case "$1" in
verifica)
VERIFICA_443
;;
libera)
LIBERA_443
;;
help)
AJUDA
;;
*)
echo "Uso: $0 {verifica|libera|help}"
;;
esac
------fim---------------------------
1. Primeiramente preencha-o adquando à sua realidade.
2. Crie as seguintes regras no cron:
# crontab -e
*/10 * * * * /root/443-control.sh verifica
35 11 * * * /root/443-control.sh libera
A primeira regra faz a verificação a cada 10 minutos.
A segunda regra, faz a liberacao dos bloqueios realizados. Assim, defina um horário diário em que as regras de bloqueio serão limpas.
Até a próxima
Dorival M Machado Junior
São Sebastião do Paraíso-MG