Pular para o conteúdo

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.
Ivan de oliveira Santos melphos
Hits: 65.594 Categoria: Linux Subcategoria: Firewall
  • 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.

Parte 5: Ú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

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.
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. Introdução
   2. O módulo recent
   3. Exemplo1 - Brute force
   4. Exemplo2 - Port knocking
   5. Último exemplo e final - Personal PortKnocking
Nenhum artigo encontrado.

Migrando do ipchains para o iptables

Bloqueando o UltraSurf e o WebMessenger do Hotmail com Proxy Transparente

Squid + iptables (método ninja)

Configurando firewall Shorewall no CentOS

IPtables - Trabalhando com Módulos

#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

Entre na sua conta para comentar.