Port Knocking no Ubuntu — Guia completo

O que é port knocking
Port knocking é uma técnica que mantém portas de serviço (por exemplo SSH) inacessíveis até que um cliente envie uma sequência específica de tentativas de conexão a outras portas. Pense nisso como uma batida secreta na porta do servidor: somente quem sabe a sequência pode abrir a porta.
Definições rápidas
- Port knocking: método que abre portas apenas após receber uma sequência válida de tentativas de conexão a portas predefinidas.
- knockd: daemon que monitora as portas e executa comandos quando a sequência é válida.
- iptables: firewall em sistemas Linux que controla regras de filtragem de pacotes.
Importante: port knocking não substitui autenticação forte. Combine-o com autenticação por chave pública e outras medidas de segurança.
Por que usar port knocking
- Reduz a superfície de ataque exposta por scanners de portas automatizados.
- Evita respostas a sondagens na porta SSH, reduzindo log noise e exposição.
- Pode ser integrado com chaves SSH para dupla barreira.
Quando pode falhar
- Se um atacante monitora o tráfego e aprende a sequência.
- Em redes com NAT/CGNAT complexas, o IP do cliente pode mudar entre ‘knocks’ e a tentativa de conexão, bloqueando o processo.
- Contra atacantes com acesso à rede local ou com ferramentas de replay, especialmente sem proteção adicional.
Alternativas e complementos
- Single Packet Authorization (SPA) com fwknop: mais resiliente a sniffing e replay.
- VPN dedicada para administração: reduz necessidade de port knocking.
- Fail2ban e limites de taxa para complementar proteção.
Requisitos e cobertura
Este guia foi escrito para Ubuntu e Debian (incluindo Debian 8). Com adaptações mínimas os passos funcionam em outras distribuições baseadas em Debian.
Requisitos mínimos
- Acesso root ao servidor (ou sudo).
- Conexão de console ou outra maneira de recuperar acesso em caso de erro.
Passo 1: instalar pacotes necessários
Todas as instruções abaixo supõem que você tem privilégios de root. Para se tornar root, use:
sudo su
Atualize a lista de pacotes:
apt-get update
Instale o servidor SSH, caso ainda não exista:
apt-get install openssh-server
Instale o daemon de port knocking (knockd):
apt-get install knockd
Exemplo de saída durante a instalação (pode variar conforme a sua versão do Debian/Ubuntu):
Get:1 http://security.debian.org wheezy/updates Release.gpg [1,554 B]
Get:2 http://security.debian.org wheezy/updates Release [102 kB]
Get:3 http://security.debian.org wheezy/updates/main amd64 Packages [336 kB]
Hit http://mirrors.digitalocean.com wheezy Release.gpg
Hit http://mirrors.digitalocean.com wheezy Release
Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]
Hit http://mirrors.digitalocean.com wheezy/main amd64 Packages
Hit http://mirrors.digitalocean.com wheezy/main Translation-en
Fetched 635 kB in 1s (358 kB/s)
Reading package lists... Done
root@howtoforge:~#
root@howtoforge:~# apt-get install openssh-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
openssh-client
Suggested packages:
ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard ufw
The following packages will be upgraded:
openssh-client openssh-server
2 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.
Need to get 1,364 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue [Y/n]?
Pressione Y e Enter para confirmar.
Instale também o utilitário de firewall iptables:
apt-get install iptables
Passo 2: adicionar regras ao iptables
Comece limpando regras existentes para trabalhar de forma previsível. Essas operações são sensíveis: confirme que você tem um console de recuperação caso algo saia errado.
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPT
Permita conexões já estabelecidas para não encerrar sessões ativas, incluindo sua sessão SSH atual:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Nota: não use espaços dentro do valor RELATED,ESTABLISHED na opção –ctstate.
Bloqueie a porta 22 (SSH) para conexões de entrada por padrão:
iptables -A INPUT -p tcp --destination-port 22 -j DROP
Salvar regras e restaurá-las no boot
Instale iptables-persistent para salvar e restaurar automaticamente as regras no boot:
apt-get install iptables-persistent
Durante a instalação, o pacote perguntará se deseja salvar as regras IPv4 e IPv6 atuais. Selecione Yes para ambas as perguntas.
Você pode salvar manualmente o conjunto de regras atual com:
iptables-save
Exemplo de saída do iptables-save:
# Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1976]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Tue Feb 23 04:59:28 2016
Com isso, você mantém sua sessão atual enquanto impede novas conexões diretas à porta SSH.
Passo 3: configurar o knockd
Edite o arquivo de configuração do knockd:
nano /etc/knockd.conf
Um exemplo de conteúdo padrão do arquivo:
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
Explicação dos campos principais
- UseSyslog: escreve eventos no syslog. Útil para auditoria.
- sequence: a lista de portas que compõem a ‘batida’. Altere para portas e ordem menos previsíveis.
- seq_timeout: tempo, em segundos, dentro do qual a sequência deve ser completada.
- command: comando executado quando a sequência é reconhecida. %IP% é substituído pelo IP do cliente que enviou os knocks.
- tcpflags: exige que os pacotes tenham flags TCP específicas, por exemplo syn.
Boas práticas de configuração
- Troque as portas padrão e a ordem por algo único para sua organização.
- Aumente seq_timeout se estiver usando ferramentas lentas ou se sua rede tiver latência alta.
- Registre eventos de knock com UseSyslog e monitore logs para detectar tentativas suspeitas.
Ativar o knockd no boot
Edite /etc/default/knockd:
nano /etc/default/knockd
Altere:
START_KNOCKD=0
para:
START_KNOCKD=1
Se o servidor tiver múltiplas interfaces, ajuste KNOCKD_OPTS para definir a interface a ser monitorada.
Inicie o serviço manualmente:
service knockd start
Passo 4: acessar o servidor quando o knockd está ativo
Após aplicar as regras, o SSH não aceitará conexões diretas até que você ‘bata’ a sequência. A sessão SSH tentativa não receberá resposta e deverá expirar. Pressione Ctrl-C se precisar cancelar.
Teste com telnet
No cliente Linux instale telnet com apt se necessário. No Windows ative o cliente Telnet em “Ativar ou desativar recursos do Windows”.
Execute, substituindo por seu endereço IP e sua sequência customizada:
telnet seu-ip 7000
telnet seu-ip 8000
telnet seu-ip 9000
Complete a sequência dentro do seq_timeout (por padrão 5 segundos). Em seguida, tente conectar via SSH:
ssh tuo-usuario@seu-ip
Para fechar o acesso novamente, faça a sequência inversa (ou outra definida para fechar):
telnet seu-ip 9000
telnet seu-ip 8000
telnet seu-ip 7000
O port knocking funciona bem junto com autenticação por chave privada. Se combinar ambos, é muito mais difícil para um atacante conseguir acesso.
Verificação, logs e solução de problemas
Onde procurar logs
- /var/log/syslog ou journalctl para eventos do knockd se UseSyslog estiver ativo.
- /var/log/auth.log para tentativas de SSH.
Problemas comuns
- Perda de acesso após um erro de configuração: mantenha um console de gerenciamento (por exemplo, console do provedor cloud) ou uma conta com acesso de recuperação.
- IP do cliente alterado entre knocks (NAT, móveis): considere usar SPA (fwknop) que inclui autenticação por payload.
- knockd não inicia: verifique /var/log/syslog e permissões do binário/arquivo de configuração.
Mini checklist de recuperação rápida
- Tenha um canal de gerenciamento alternativo (console do provedor, IPMI, KVM virtual).
- Acesse o console, edite /etc/knockd.conf ou /etc/default/knockd e desative o START_KNOCKD ou restaure iptables com:
iptables-restore < /etc/iptables/rules.v4
- Reinicie o serviço knockd apenas após confirmar que as regras aceitas são corretas.
Playbook de administração (passo a passo)
- Planeje uma sequência de portas única e documentada em local seguro.
- Implemente regras iptables para bloquear SSH e permitir conexões estabelecidas.
- Configure knockd com UseSyslog e com um comando que apenas permita o IP requisitante.
- Teste localmente com telnet e um cliente SSH secundário.
- Habilite iptables-persistent e verifique restauração no reboot.
- Monitore logs e ajuste seq_timeout/ports conforme necessário.
Checklist por função
Administrador de infraestrutura
- Escolher sequência de portas e timeout.
- Garantir console de recuperação.
- Habilitar auditoria de logs.
Operador de suporte
- Testar sequência em ambiente de homologação.
- Documentar procedimentos de recuperação.
Segurança/Compliance
- Validar que a solução não violará políticas de segurança locais.
- Verificar requisitos de retenção de logs e auditoria.
Dicas de hardening e mitigação de riscos
- Combine port knocking com autenticação por chave pública e desative senhas para SSH.
- Use UseSyslog e encaminhe logs para um SIEM/servidor central; monitore tentativas de knock.
- Bloqueie repetidos knocks inválidos com regras adicionais ou integrate com fail2ban.
- Considere SPA (fwknop) quando houver risco de sniffing ou replay.
Critérios de aceitação
- O servidor não responde a conexões diretas na porta SSH por padrão.
- O cliente que envia a sequência correta dentro do seq_timeout consegue conectar via SSH.
- As regras iptables persistem após reboot e knockd inicia automaticamente.
- Logs registram eventos de knocks para auditoria.
Matriz de decisão rápida
Se você precisa de simplicidade e pouca infra, use port knocking. Se a rede sofre sniffing ou replay, prefira SPA (fwknop) ou VPN.
flowchart TD
A[Precisa reduzir exposição do SSH?] -->|Sim| B{Seu ambiente permite NAT móvel?}
B -->|Sim| C[Considere SPA 'fwknop' ou VPN]
B -->|Não| D[Implemente port knocking + chave SSH]
A -->|Não| E[Use monitoramento e fail2ban]
Testes e critérios de aceitação
- Teste 1: Knock correto dentro do seq_timeout e conexão SSH bem sucedida.
- Teste 2: Knock incompleto ou fora do timeout e acesso negado.
- Teste 3: Reinício do servidor com restauração automática das regras.
Resumo
Port knocking é uma camada adicional, simples de implementar em Ubuntu/Debian com knockd e iptables. Não conte apenas com ele: combine com autenticação por chave, logs centralizados e outras medidas de segurança. Sempre tenha um plano de recuperação e teste mudanças em ambientes controlados.
Importante: documente a sequência e os procedimentos de recuperação em um local seguro. Sem isso, você pode se bloquear fora do servidor.
Fim do guia.
Materiais semelhantes

YouTube TV não funciona no Roku — guia de solução

Atalho do Windows para baixar imagens da web

Corrigir erro CDP.dll ausente no Windows

Como detectar texto gerado por IA manualmente

Instalar RabbitMQ no CentOS 7
