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

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

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

Atalho do Windows para baixar imagens da web
Tutoriais

Atalho do Windows para baixar imagens da web

Corrigir erro CDP.dll ausente no Windows
Solução de Problemas

Corrigir erro CDP.dll ausente no Windows

Como detectar texto gerado por IA manualmente
Edição

Como detectar texto gerado por IA manualmente

Instalar RabbitMQ no CentOS 7
DevOps

Instalar RabbitMQ no CentOS 7

Instalar e usar SSHFS no CentOS
Linux

Instalar e usar SSHFS no CentOS