Iptables + módulo recent

Como este módulo está se difundindo bastante ultimamente, resolvi escrever um pequeno artigo descrevendo esse poderoso recurso que o iptables nos oferece. Com ele você poderá criar regras dinâmicas com uma determinada resposta ou ação quando ativada.

[ Hits: 63.745 ]

Por: Ivan de oliveira Santos em 19/10/2006 | Blog: http://www.hitk.com.br


Último exemplo e final - Personal PortKnocking



Agora vamos colocar outra situação. Você trabalha em uma empresa e presta serviço, por fora, para outras empresas. Não podendo assim pedir para o administrador de redes, se caso não for você, abrir determinadas portas porque precisa prestar um suporte que não diz respeito a empresa. Mas o interessante é que portas default estão liberadas, como por exemplo a 22 (SSH).

Geralmente o ping de dentro para fora funciona normalmente, então vamos desenvolver uma solução que funcione da seguinte maneira: enviar 6 pacotes icmp do tipo 8 (echo request) com o ttl setado para um número irreal, pode ser 121, para abrir a porta 22 do ssh em um período de tempo de 30 segundos.

R. iptables -N PNG_ACCEPT_SSH

E. Criar a CHAIN (tabela) PNG_ACCEPT_SSH

R. iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

E. Permitir (-j ACCEPT) que entre no meu firewall (-A INPUT) pacotes TCP (-p tcp) estando estabilizados, originados de uma conexão local (tabela OUTPUT), relatados, sendo colocadas em um espaço de memória. Importante quando usado a política padrão como DROP.

R. iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -m ttl --ttl-eq 121 -j PNG_ACCEPT_SSH

E. Enviar para a CHAIN, tabela, PNG_ACCEPT_SSH todos os pacotes ICMP (-p icmp) que estiverem com o seu tipo setado para 8 (-m icmp --icmp-type echo-request) e seu ttl seja igual a 121.

R. iptables -A PNG_ACCEPT_SSH -p icmp -m icmp --icmp-type echo-request -m recent --set --name liberateSSH

E. Verificar na tabela PNG_ACCEPT_SSH (-A PNG_ACCEPT_SSH) se o pacote entrante é igual ao protocolo icmp (-p icmp) setado para seu tipo ser 8 (-m icmp --icmp-type echo-request), habilitar o módulo recent (-m recent) e criar uma tabela dinâmica (--set) de nome liberateSSH (--name liberateSSH).

R. iptables -A PNG_ACCEPT_SSH -p icmp --icmp-type echo-request -m recent --rcheck --name liberateSSH --hitcount 6 --seconds 30 --rttl -j LOG --log-prefix "LIBERAR_SSH_PING: "

E. Logar (-j LOG -- log-prefix "LIBERAR_SSH_PING: ") o que entrar na tabela PNG_ACCEPT_SSH (-A PNG_ACCEPT_SSH), sendo seu pacote igual ao protocolo icmp (-p icmp) setado para seu tipo ser 8 (-m icmp --icmp-type echo-request), habilitar o módulo recent (-m recent), verificar se o host de origem (--rcheck) está com seis entradas (--hitcount 6) em um tempo de 30 segundos (--seconds 30) e seu ttl é igual ao setado (--rttl) na tabela de nome liberateSSH (--name liberateSSH).

R. iptables -A PNG_ACCEPT_SSH -j RETURN

E. Voltar para a tabela anterior que estava interpretando as regras, no nosso caso a INPUT.

R. iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --name liberateSSH --hitcount 6 --seconds 30 -j ACCEPT

E. Liberar o acesso (-j ACCEPT) dos pacotes de início de conexão (-m state NEW) que entrarem no firewall e sejam do protocolo tcp (-p tcp) com destino a porta 22 (--dport 22) e que seu endereço de origem (--rcheck) esteja setado mais de 6 vezes (--hitcount 6) em um espaço de tempo de 30 segundos (--seconds 30).

Como podem perceber, com o módulo recent do iptables dá para fazer muita coisa. Usem a imaginação e criem suas regras.

Abraços,
--
Ivan Santos
LPIID: 61925

Página anterior    

Páginas do artigo
   1. Introdução
   2. O módulo recent
   3. Exemplo1 - Brute force
   4. Exemplo2 - Port knocking
   5. Último exemplo e final - Personal PortKnocking
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Gerenciando regras de Iptables com Firewall Builder (parte 2)

