Pular para o conteúdo

Bloqueio de Ultrasurf usando apenas Iptables

Dica publicada em Linux / Introdução
Dorival Junior dorivaljunior
Hits: 14.274 Categoria: Linux Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Instalação do Hamachi no Linux em 3 passos

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

IPtables - Bloqueando o MSN

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

Copiar HD via rede usando dd e nc

Postfix + Gmail no Slackware Linux 12.2

Cacti em distribuições Debian - Instalando plugins

Como adicionar swap no Linux CentOS 7 usando espaço de um Volume Group

Usando o Ubuntu After Install - Ubuntu 14.04

Modem ZTE mf645 no Linux sem aperreio

#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

Entre na sua conta para comentar.