Iptables com recent

Publicado por Ivan de oliveira Santos em 13/02/2006

[ Hits: 10.403 ]

Blog: http://www.hitk.com.br

 


Iptables com recent



Com a necessidade de se chegar a um grau de segurança maior, vou demonstrar abaixo um módulo do iptables, que é muito interessante.

Segue um dica para deixar as portas de alguns serviços em específico fechadas e abri-las quando bem entender, apenas para você. Essa dica se baseia no SSH (porta 22).

Fui alvo de grandes ataques de brute force no serviço de SSH, então desenvolvi um script que analisa o log e bloqueia o IP do atacante, mas como já existia um na net dei uma implementada para alcançar um funcionalidade maior. Mesmo assim, interminantemente novos IP vem querendo acessar o SSH sem permissão. Desta forma busquei um saída e achei o módulo "recent" no iptables. Com ele, você pode deixar uma porta fechada, e abri-la de acordo com uma regra específica.

Veja:

1)

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

1.1)

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).

2)

iptables -A INPUT -p tcp -m tcp --dport 22323 -m state --state NEW -m recent --name SSH --remove -j DROP

2.1)

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.

3)

iptables -A INPUT -p tcp -m tcp --dport 22324 -m state --state NEW -m recent --set --name SSH --rsource -j DROP

3.1)

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).

4)

iptables -A INPUT -p tcp -m tcp --dport 22325 -m state --state NEW -m recent --name SSH --remove -j DROP

4.1)

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.

Quando alguém tentar se conectar com o SSH, pela porta 22, o firewall irá negar a tentativa de conexão, agora se você der um telnet, ou melhor, enviar um pacote tcp com a flag syn setada (sinônimo de nova conexão) à porta 22324, o iptables irá colocar o seu IP em um arquivo, denominado SSH em /proc/net/ipt_recent, se neste arquivo o IP das tentativas estiver se repetindo 3 vezes em um período de tempo de 60 segundos, o iptables abrirá a porta 22 (SSH) para o IP. E quando o IP enviar um pacote com a flag syn setada (telnet por exemplo) para a porta 22323 ou 22325 o iptables retirará a regra que abre a porta e o IP da lista (/proc/net/ipt_recent/SSH).

Outra coisa interessante de se citar, é o fato de ter duas portas fechando e estarem antes e depois da porta que abre. Com esse esquema, se alguém der um nmap em seu firewall, ele passará pela porta 22323, como o IP não está na lista, o firewall não faz nada, e depois passa na porta 22324, aí sim o firewall adiciona o IP da máquina na lista, mas logo em seguida passa pela porta 22325 e o firewall o retira da lista, ficando assim muito difícil de alguém conseguir abrir a porta SSH do seu firewall, e ainda mais, ele tem que tentar três conexões na porta 22324 para o firewall poder abrir a 22. Eu particularmente acho "QUASE IMPOSSÍVEL" de alguém conseguir abrir a porta, mas você sabe né, segurança é cruel, quanto mais se tenta deixar seguro, sempre descobre algo novo!!!

Um abraço,
Ivan Santos.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Testando seu firewall

Instalando certificado SSL (Rapidssl/Geotrust) no Zimbra 6.x e 7.x

Quebrando senha de root

Utilizando o nmap para descobrir versão dos serviços

Criando senhas diferentes para sites diferentes

  

Comentários
[1] Comentário enviado por unixinanutshell em 13/02/2006 - 23:07h

Muito bom...

[2] Comentário enviado por gilps em 31/03/2006 - 01:57h

Muito bom!
Quais os modulos do iptables, que tem que levantar para isso funcionar, tentei e aqui e ñ fez nada!
Aqui criei um arquivo com o nome rc.firewall, que levanta os modulos compartilha a web e redireciona portas para os demais pcs da rede! E adicionei esta regra no fim do arquivo!

[3] Comentário enviado por melphos em 03/04/2006 - 09:19h

Amigo,

Se você usa o iptables 1.2.11 ou superior, kernel 2.6 ou 2.4. Os módulos são carregados automaticamente.
Mas se caso mesmo assim quizer levantar os módulos na mão.

modprobe ipt_recent.

Para teresponder com mais segurança e certeza, fale/poste sobre os erros ...

Abraço,
Ivan

[4] Comentário enviado por gilps em 05/04/2006 - 03:08h

Bá esta funcionando blz!...agora.
Mais uma perguntinha, usando o mesmo esquema de 3 tentativas e de pois, é aberta a porta do ssh, tem como em vez de abrir uma porta, executar um script?
Sei que parece bobagem mas estou precisando de algo assim!

Mais uma vez, esta dica sua é excelent! parabéns.
Abraços...

[5] Comentário enviado por melphos em 05/04/2006 - 09:00h

Campeão,

Até onde meu conhecimento vai em iptables, eu acho que não da não.
Mas nada impede de procurar-mos algo.
Você pode fazer este esquema das portas junto com um aplicativo que escute em alguma porta específica e quando uma requisição syn chegar ele executa um script. É uma idéia.

Abraço,
Ivan

[6] Comentário enviado por marcosantiago em 11/05/2006 - 16:28h

Amigo,

Fiz os procedimentos que vc disse...carreguei os modulos...mas não aconteceu nada...ele continua com a porta 22 aberta aceitando conexões normalmente....
Se puder ajudar...Obrigado
OBS:Eu uso slackware 10.2 kernel 2.4 iptables 1.2.10

[]´s
Marcos

[7] Comentário enviado por melphos em 11/05/2006 - 16:44h

Então,

Bom vamos lá, vamos fazer um check list.

Primeiro, precisa ter a regra de aceitar conexões estabilizadas e relatadas na pilha do netfilter.
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

Definir a politica padrão como DROP
iptables -P INPUT DROP

Definir as regras do port knoking

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

iptables -A INPUT -p tcp -m tcp --dport 22323 -m state --state NEW -m recent --name SSH --remove -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m tcp --dport 22324 -m state --state NEW -m recent --set --name SSH --rsource -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m tcp --dport 22325 -m state --state NEW -m recent --name SSH --remove -j REJECT --reject-with tcp-reset

Agora sim.
Manda três telnet enseguidas para o host na porta 22324 e já era. A 2 estára aberta.

Abraço,


Boa sorte,
qualquer coisa mail-me,
Ivan Santos

[8] Comentário enviado por ecbr em 13/09/2006 - 08:03h

muito bom artigo, mas poderia da uma melhor esplicacao nas opcoes do iptables recent que foram usadas?

[9] Comentário enviado por melphos em 14/09/2006 - 08:55h

Então, para ser sincero este não é um artigo e sim um "dica". Por isso fui mais objetivo sem muitas explicações. :-)

Estou mandando para a listaiptables-br ( yahoogrupos ) uma explicação do módulo recent.

Mas se quizer, posso mandar para o seu e-mail caso não assine esta lista.

abraços,
Ivan

[10] Comentário enviado por Druide em 03/02/2007 - 12:31h

Olá Ivan

Não tinha visto aínda sua dica, gostei bastante.

Apenas para acescentar, não precisa usar o telnet, pode usar o hping que é muito mais rápido e simples

sudo hping3 --syn -p 22324 -c 3 IP

Pode inclusive, se você estiver de um terminal seguro, criar um script para que faça isso e logo em seguida conecte-se.

Abraços

[11] Comentário enviado por poleti em 29/08/2008 - 17:58h

Ola, como eu instalo este modulo no hed hat?



Contribuir com comentário