Squid + iptables (método ninja)

Uso eficiente do IPCOP firewall

Automatizando Firewall com IDS Snort e SnortSam

Bloqueando o UltraSurf e o WebMessenger do Hotmail com Proxy Transparente

  
Comentários
[1] Comentário enviado por fabio em 19/10/2006 - 03:53h

Cara, muito bom esse recurso. Excelente artigo, já está nos meus favoritos :)

um abraço

[2] Comentário enviado por tatototino em 19/10/2006 - 07:26h

Muito bom, parabéns!
Depois vou testá-lo!
Até mais!

[3] Comentário enviado por Flare em 19/10/2006 - 09:41h

Parabens, muito bom o artigo
:)

[4] Comentário enviado por eudson em 19/10/2006 - 10:16h

Kra muito interessante mesmo, ha um bom tempo eu estava atraz desse recurso!!!

Já ta na minha lista de estudos!

[5] Comentário enviado por davidsonbhz em 19/10/2006 - 10:35h

Gostei! Bem explicado e com exemplos práticos. Vou testar por aqui

[6] Comentário enviado por peregrino em 19/10/2006 - 17:39h

cara muito bom mesmo parabens so gostaria que tivesse uma continuação desse ou ter mais algumas opções boas como esta

falow

[7] Comentário enviado por jakovski em 19/10/2006 - 21:02h

parabems bem lega !!!

[8] Comentário enviado por segundow em 19/10/2006 - 21:54h

Melphos....
gostei muito do seu artigo, muito útil e rico para a comunidade. Vou testar essa funcionalidade aqui, eu particularmente não a conhecia. Já até pensei na possibilidade de fazer tratamento nas regras para os clientes que não possuem IP fixo (será um benção)!
Você conhece mais algum artigo ou poderia nos passar mais algum documento para enriquecimento sobre o recent?

Grande abraço

Segundow

[9] Comentário enviado por melphos em 14/11/2006 - 13:25h

Então campeão,

O módulo recent é pouco documentado mesmo, já vi muitas coisas nele na grande rede mas a maioria para bloquear ataques de brute force. No próprio site da netfilter.org tem apenas o que complementei no artigo, descrição de cada item.
O que você pode fazer é junta-lo com outros módulos, por exemplo:

Módulo time:
iptables -N HourSSH
iptables -A INPUT -p tcp -m time --timestart 09:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -m state --state NEW -m recent --set --name HourSSH --dport 22 -i eth1 -j HourSSH

iptables -A HourSSH -p tcp -m state --state NEW -m recent --check --name HourSSH --seconds 60 --hitcount 3 -j DROP

Bloqueio no período das 9h as 18h que o SSH fique liberado, e se tentarem se conectar mais de 2 vezes em um período de tempo de 60 segundos, será bloqueado o seu acesso.

Da para usar a imaginação !!!

Boa sorte,
Ivan Santos

[10] Comentário enviado por acelere em 06/12/2006 - 20:09h

Pois é Melphos,
adicionei as regras que vc postou mas elas não conseguiram barrar ataques ao ssh2.
Acho que o problema é que o ssh2 usa outras portas além da 22. O meu log contem várias linhas com:

... failed password for invalid user ZZZ from xxx.ccc.xxx.ccc port 47653 ssh2

Claro que o numero 47653 varia bastante.

Tentei uma vasculhada para saber se as portas do ssh2 eram padrão, mas não achei um "port range".

Vc tem alguma dica de regra que barre esse tipo de ataque?

Valeu,

acelere

[11] Comentário enviado por melphos em 07/12/2006 - 12:05h

Olá campeão,

Este artigo se aplica a qualquer tipo de versão do SSH, principalmente a versão 2 do SSH. E o SSH versão 2, não usa outros ranges de portas igual ao ftp por exemplo. Se não está bloqueando você deve verificar suas regras anteriores, ver se tem alguma regra que está liberando o ataque.

Para deixar um pouco mais claro, essa porta 47653, não é a porta que o SSH está escutando, e sim a porta que o ataque está originando. Basicamente, é a porta de origem.

Voltando ao artigo, a um detalhe que descobri esses dias quando fui instalar alguns firewall's no cliente. Seguinte, para distribuições como Suse, Red Hat, essas regras precisam estar em uma ordem correta, ou melhor dizendo, precisa criar uma CHAIN para enviar os pacotes com destino a porta 22 para está CHAIN e tratar com o módulo recent dentro dela, e depois voltar a CHAIN de origem. Pode ser isto que está acontecendo no seu caso.

