Página Inicial > Linux, Segurança > Como Fazer para Bloquear o UltraSurf, Solução Definitiva [iptables + fail2ban]

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

Referências

fail2ban
iptables
Bloquear Ultrasurf usando uma GPO

Rodrigo Luis Silva

Gestor de equipes especialista em sistemas GNU/Linux com ampla experiência em gerenciamento de storage, virtualização, network, desenvolvimento e outros.

More Posts - Website - Twitter - Facebook

  1. 14, janeiro, 2012 em 19:31 | #1

    Muito bom o artigo, não tinha encontrado antes uma ferramenta eficiente para bloqueio do ultrasurf, ficou mais fácil, muito útil.

  2. leonardo
    16, janeiro, 2012 em 14:51 | #2

    Outra forma é identificar o tráfego com o Snort e integrar com iptables ou outro..

  3. 23, janeiro, 2012 em 17:28 | #3

    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

  4. Eduardo
    25, janeiro, 2012 em 11:52 | #4

    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.

  5. Sabino
    4, fevereiro, 2012 em 11:29 | #5

    Muito bom o artigo, pra mim funcionou 100%, implementei em varios lugares que administro, com 100% de eficacia.
    Parabens ao author.

    Sabino.

  6. 4, fevereiro, 2012 em 21:15 | #6

    Eduardo :

    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.

    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

  7. Jovander
    9, março, 2012 em 17:01 | #7

    David Thimotti :
    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

    Estou com o mesmo erro!!! Conseguiu subir o serviço

  8. Walter
    11, abril, 2012 em 09:56 | #8

    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!

  9. Jovander
    15, maio, 2012 em 15:24 | #9

    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

  1. Nenhum trackback ainda.