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.
Deixar as portas de alguns serviços em específico fechadas e abrí-las quando bem entender, apenas para o seu IP, em um determinado espaço de tempo. Liberando-as com um simples telnet em portas específicas. Essa dica se baseia no SSH (porta 22).
R. iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --rcheck --name SSH --rsource --seconds 60 --hitcount 3 -j ACCEPT
E. Libere para a lista (--name SSH) as tentativas de conexão que tentam acessar (destino) a porta 22 do protocolo tcp verificando no módulo recent (--rcheck) que tenham 3 ou mais entradas (--hitcount 3) na lista (--name SSH).
R. iptables -A INPUT -p tcp -m tcp --dport 22323 -m state --state NEW -m recent --name SSH --remove -j DROP
E. Negue as tentativas de novas conexões (-m state --state NEW) a porta (destino) 22323 e remova (--remove) da lista (--name SSH) o IP da tentativa de conexão.
R. iptables -A INPUT -p tcp -m tcp --dport 22324 -m state --state NEW -m recent --set --name SSH --rsource -j DROP
E. Negue a tentativa de novas conexões (-m state --state NEW) de acesso (destino) à porta 9837 e adicione (--set) o IP da tentativa (--rsource) a lista (--name SSH).
R. iptables -A INPUT -p tcp -m tcp --dport 22325 -m state --state NEW -m recent --name SSH --remove -j DROP
E. Negue as tentativas de novas conexões (-m state --state NEW) a porta (destino) 22323 e remova (--remove) da lista (--name SSH) o IP da tentativa de conexão.
[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?
[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.
[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?
[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!
[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ã!
[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.
[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
[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
[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..
[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
[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