domingo, 29 de julho de 2007

Port Knocking

Bom esse post explica como fazer um Port Knocking com Iptables.

Port Knocking seria mais ou menos liberar uma porta no iptables caso seu ip esteja numa lista, caso contrário deixá-la bloqueada.

O exemplo que vou usar será o do ssh.

Antes de mais nada verifique se seu kernel possui o módulo ipt_recent
# modprobe -l | grep recent

se a saida do comando for parecida com
/lib/modules/2.6.20-15-generic/kernel/net/ipv4/netfilter/ipt_recent.ko

você não precisará compilar seu kernel. Agora suba o módulo
# modprobe ipt_recent

Agora crie um arquivo, o nome que utilizarei é pknock.sh e adicione ao seu conteúdo

Obs: As portas e o nome da lista podem e devem ser alterados para maior segurança.

#!/bin/bash
# bloqueia a porta do ssh, no caso a 2000 iptables -A INPUT -p tcp -s 0/0 --dport 2000 -j DROP
# libera a porta do ssh caso o ip esteja na lista SSHKNOCK
iptables -I INPUT -p tcp -s 0/0 --sport 1024:65535 --dport 2000 -m recent --rsource --name SSHKNOCK --rcheck -j ACCEPT
# ao se conectar na porta 2100 adiciona o ip na lista SSHKNOCK
iptables -I INPUT -p tcp -s 0/0 --sport 1024:65535 --dport 2100 -m recent --rsource --set --name SSHKNOCK -j DROP
# ao se conectar na porta 2200 retira o ip da lista SSHKNOCK
iptables -I INPUT -p tcp -s 0/0 --sport 1024:65535 --dport 2200 -m recent --rsource --name SSHKNOCK --remove -j DROP

salve o arquivo.

Agora para aplicar as regras ao iptables sempre que iniciar, no ubuntu edite o arquivo /etc/rc.local como root

# pico /etc/rc.local

antes da linha "exit 0"
adicione bash /home/user/pknock.sh

troque isso pela localização exata no teu pc.

salve o arquivo rc.local

Agora de permissão de execução para ele:
# chmod +x /etc/rc.local

Agora sempre que inicar seu pc as regras já estarão no iptables.

Dúvidas? comentem

4 comentários:

Bruno Gurgel disse...

Pô, legal esse port knocking.
Da uma visitadinha no meu, talvez até o fds, sai post grande sobre com contribs com o Debian.

[]s

Shane "Blackzilla" Diesel disse...

Gostei. É bastante interessante. Mas o OpenSSH permite que utilizemos os arquivos do TCPWrappers para esse tipo de gerênciamento. Podemos colocar no /etc/hosts.allow algo como:

sshd: 200.200.200.1, 200.200.200.2

Wagner Pinto disse...

Concordo com o q vc disse, porém se vc vai para algum lugar que vc não possui o ip previamente adicionado, vc não conseguiria acessar, vc precisaria adicionar o ip ao arquivo. A pratica do Port Knocking possibilitaria o acesso de qualquer lugar. Porém com a utilização dos arquivos /etc/hosts.allow e /etc/hosts.deny a segurança é muito maior.

Victor Faleiro disse...

Pô, no Debian Squeeze não tem o tal módulo!
Como faço para colocá-lo lá???
Eu não manjo nada sobre compilar kernel...