Qualquer coisa,
Não exite em comunicar,
Abraços e boa sorte,
Ivan Santos

[12] Comentário enviado por acelere em 12/12/2006 - 08:26h

Ok,
Vamos ver se eu consigo:
1) crio a CHAIN:
iptables -N melphos
2) mando para esta CHAIN os pacotes da porta 22:
iptables -A melphos -p TCP --dport 22 --syn -j ACCEPT

E depois?
Como eu coloco o filtro usando o recent dentro dessa CHAIN?
Como os outros pacotes passam por esta CHAIN?
Como eu faço para voltar à CHAIN de origem?

Sei que isso não é um tutorial de iptables, mas acho que completa o seu artigo!

Grato,

acelere

[13] Comentário enviado por elgio em 29/08/2007 - 10:48h

Meu amigo!
Muito bom este teu artigo.

Eu tinha, amadoramente, tentado bloquear este force brute SSH com limit, limitando a 10/m. Problema: meus usuários legítimos acabavam não conseguindo logar-se por que o limite já tinha estourado. Ai eu abri uma porta alternativa para eles e divulguei...

Mas agora, com o modulo recent, lendo teu artigo eu fiz:

# Aceita de um mesmo IP somente 3 por minuto
iptables -A INPUT -i eth0 -p tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --set --name SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --update --seconds 60 --hitcount 3 --name SSH -j REJECT

# mesmo tendo passado pela regra acima (3 por minuto), aceita somente 30 por dia
iptables -A INPUT -i eth0 -p tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --set --name SSH2
iptables -A INPUT -i eth0 -p tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --update --seconds 86400 --hitcount 30 --name SSH2 -j REJECT

A ideia é limitar 3 por minuto, mas se o cara vai no ritmo, tentando até 30 por dia (outra lista) ai ele fica na geladeira por 24 horas! Se o robozinho do cara respeitar o 3/min, em 10 min ele estoura o segundo limite e dançou! Só amanhã!

Pus no ar agora.


[14] Comentário enviado por melphos em 29/08/2007 - 11:00h

Olá Elgio,

Muito bom as regras, você usou as várias possibilidades do módulo recent. Parabéns !!!

abraços,
melphos

[15] Comentário enviado por leliocampos em 19/09/2007 - 14:25h

Boa tarde

Você testou o ultimo exemplo, o de ping. Eu tentei de tudo, até gerar log, ele gera, mas não libera o acesso na porta 22.

No aguardo,
Lélio

[16] Comentário enviado por k4mus em 26/11/2007 - 12:58h

Parabens amigo ..otimo artigo..

>>Ctrl+d<<

[17] Comentário enviado por k4mus em 26/11/2007 - 13:17h

..Na regra dois do brute force: ah um errinho na escrita: :)

iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --name sshlimita --rchek --seconds 120 --hitcount 3 -j LOG --log-prefix "SSHLimitaConn: "

(--rchek - correçao --rcheck)

..nas explicaçao abaixo esta falanco ..mas, so pra constar mesmo :)


abraço galera


..abraços!!!

[18] Comentário enviado por melphos em 26/11/2007 - 15:01h

leliocampos,

Como nestes exemplos não usei CHAINs, fica ai a dica para que em sistemas, por exemplo, derivados do Red Hat, as regras dêem certo. Se for derivados do Debian, tente criar CHAINs para essas regras mesmo.

Abraços,
Melphos

[19] Comentário enviado por melphos em 26/11/2007 - 15:03h

Olá k4mus,

Obrigado pelo elogio e muito obrigado pela correção, as vezes na correria, ou na madrugada, que é quando sobra o tempinho, o sono fala mais alto.

VALEU MESMO PELA CORREÇÃO !!

Abração,
Melphos

[20] Comentário enviado por balani em 30/01/2008 - 00:04h

Excelente artigo, estou me aprofundando em firewall, e a cada dia venho me surpreendo com o nivel dos artigos postados aki no VOL.

Seu artigo vai dar problema com o Greenpeace, pq ele não quebra apenas um galho mais uma floresta inteira...rsrsrs

Parabens!!!

E VIVA A LIBERDADE, VIVA O LINUX

[21] Comentário enviado por demattos em 01/02/2008 - 18:24h

Boa Noite, muito bom o artigo, mas gostaria de saber o seguinte, tenho aqui uma rede de computadores wireless usando minha internet ou seja compartilho com 20 (casas)computadores, eu queria era limitar somente 2 conexcoes dor ip a internet, vc saberia se com estes recurso do iptables e possivel fazer isto


Obrigado

[22] Comentário enviado por melphos em 01/02/2008 - 20:47h

balani,

He he he ... obrigado. Estou fazendo um outro artigo sobre performance no iptables, onde irei falar um pouco sobre "Connection tracking", memória., /pro/sys/net/ipv4/*, sobre passos ideais e customizações em uma instalação de um firewall, como por exemplo, permissões, particionamento, sistema de arquivos, etc. E irei dar uma "chamiscada" nas integrações dos módulos.

Faça muitos testes, entenda como funciona o módulo recent, mas vá a fundo mesmo, tente entender o que é feito por trás de uma regra.

qualquer problema, pode entrar em contato: melphos@gmail.com

Abraços e muito sucesso,
Melphos

[23] Comentário enviado por anonymous em 22/12/2009 - 08:09h

Mt show! Já adicionei em favoritos

[24] Comentário enviado por brizao em 28/07/2010 - 00:01h

um negócio interessante também seria utilizar o programa fail2ban que faz a mesma coisa e no diretório /etc/fail2ban/jail.conf que é onde se configura o tempo de banimento, os protocolos e serviços que serão enjaulados em caso de tentativa de força bruta..

[25] Comentário enviado por caldeiratech em 20/07/2012 - 13:04h

Pessoal estou implementando esta regra:


$ipt -N QW22
$ipt -A INPUT -p tcp -i $iface_ext --dport 22 -j QW22
$ipt -A QW22 -m state --state NEW -m recent --set --name conexoes_p22
$ipt -A QW22 -m recent --name conexoes_p22 --update --seconds 1 --hitcount 20 -j DROP

Até aqui funciona perfeitamente, porém, se eu informar o "--hitcount" com um valor maior que 20, o IPTABLES da erro de regra.

iptables: Invalid argument. Run `dmesg' for more information.

Existe limite para o parâmetro --hitcount ou há outra forma de implementar esta regra?


[26] Comentário enviado por caldeiratech em 20/07/2012 - 14:42h


[25] Comentário enviado por caldeiratech em 20/07/2012 - 13:04h:

Pessoal estou implementando esta regra:


$ipt -N QW22
$ipt -A INPUT -p tcp -i $iface_ext --dport 22 -j QW22
$ipt -A QW22 -m state --state NEW -m recent --set --name conexoes_p22
$ipt -A QW22 -m recent --name conexoes_p22 --update --seconds 1 --hitcount 20 -j DROP

Até aqui funciona perfeitamente, porém, se eu informar o "--hitcount" com um valor maior que 20, o IPTABLES da erro de regra.

iptables: Invalid argument. Run `dmesg' for more information.

Existe limite para o parâmetro --hitcount ou há outra forma de implementar esta regra?




SOLUÇÃO PARA O hitcount:


Limitação de hitcount

Provavelmente o hitcount será carregado pelo kernel com contador igual a 20. Para alterar:

Crie o arquivo se não existir, configure o hitcount que pode ser no máximo 255:
vi /etc/modprobe.d/options (dependendo pode ser options.conf)
options xt_recent ip_pkt_list_tot=100

Remova as regras que usam o módulo recent:
iptables -F
iptables -X

Se o módulo xt_recent/ipt_recent foi carregado anteriormente:
lsmod | egrep recent
... então remova:
rmmod xt_recent

Carregar novamente o módulo:
modprobe xt_recent

Verifique:
cat /sys/module/xt_recent/parameters/ip_pkt_list_tot

Execute o passo 2 novamente.

[27] Comentário enviado por px em 14/07/2013 - 22:58h

Grande artigo colega, quem disse o contrário precisa estudar muito ainda, e digo mais este modulo permite uma grande variedades de listas que só eram possíveis antes com varias CHAIN diferentes, espero que eles inovem ainda mais em módulos e acrescentem algumas funções, mas já é um grande avanço






---
Atenciosamente, Pedro.

Já leu meu último artigo?
LINK:
http://www.vivaolinux.com.br/artigos/userview.php?login=px


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts