Guia de tecnologias

Port Knocking no Ubuntu — Guia completo

7 min read Segurança Atualizado 20 Oct 2025
Port Knocking no Ubuntu — Guia Completo
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.

Instalação do knockd com saída do apt

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.

Prompt para salvar regras IPv4/IPv6

Confirmação do iptables-persistent

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

Editando /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

  1. Tenha um canal de gerenciamento alternativo (console do provedor, IPMI, KVM virtual).
  2. 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
  1. Reinicie o serviço knockd apenas após confirmar que as regras aceitas são corretas.

Playbook de administração (passo a passo)

  1. Planeje uma sequência de portas única e documentada em local seguro.
  2. Implemente regras iptables para bloquear SSH e permitir conexões estabelecidas.
  3. Configure knockd com UseSyslog e com um comando que apenas permita o IP requisitante.
  4. Teste localmente com telnet e um cliente SSH secundário.
  5. Habilite iptables-persistent e verifique restauração no reboot.
  6. 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.

Prompt de confirmação do iptables-persistent

Fim do guia.

Autor
Edição

Materiais semelhantes

Instalar e usar Podman no Debian 11
Containers

Instalar e usar Podman no Debian 11

Apt‑pinning no Debian: guia prático
Administração de sistemas

Apt‑pinning no Debian: guia prático

Injete FSR 4 com OptiScaler em qualquer jogo
Tecnologia

Injete FSR 4 com OptiScaler em qualquer jogo

DansGuardian e Squid com NTLM no Debian Etch
Infraestrutura

DansGuardian e Squid com NTLM no Debian Etch

Corrigir erro de instalação no Android
Android

Corrigir erro de instalação no Android

KNetAttach: Pastas de Rede remota no KDE
KDE

KNetAttach: Pastas de Rede remota no KDE