Bloqueando o Ultrasurf

Publicado por Giovani Soares em 25/01/2010

[ Hits: 23.242 ]

 


Bloqueando o Ultrasurf



Olá a todos! Esta é a minha primeira contribuição para o VOL, comunidade que me ajudou muito com Linux e ainda ajuda.

Bom, como diz no título do post, vamos bloquear o ultrasurf (ou pelo menos tentar :P). Para quem não o conhece, este programa foi desenvolvido para "furar" a censura na internet imposta pelo governo na China. O que foi feito com uma iniciativa bastante nobre acabou se tornando um problema para os administradores de rede nas empresas.

Este programa se conecta a servidores Proxy usando conexão segura SSL na porta 443 e torna a própria máquina do usuário em um Proxy Server. O problema é que os servidores do ultrasurf usam IPs dinâmicos, o que torna inviável bloquear a porta 443 para seus endereços. Já vi sugestões de bloquear a porta 443 para todos os endereços e ir liberando de acordo com a necessidade, dependendo do tamanho da organização esta prática pode não se adequar muito.

Bem, vamos ao que interessa então.

Instale o tcpdump - para quem não conhece segue um link bacana:
O ultrasurf em suas últimas versões (atualmente está na 9.9.2) se conecta à rede 65.49.2.0/24, se ele não conseguir se conectar a algum IP desta rede ele parte para os IPs dinâmicos, logo nem adianta bloquear esta rede. Então o conceito é simples, toda vez que o tcpdump encontrar alguma conexão da rede interna para a rede 65.49.2.0/24 representa que o ultrasurf está rodando (essa rede é primeira opção do ultrasurf, então não a bloqueiem).

Com isto vamos salvar os IPs das máquinas que estão rodando o ultrasurf em um arquivo chamado hosts.log e então bloquear estes endereços para qualquer conexão externa, deixando o usuário completamente sem internet. Assim o usuário vai ter que contatar o pessoal da TI, com isso os administradores vão poder tomar as medidas necessárias de acordo com a política da empresa. E os usuários vão pensar duas vezes antes de usar o ultrasurf, mesmo porque se usarem, vão ficar sem internet até alguém da TI liberar a máquina.

Vamos criar dois scripts: monitor.sh (responsável por monitorar a rede) e stop.sh (responsável por bloquear as máquinas que estão usando o programa).

Conteúdo do monitor.sh:

#!/bin/sh
# Monitoramento das conexões feitas para a rede do ultrasurf
killall tcpdump
tcpdump -i eth1 -qlNnn dst net 65.49.2.0/24 and dst port 443

Conteúdo do stop.sh:

#!/bin/sh
# Bloqueia os ips que estão no arquivo hosts.log
for ip in $(cat /etc/scripts/ultrasurf/hosts.log); do
iptables -t filter -A fdenyall -s $ip -j DROP
done

Um detalhe importante é que estou salvando o meu arquivo hosts.log dentro de /etc/scripts/ultrasurf caso mudem o caminho lembrem de alterar no script.

Para fins de organização eu preferi criar uma chain no iptables só para os usuários do ultrasurf.

Criando a chain fdenyall:

iptables -t filter -N fdenyall
iptables -t filter -I FORWARD 1 -j fdenyall

A primeira regra cria a chain e a segunda cria um pulo da chain FORWARD para a nova chain. Lembrem de colocar estes comandos que criam a chain dentro do /etc/rc.local (ou local equivalente) para que ao reiniciar o servidor a chain possa ser criada automaticamente.

Agora vamos criar três agendamentos no cron (para quem não é familiarizado com o cron: Cron e Crontab para agendar tarefas).

# Executa o script monitor.sh de 5 em 5 minutos salvando a saída em monitor.log
0-59/5 * * * *  root    /etc/scripts/ultrasurf/monitor.sh | tee /etc/scripts/ultrasurf/monitor.log
# De 1 em 1 minuto extrai os ips que usam o ultrasurf do arquivo monitor.log e salvam em
hosts.log
* *     * * *   root    cat /etc/scripts/ultrasurf/monitor.log | cut -f3 -d" " | cut -f1-4 -d. | sort | uniq | tee /etc/scripts/ultrasurf/hosts.log
# De 1 em 1 minuto executa o stop.sh bloqueando os endereços contidos no hosts.log
* *     * * *   root    /etc/scripts/ultrasurf/stop.sh

