Bloqueio de Ultrasurf usando apenas Iptables

Publicado por Dorival Junior em 13/08/2010

[ Hits: 13.428 ]

 


Bloqueio de Ultrasurf usando apenas Iptables



Descrevo uma forma de bloquear o Ultrasurf utilizando apenas o iptables com auxílio de cron para monitoramento.

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 proxies anônimos 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 "túneis" 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 conexões 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 máquina pode fazer simultaneamente.

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 script.

#!/bin/bash
#
# arquivo : 443-control.sh
# objetivo: tratar o uso suspeito do ultrasurf na porta 443
# autor : Dorival M Machado Junior ( dorivaljunior at gmail dot com )
# versao : 2.0
# data : 07-mai-2010
#


I="1" # contador para o while
MAX="8" # maximo de conexoes 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

1. Primeiramente preencha-o adequando à 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 liberação dos bloqueios realizados. Assim, defina um horário diário em que as regras de bloqueio serão limpas.

Outras dicas deste autor

Solução para alteração de senha pelo próprio usuário no Samba

Utilização de SSH com par de chaves criptográficas

IPtables - Bloqueando o MSN

Copiar HD via rede usando dd e nc

Instalação do Hamachi no Linux em 3 passos

Leitura recomendada

Woody, Sarge e Sid - um breve introdução às versões do Debian

Instalando o AMSN 0.95 no Linux - Fácil e rápido

Blog dedicado aos estudos LPI nível 1

Backup do histórico de mensagens do Pidgin 2.6.2 no Ubuntu 9.10

Criptografando Shell Script

  

Comentários
[1] Comentário enviado por sebuba em 13/08/2010 - 09:38h

Olá.
E no caso do gmail? Pois agora, ele é https, será que essa técnica não iria atrapalhar?

[]'s

[2] Comentário enviado por dorivaljunior em 13/08/2010 - 10:23h

Olá, o gmail é o mesmo caso dos sites de bancos conforme eu citei. Se você bloquear a 443 totalmente, NENHUM site que trabalhe https vai funcionar, inclusive o gmail.

Ao usar o script que proponho, você define um número X de conexões na porta 443. Pelo que eu conheço, gmail, bancos entre outros, não vão utilizar por exemplo 8 conexões https simultaneamente. Assim, o bloqueio ocorre SOMENTE se a máquina suspeita estiver com mais conexões pela porta https do que o estabelecido no script. Tenho ele rodando aqui e em uma instituição de ensino. Em ambos o gmail não foi prejudicado.

até mais ver, obrigado pela pergunta.

att.,

[3] Comentário enviado por felipeassuncaoj em 13/06/2011 - 15:09h

Olá,

Obrigado pela colaboração Dorival.

Qual precedimento, se fosse pra verificar 3 redes: 192.168.0.0, 192.168.1.0 e 192.168.2.0.

Obrigado;



[4] Comentário enviado por tenentblueberry em 14/07/2011 - 16:36h

felipeassuncaoj, eu tenho vários segmentos na minha rede, separados pelo 3o octeto. Eu fiz algumas modificações para filtrar toda a minha rede. Abaixo vão alguns trechos q eu mexi:

----8<-----
IPTABLES=$(which iptables)
REDE_INTERNA="10.0"
OCTETO3_MINIMO="0"
OCTETO3_MAXIMO="43"
LOG_ULTRASURF="/var/log/monitoramento.ultrasurf.log"
----->8----

Note q eu passei os programas agora p/ variáveis (como o dorivaljunior fez), c/ a diferença de deixar p/ o which dar o caminho exato. Fiz isso no script todo, e criei 3 variáveis novas: REDE_INTERNA (q marca qual é o meu endereço de rede), OCTETO3_MINIMO e OCTETO3_MAXIMO, q são o 1o e o último valores q encontraremos no 3o octeto do endereço de rede.

------8<------
while [ $I -lt "255" ]
do # enquanto i for menor que 255 faca
for ((J=$OCTETO3_MINIMO;J<=$OCTETO3_MAXIMO;J++))
do
IP=$( $ECHO "$REDE_INTERNA.$J.$I@" ) # ip da maquina atual (o @ evita insercao de outros IPs erroneamente)
----->8-------

Basicamente acrescentei um for q varia entre os limites estabelecidos pelas variáveis OCTETO3_MINIMO e OCTETO3_MAXIMO, e tasquei um done a + lá no final, antes do let I++. Na variável IP, eu modifiquei p/ poder usar as 3 variáveis, a REDE_INTERNA, e os valores q mudam, I e J. Dessa forma, eu varro toda a rede, q é dividida em vários segmentos. A modificação q eu fiz acima vale p/ os 2 procedimentos, LIBERA_443 e VERIFICA_443.

Ainda n testei o script c/ minhas modificações, e como estou de férias, só quando voltar farei o teste. Até lá, é torcer p/ funcionar (n se mexe em firewall operando tudo via ssh).

[]s, Ricardo.

[5] Comentário enviado por etecfami em 03/04/2012 - 13:53h

Olá Dorival,

Sou novo por aqui e novo em Linux, uso Ubuntu Server 11.10 na escola que trabalho e gostaria de saber como configurar sua regra no Ubuntu, ou seja, quais arquivos editar.

Grato,

Cleber

[6] Comentário enviado por dorivaljunior em 03/04/2012 - 14:36h

Olá etecfami,

esta solução é para linux de uma forma geral. Assim, no ubuntu ele funcionará da mesma forma. Ou seja, você cria o script com o nome desejado e coloca-o também no local onde achar melhor. Em seguida, cadastre no cron (crontab -e) como root, os horários em que o script deverá rodar.

Criei recentemente uma solução melhor do que esta que fiz em 2010, a qual estou finalizando os testes para então postar o script melhorado.


[7] Comentário enviado por willian.barker em 08/08/2012 - 14:22h

Quando eu executo o comando "/root/443-control.sh" retorna a seguinte mensagem abaixo:


/usr/sbin/iptstate: invalid option -- 1


O que pode ser?


Obrigado.

[8] Comentário enviado por dorivaljunior em 08/08/2012 - 16:04h

Olá willian.barker, a única linha que usa o iptstate é
RESULTADO_IP=$( $IPTSTATE -s 192.168.100.$I -D 443 -1 | $TAIL -n +4 | $AWK '{print $2}' | $SORT | $UNIQ | $WC -l )

Assim, acredito que de alguma forma esta linha deve ter sido alterada. Então faça o seguinte:

Execute o script assim:
bash -xv ./443-control.sh

Esta linha permitirá que você veja o que acontece e onde exatamente o erro acontece, assim fica mais fácil identificar.

[9] Comentário enviado por flaviomstes em 21/09/2012 - 16:42h

olá dorival, estou com um problema eu tento subi o sistema ele me da isso, o que pode ser? Desde já agradeço a atenção

root@firewall:/etc/init.d# sh /usr/sbin/bloqueio_ultrasurf verifica
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory

[10] Comentário enviado por flaviomstes em 21/09/2012 - 16:49h


[9] Comentário enviado por flaviomstes em 21/09/2012 - 16:42h:

olá dorival, estou com um problema eu tento subi o sistema ele me da isso, o que pode ser? Desde já agradeço a atenção

root@firewall:/etc/init.d# sh /usr/sbin/bloqueio_ultrasurf verifica
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory
/usr/sbin/bloqueio_ultrasurf: line 46: /usr/sbin/iptstate: No such file or directory


Consegui resolver, precisava apenas intalar. agora deu um outro erro

root@firewall:/home/flavio# bloqueio_ultrasurf verifica
/usr/sbin/bloqueio_ultrasurf: line 49: /usr/local/sbin/iptables: No such file or directory

[11] Comentário enviado por dorivaljunior em 21/09/2012 - 16:57h

Olá flaviomstes, tudo indica que o seu iptstate está em local diferente ou não instalado.

Proceda da seguinte forma:

1) instale o iptstate
# apt-get install iptstate

2) localize o comando:
# whereis iptstate

Com o resultado em mãos, coloque o caminho correto do arquivo iptstate!

até mais ver.

[12] Comentário enviado por dorivaljunior em 21/09/2012 - 16:58h

o erro /usr/sbin/bloqueio_ultrasurf: line 49: /usr/local/sbin/iptables: No such file or directory indica que a localização do arquivo iptables está errada.

Faça:
1) localize o comando:
# whereis iptstate

2) coloque a localização correta dele na variável.

[13] Comentário enviado por flaviomstes em 21/09/2012 - 18:14h

Obrigado dorivaljunior, esta rodando, so que na versão do ultra-surf 12.03, o script não esta bloqueando ele acesso atraves 127.0.0.1:9666, e agora o que fazer..



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts