Como Fazer para Bloquear o UltraSurf, Solução Definitiva [iptables + fail2ban]
Essa semana fazendo a revisão do firewall de um cliente eu consegui bloquear o acesso as redes BitTorrent e ao terrível UltraSurf.
Vou descrever como fiz para bloquear o UltraSurf.
O problema
Em um primeiro momento eu acreditei que seria fácil bloquear o UltraSurf, porém o uso de proxy transparente obriga que a porta 443 (HTTPS) fique liberada, o BitTorrent foi bloqueado sem dificuldades.
Com o uso do tcpdump eu identifique que todo o acesso do UltraSurf sai pela porta 443, logo a solução mais obvia seria bloquea-la, porém não é possível. Bloquear o IP ou range de IP do servidor de destino seria outra opção.
Quando fiz o bloqueio pelo range de IP, descobri que o UltraSurf tenta uma centena de IPs diferentes até conseguir o acesso que ele precisa, e certamente devem existir novos IPs a cada nova versão.
Pesquisei pelo Google e não encontrei nenhuma forma eficiente de bloquear o UltraSurf, foi então que tive pensei o seguinte.
Criar uma regra no iptables e fazer log dos acesso ao IP do UltraSurf, depois criar um daemon para ler esse log e fazer um bloqueio em tempo real.
Bem, chega de bla bla e vamos por a mão na massa.
Começando
Vamos lá, esse pequeno tutorial é para tratar um problema especifico, sendo assim eu suponho que você já sabe usar o iptables, afinal já está aqui buscando uma forma de fazer um bloqueio mais avançado, rs
Acredito que essa solução possa ser utilizada por todos, para firewall simples até o mais complexo.
Eu estou usando Debian 5.0.3, iptables 1.4.2 e fail2ban 0.8.3.
Qualquer dúvida, problema ou sugestão podem deixar um comentário.
No final você encontra os arquivos de configuração para download.
iptables
Essa parte é bem simples, no seu script de firewall adicione a seguinte linha.
iptables -A FORWARD -d 65.49.14.0/24 -j LOG --log-prefix "=UltraSurf= "
A rede 65.49.14.0/24 é a primeira a ser contactada pelo UltraSurf quando ele é aberto, a regra acima apenas gera um LOG, não existe bloqueio do acesso, em um primeiro momento o usuário vai até pensar que está funcionando.
ATENÇÃO
Coloque essa regra antes da regra com o modulo state (-m state –state ESTABLISHED,RELATED).
Se colocar depois os pacotes das conexões já estabelecidas não irão para o LOG e pode gerar falhas no bloqueio.
fail2ban
O fail2ban é uma ferramenta muito boa para a segurança de servidores, em linhas gerais ela faz o seguinte.
Lê algum arquivo de log, compara com uma expressão regular e em caso positivo ele executa algum comando no sistema.
Por padrão ele monitora o log do SSH e em caso de falhas consecutivas no acesso ele cria uma regra no iptables para bloquear o possível invasor.
Instalando
Como eu estou utilizando o Debian e vou instalar pelo apt-get.
# apt-get install fail2ban Reading package lists... Done Building dependency tree Reading state information... Done Suggested packages: python-gamin The following NEW packages will be installed: fail2ban 0 upgraded, 1 newly installed, 0 to remove and 100 not upgraded. Need to get 86.2kB of archives. After this operation, 631kB of additional disk space will be used. Get:1 http://ftp.br.debian.org stable/main fail2ban 0.8.3-2sid1 [86.2kB] Fetched 86.2kB in 0s (419kB/s) Selecting previously deselected package fail2ban. (Reading database ... 38547 files and directories currently installed.) Unpacking fail2ban (from .../fail2ban_0.8.3-2sid1_all.deb) ... Processing triggers for man-db ... Setting up fail2ban (0.8.3-2sid1) ...
Depois de instalado vamos acessar o diretório de configuração
# cd /etc/fail2ban/
Aqui vamos criar um arquivo chamado jail.local
vi /etc/fail2ban/jail.local
Vamos adicionar o conteúdo abaixo ao arquivo jail.local.
[ultrasurf] enabled = true filter = ultrasurf port = all banaction = iptables-ultrasurf logpath = /var/log/messages maxretry = 6 # Tempo em segundos que o IP fica bloqueado, aqui 15 minutos bantime = 900
Vamos criar o arquivo com a expressão regular que irá filtar o log do iptables.
vi /etc/fail2ban/filter.d/ultrasurf.local
Aqui vamos adicionar uma expressão regular simples ao arquivo ultrasurf.local.
[Definition] failregex = (.*)=UltraSurf=(.*) SRC=<HOST> ignoreregex =
Apesar de simples, funciona
Agora o arquivo que irá executar o iptables e criar as regras necessárias para o bloqueio e desbloqueio.
vi /etc/fail2ban/action.d/iptables-ultrasurf.local
Aqui é onde a magica acontece, adicione o conteúdo abaixo ao arquivo iptables-ultrasurf.local.
[Definition]
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I INPUT -j fail2ban-<name>
iptables -I FORWARD -j fail2ban-<name>
actionstop = iptables -D FORWARD -j fail2ban-<name>
iptables -D INPUT -j fail2ban-<name>
iptables -F fail2ban-<name>
iptables -X fail2ban-<name>
actioncheck = iptables -n -L FORWARD | grep -q fail2ban-<name>
iptables -n -L INPUT | grep -q fail2ban-<name>
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j REJECT
actionunban = iptables -D fail2ban-<name> -s <ip> -j REJECT
[Init]
name = ultrasurf
Agora basta reiniciar o Daemon
/etc/init.d/fail2ban restart
Pronto, agora é só olhar o log do fail2ban e esperar pelo primeiro bloqueio.
# tail -f fail2ban.log 2012-01-13 19:11:36,890 fail2ban.server : INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.3 2012-01-13 19:11:36,891 fail2ban.jail : INFO Creating new jail 'ultrasurf' 2012-01-13 19:11:36,891 fail2ban.jail : INFO Jail 'ultrasurf' uses poller 2012-01-13 19:11:36,901 fail2ban.filter : INFO Added logfile = /var/log/messages 2012-01-13 19:11:36,902 fail2ban.filter : INFO Set maxRetry = 6 2012-01-13 19:11:36,903 fail2ban.filter : INFO Set findtime = 600 2012-01-13 19:11:36,903 fail2ban.actions: INFO Set banTime = 900 2012-01-13 19:11:36,912 fail2ban.jail : INFO Creating new jail 'ssh' 2012-01-13 19:11:36,912 fail2ban.jail : INFO Jail 'ssh' uses poller 2012-01-13 19:11:36,913 fail2ban.filter : INFO Added logfile = /var/log/auth.log 2012-01-13 19:11:36,914 fail2ban.filter : INFO Set maxRetry = 6 2012-01-13 19:11:36,915 fail2ban.filter : INFO Set findtime = 600 2012-01-13 19:11:36,915 fail2ban.actions: INFO Set banTime = 600 2012-01-13 19:11:36,985 fail2ban.jail : INFO Jail 'ultrasurf' started 2012-01-13 19:11:36,997 fail2ban.jail : INFO Jail 'ssh' started 2012-01-13 19:11:52,029 fail2ban.actions: WARNING [ultrasurf] Ban 10.23.134.42 2012-01-13 19:13:36,057 fail2ban.actions: WARNING [ultrasurf] Ban 10.23.134.140 2012-01-13 19:26:52,081 fail2ban.actions: WARNING [ultrasurf] Unban 10.23.134.42 2012-01-13 19:28:36,109 fail2ban.actions: WARNING [ultrasurf] Unban 10.23.134.140 2012-01-13 19:33:50,137 fail2ban.actions: WARNING [ultrasurf] Ban 10.23.134.42 2012-01-13 19:48:50,165 fail2ban.actions: WARNING [ultrasurf] Unban 10.23.134.42 2012-01-13 19:53:44,193 fail2ban.actions: WARNING [ultrasurf] Ban 10.23.134.140
Enviando email de aviso
É possível enviar um email de alerta a cada bloqueio e desbloqueio que o fail2ban faz.
Para ativar essa função você tem primeiramente que testar o envio de email na maquina, para fazer isso vamos usar o programa mail.
# mail seu-email@seu-dominio.com.br Subject: Teste Teste de envio de mensagem . Cc:
Atenção ao . no final da mensagem, ele finaliza o email.
O Debian por padrão utiliza o Exim, o log fica localizado em /var/log/exim4/mainlog.
Você também pode usar o comando mailq para verificar a fila de email, em situações normais não deve existir nenhum email na fila.
Diversos detalhes podem impedir o envio de email, aqui não vou detalhar muito ,vou apenas colocar o conteúdo do meu arquivo /etc/exim4/update-exim4.conf.conf para usar como referência.
dc_eximconfig_configtype='smarthost' dc_other_hostnames='SERVER.DOMINIO.com.br' dc_local_interfaces='127.0.0.1' dc_readhost='' dc_relay_domains='' dc_minimaldns='false' dc_relay_nets='127.0.0.1' dc_smarthost='smtp.DOMINIO.com.br' CFILEMODE='644' dc_use_split_config='false' dc_hide_mailname='false' dc_mailname_in_oh='true' dc_localdelivery='mail_spool'
Estou usando ele como smarthost e encaminhando as mensagens para o meu servidor de smtp.
Depois de ajustar o arquivo você deve executar o comando update-exim4.conf para atualizar a configuração, e reiniciar o Daemon do exim com o comando /etc/init.d/exim4 restart
Pronto, se o envio de email pelo programa mail estiver funcionando você já pode ativar o envio de email pelo fail2ban, vamos lá.
Edite o arquivo /etc/fail2ban/jail.local
#vi /etc/fail2ban/jail.local
[ultrasurf]
enabled = true
filter = ultrasurf
port = all
banaction = iptables-ultrasurf
sendmail-ultrasurf
logpath = /var/log/messages
maxretry = 6
bantime = 900
Adicione a action sendmail-ultrasurf conforme exemplo acima.
Agora vamos criar um novo arquivo chamado /etc/fail2ban/action.d/sendmail-ultrasurf.local
vi /etc/fail2ban/action.d/sendmail-ultrasurf.local
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = printf %%b "Subject: Bloqueado <ip>
From: Suporte <<sender>>
To: <dest>\n
\n
O dispositivo com IP <ip> foi bloqueado depois de tentar burlar
<failures> vezes o nosso sistema de seguranca.\n
Acesso sera liberado automaticamente,\n
Suporte" | /usr/sbin/sendmail -f <sender> <dest>
actionunban = printf %%b "Subject: Liberado <ip>
From: Infra <<sender>>
To: <dest>\n
\n
O dispositivo com IP <ip> foi liberado para acesso normal\n
Novas tentativas serao bloqueadas automaticamente,\n
Suporte" | /usr/sbin/sendmail -f <sender> <dest>
[Init]
name = default
dest = root
sender = fail2ban
Feito isso você irá receber um email quando uma maquina for bloqueada ou desbloqueada, veja exemplo
Bloqueio
O dispositivo com IP 10.23.134.41 foi bloqueado depois de tentar burlar 14 vezes o nosso sistema de seguranca. Acesso sera liberado automaticamente, Suporte
Desbloqueio
O dispositivo com IP 10.23.134.41 foi liberado para acesso normal Novas tentativas serao bloqueadas automaticamente, Suporte
Você também pode alterar a mensagem a seu critério.
Agradecimento
Um forte abraço ao meu amigo Yros Aguiar, quando falei que eu ia criar um Daemon para ler o log, ele me lembrou que eu não precisaria re-inventar a roda, bastava usar alguma ferramenta já existente, rs.
Valeu, economizou horas de trabalho.
Conclusão
Fica ai a dica, pra mim funcionou.
Testei apenas com a versão 11.03, se em alguma outra não der certo peço que me avisem para podermos analisar como bloquear.
Com essa solução a cada tentativa de acesso utilizando o UltraSurf o usuário será bloqueado e não irá acessar mais nada pelo tempo determinado, com isso ele tem duas opções, ou entrar em contato com o suporte da empresa para reclamar ou parar de usar o UltraSurf.
Se ele reclamar você orienta a não usar mais o software, porém normalmente ele para de usar de forma natural o UltraSurf.
Download
Configuração SEM suporte a envio de email conf-fail2ban-ultrasurf.tar.gz
Configuração COM suporte a envio de email conf-fail2ban-ultrasurf-email.tar.gz
Muito bom o artigo, não tinha encontrado antes uma ferramenta eficiente para bloqueio do ultrasurf, ficou mais fácil, muito útil.
Outra forma é identificar o tráfego com o Snort e integrar com iptables ou outro..
Rodrigo, muito bom o seu artigo, porém estou com um pouco de dificuldade para implementar.
Estou tentando em uma maquina CENTOS.
Fiz exatamente da forma indicada e o serviço Fail2Ban não inicia, então tentei com o código abaixo:
[ultrasurf]
enabled = true
filter = ultrasurf
banaction = iptables-ultrasurf[port="all", protocol=tcp]
sendmail-ultrasurf[name=ultrasurf, dest=cpd@telealpha.com.br]
logpath = /var/log/messages
maxretry = 6
bantime = 900
Porém não obtive sucesso.
Poderia me dá uma dica de como proceder ??? Toda ajuda é valida.
No mais, muito obrigado.
David Thimotti
Parabéns pelo Tutorial !!!!!
Implementei no Firewall de um cliente e funcionou, ta bloqueando o UltraSurf.
Só que no log, apareceram algumas mensagens de erro, que me parece ser de sintaxe ou
que está faltando alguma coisa.
Poderia me ajudar ?
Aqui tenho todo o script do Firewall em um arquivo chamado iptables, salvo no /root e
um squid rodando na porta 3128 com whitelist. A minha distribuição é um Debian 5.0.5 .
Segue o erro:
2012-01-25 10:43:13,130 fail2ban.actions.action: ERROR iptables -n -L FORWARD | grep -q fail2ban-ultrasurf
iptables -n -L INPUT | grep -q fail2ban-ultrasurf returned 100
2012-01-25 10:43:13,130 fail2ban.actions.action: ERROR Invariant check failed. Trying to restore a sane environment
2012-01-25 10:43:13,135 fail2ban.actions.action: ERROR iptables -D FORWARD -j fail2ban-ultrasurf
iptables -D INPUT -j fail2ban-ultrasurf
iptables -F fail2ban-ultrasurf
iptables -X fail2ban-ultrasurf returned 100
2012-01-25 10:43:13,147 fail2ban.actions.action: ERROR iptables -D fail2ban-ultrasurf -s 10.0.1.28 -j REJECT returned 100
Obrigado.
Muito bom o artigo, pra mim funcionou 100%, implementei em varios lugares que administro, com 100% de eficacia.
Parabens ao author.
Sabino.
Caro Eduardo,
vamos lá, acho que essa é fácil de resolver, rs
Quando o fail2ban é iniciado ele criar uma CHAIN no iptables usando o comando abaixo
“iptables -N fail2ban-ultrasurf”
Dentro dessa Chain ele coloca as regras para bloqueio, quando você roda o seu script de firewall ele certamente remove todas as chains personalizadas, sendo assim ele remove a chain “fail2ban-ultrasurf”.
Para resolver isso basta você adicionar a linha abaixo no começo do seu script de firewall
/etc/init.d/fail2ban stop
E a seguinte linha no final do script de firewall
/etc/init.d/fail2ban start
Espero que resolva.
abs,
Rodrigo
Estou com o mesmo erro!!! Conseguiu subir o serviço
Muito obrigado, meu amigo, por essa sua importante contribuição! Estava há muito tempo procurando uma solução e a sua é, até o momento, a mais eficiente. Um abraço!
Olá consegui resolver no CentOS da seguinte forma:
trocando a linha “banaction = iptables-ultrasurf” por “action =
iptables-ultrasurf”
Ai sim o serviço funcionou e leu os logs.
Até.
Jovander