Pronto, está feito.

Agora façam um teste, executem o ultrasurf de alguma estação, normalmente em 1 minuto ela será totalmente bloqueada. Para desbloquear basta fechar o ultrasurf na estação, esperar uns 5 minutos (este tempo é necessário para que o IP do usuário saia do arquivo hosts.log) e remover o IP do utilizador da chain que criamos, para isto faça:

# iptables -t filter -D fdenyall -s "ip do utilizador" -j DROP

ou se preferir limpe a chain toda usando:

# iptables -t filter -F fdenyall

Bom pessoal é isso, qualquer dúvida fiquem a vontade para perguntar, espero sempre poder estar trazendo coisas novas para vocês.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Permissões em diretórios do Apache no CentOS

Spyware Terminator - Antispyware gratuito para uso doméstico / comercial

Cartilha de segurança

Nunca execute esses comandos

Firewall pessoal com IPtables

  

Comentários
[1] Comentário enviado por gleysonhp em 28/01/2010 - 16:27h

Ola Giovani, estou testando este método, e pelo jeito funfou aqui.... a maquina q testei com ultrasurf chegou a travar... hehe

Porém, após eu fechar o Ultrasurf ela voltou a navegar normal, achei q fosse ficar sem net, mas não...

Vou fazer mais alguns testes.... parabens pela contribuição!

Abraços!



[2] Comentário enviado por giovani.manenti em 29/01/2010 - 10:34h

Olá gleysonhp, esqueci de mencionar que quem usa proxy transparente a máquina continua a navegar na internter passando pelo proxy, porem somente para as conexões na porta 80. Faça um teste, tente enviar algum email usando o outlook ou acessar algum site que use https como o gmail.com, estes não devem funcionar. Para resolver este problema pode-se criar um outro arquivo contendo os IPs que estão sendo bloqueados na chain fdenyall e bloqueá-los no squid. Irei fazer a parte do script que efetua o bloqueio no squid e logo logo posto aqui.

Quaisquer dúvidas fiquem a vontade :D
...

[3] Comentário enviado por gleysonhp em 03/02/2010 - 15:16h

Não uso proxy transparente, porém utilizo além do squid o filtro de conteúdo dansguardian que funciona na porta 8080... então redireciono o que vem nas portas 80 e 3128 para a 8080.

Mas no meu caso, se o danado do ultrasurf parar de funcionar já está valendo....

Valew. abraços!

[4] Comentário enviado por wdasp em 05/02/2010 - 11:11h

Olá, Giovani.

Muito legal a sua dica.

Só uma dúvida: Esse pulo que vc criou de FORWARD para a nova chain vai alterar em alguma coisa as outras regras que eu já tenho no meu script de firewall???

[5] Comentário enviado por giovani.manenti em 05/02/2010 - 13:08h

Olá wdasp, esse pulo não irá interferir nas suas regras, ele é inserido como sendo a primeira regra da chain FORWARD que é para garantir que o utilizador do ultrasurf seja de fato bloqueado, não saindo por alguma outra regra que vc tenha feito anteriormente. O script stop.sh é meio burrinho :) ele vai bloqueando os IPs e não quer nem saber se está bloqueando um IP que já está bloqueado. Suponhamos que um usuário ficou com o ultrasurf aberto por 5 minutos, o stop.sh vai inserir 5 vezes o IP do usuário na chain fdenyall. Por isso que criei uma chain somente para o script.
Logo logo vou trazer o script de bloqueio para o squid. e também um script stop.sh mais inteligente que verifica se o IP já está sendo bloqueado :D

[6] Comentário enviado por giovani.manenti em 08/02/2010 - 14:01h

Bem pessoal demorei um pouquinho mais trouxe os scripts que falei.

São eles o stop.sh (modificado para não gerar duplicatas de IPs na chain fdenyall)e o proxy.sh (responsável por bloquear os IPs no squid, para quem usa proxy).

stop.sh
#!/bin/sh
# Bloqueia os ips que estao no arquivo hosts.log

hosts=/etc/scripts/ultrasurf/log/hosts.log
denied=$(iptables -t filter -L fdenyall -n | grep 'DROP' | cut -c21- | cut -f1-4 -d"." | cut -f1-2 -d" " | sort | uniq)

for iptodeny in $(cat "$hosts"); do
  checker=0

   for ipdeny in $(echo "$denied"); do
        if [ "$iptodeny" = "$ipdeny" ]
        then
          checker=1;
        fi
   done

   if [ "$checker" = 0 ]
   then
     iptables -t filter -A fdenyall -s $iptodeny -p tcp -m multiport ! --dport 25,110,587 -j DROP
   fi

done

proxy.sh
#!/bin/sh
# Bloqueia os usuarios do ultrasurf no squid

ip=$(iptables -t filter -L fdenyall -n | grep 'DROP' | cut -c21- | cut -f1-4 -d"." | cut -f1-2 -d" " | sort | uniq)

if [ "$ip" ]
then

 prx=$(cat /etc/squid/squid.conf | grep ultrasurf)
 if [ -z "$prx" ]
 then

   echo "$ip" > /etc/scripts/ultrasurf/log/proxy.log
   sed '28s/^/acl ultrasurf src "\/etc\/scripts\/ultrasurf\/log\/proxy.log"/' /etc/squid/squid.conf > /etc/squid/squid.conf.new
   sed '76s/^/http_access deny ultrasurf/' /etc/squid/squid.conf.new > /etc/squid/squid.conf_new
   cp /etc/squid/squid.conf /etc/squid/squid.conf_old
   rm /etc/squid/squid.conf.new
   mv /etc/squid/squid.conf_new /etc/squid/squid.conf
   squid -k reconfigure

  fi

fi

[7] Comentário enviado por giovani.manenti em 08/02/2010 - 14:14h

Pronto agora basta adicionar a linha abaixo na crontab.
* *     * * *   root    /etc/scripts/ultrasurf/proxy.sh

Pessoal, muita atenção com os diretórios.

[8] Comentário enviado por gleysonhp em 01/03/2010 - 14:42h

Estou tendo problemas, mas acredito que seja por falta de memoria... depois de uns dias com o servidor ligado, aparece umas mensagens e o servidor pára de responder:

"Out of memory: kill process 2350 (cron) score 1248 or a child..."

O estranho é que isso ocorre geralmente nos finais de semana, qdo não tem usuários conectados, acho que é devido aos scripts ficarem rodando de 1 em 1 minuto, ou algo assim... e qdo chega segunda, o servidor está travado! Durante a semana verifico a utilização de memória, e está td normal.... )-:

Perguntas:

Eu posso alterar o script antigo "stop.sh" por este novo?

E o script do "proxy.sh" eu adiciono ao final daqueles outros 2 scripts que rodam no crontab?

Abraços!

[9] Comentário enviado por fbsalvi em 02/03/2010 - 17:11h

Ola Amigo belo tutor... Vou deixar em favoritos... Mas ainda estou usando o metodo antigo mesmo DROP na porta 443... heheheeh... se precisar abrimos as excessoes... se precisar!!!!


Abraços...


Fabiano.

[10] Comentário enviado por giovani.manenti em 30/03/2010 - 17:26h

Bom, primeiramente peço desculpas ao gleysonhp pela demora na resposta. Gleyson, você pode sim substituir o arquivo stop.sh antigo pelo novo e não indico a utilização do proxy.sh. Colocar o squid nessa brincadeira, foi complicar de mais as coisas. Simplifiquei ao máximo todo o processo e criei um novo artigo mais detalhado e "entendível" do que este. Indico a todos que dêem uma olhada.

segue o link: http://www.megaupload.com/?d=Q2ORXX9N

Eu também não consegui identificar qual o motivo do seu servidor estar travando, pode ser memória mesmo, tenta fazer uma troca dos pentes para testar melhor. Estou usando esta solução aqui já vão fazer 3 meses e o meu servidor está muito bom e estável, sem travamentos e nem nada do gênero.

Um abraço a todos, e quaisquer dúvidas é só postar.

[11] Comentário enviado por gleysonhp em 30/03/2010 - 21:40h

É, realmente o problema de memória são os processos que rodam de 1 em 1 minuto, conforme o servidor fica ligado, vai aumentando o número de processos em modo "sleeping" chegando a mais de 1000 processos neste modo.... e isso vai consumindo memória....
Inclusive, qdo vou reiniciar o servidor ele não consegue matar todos os processos!

Vou dar uma olhada no seu material novo, pode ser que ajude!

Abraços!

[12] Comentário enviado por giovani.manenti em 12/04/2010 - 12:53h

Olá Gleyson, estava analisando seu problema aqui e tentando relaciona-lo aos comandos executados pelo cron. Basicamente são três linhas de agendamento que o cron segue, e destas eu identifiquei apenas uma que poderia causar algo similar ao que está acontecendo. A linha de agendamento do script monitor.sh. Este script usa o tcpdump que é capaz de executar várias instâncias dele mesmo, podendo lotar a memória. Porém, justamente para evitar este problema que ele tem em sua primeira linha o comando killall tcpdump, que é para "matar" o processo anterior do próprio script. Realmente não consegui observar comportamento similar a este nos outros scripts. Sugiro que analise os processos para identificar algum comportamento anormal destes scripts. Ajudei dois outros amigos a implantar esta solução e os mesmos não relatam este problema. Em fim de caso, se realmente não conseguir resolver isto, há ainda uma outra solução para "barrar" o ultra surf, que seria liberar https somente para as redes brasileiras, apesar de eu não gostar muito desta prática ela funciona bem. Caso opte por esta segunda opção te enviarei um arquivo com as redes brasileiras.

Abraços.

[13] Comentário enviado por gleysonhp em 07/05/2010 - 22:45h

Olá Giovani, eu refiz a configuração do bloqueio do UltraSurf de acordo com aquele seu outro artigo atualizado, porém não está bloqueando, aparentemente esta td ok.

Qdo digito: iptables -t filter -L fdenyall

A saida do comando nao retorna o IP da estacao com ultrasurf... devo estar fazendo algo errado.

Se puder me adiciona no MSN para me dar um Help.

Abraços!

[14] Comentário enviado por emcormack em 29/06/2010 - 12:48h

Consegui utilizando a seguinte regra no Firewall da Empresa:

# Detonando com o Ultra surf
iptables -A -t nat PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3128

O que essa regra faz:
Redireciona tudo que vier da porta 443 para a porta do Squid 3128 assim o Ultrasurf não consegue conectar pois utiliza malandramente a porta 443 e não a porta 9666.

OBS: TEM QUE SER ANTES DE TODAS AS REGRAS DE LIBERAÇAO DE PORTAS.

Abraços e se precisarem de algo: erick@cyclonet.com.br

LINUX É O PODER!!!

[15] Comentário enviado por edipo.magrelo em 16/02/2011 - 15:26h

Bom, primeiramente agradecer ao giovani pelo artigo muito bem explicadinho, e ainda depois mandando outro script de bloqueio
totalmente funcional.
Cara, muito boa dica, funciona direitinho, usei o script do stop que voce postou depois nos comentarios.
Unica coisa que eu queria falar que é eu mudei uma coisinha no seu script do tcpdump
onde vc colocou : 65.49.2.0/24
eu coloquei: 65.49.0.0/16
Porque aqui na minha rede o ultrasurf estava pegando uma outra rede se eu naum me engano era 65.49.14.0/24, por isso coloquei
uma rede classe B ali e batata, bloqueou os engraçadinhos!!!
vlw
abraços galera

[16] Comentário enviado por manoel-ramos em 22/06/2011 - 10:10h

Dica completa para bloqueio do Ultrasurf - http://www.vivaolinux.com.br/dica/Bloqueando-o-Ultrasurf-atraves-do-Netfilter-Iptables-versao-10.08

Leem os comentários que estão atualizados!

[17] Comentário enviado por edilinhares em 21/07/2011 - 10:03h

O arquivo monitor.log é criado e está sempre vazio....
Mas quando executo diretamente na linha de comando "/etc/scripts/ultrasurf/monitor.sh | tee /etc/scripts/ultrasurf/monitor.log", ai sim, as informações são salvas no arquivo log
Não sei o que pode estar ocorrendo.

Edson Linhares


[18] Comentário enviado por lucianocoelho em 18/06/2012 - 00:01h

Pessoal,
consegui bloquear o UltraSurf e similares através do Firewall e Proxy.

Mas a solução é bem simples:
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;
WPAD para configurar o proxy nos clientes.

Escrevi um pequeno artigo sobre como procedi e este esta disponível no meu blog (http://coelholuciano.blogspot.com.br/2012/06/ultrasurf-bloqueio-definitivo.html).

A solução implementada já esta em uso, com sucesso, a mais de um ano.
Um forte abraço
Luciano Coelho



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts