Port Knocking en Ubuntu: instalar y configurar

TL;DR
Port knocking es una técnica para ocultar puertos (por ejemplo SSH) hasta que un cliente realiza una secuencia de conexiones a otros puertos en el orden correcto. Este artículo guía la instalación de knockd y la configuración básica con iptables en Ubuntu/Debian, pruebas de acceso, buenas prácticas y planes de recuperación. Incluye ejemplos, checklist operativo y un diagrama de decisión para elegir alternativas.
¿Qué es Port Knocking?
Port knocking es un mecanismo de control de acceso que mantiene un puerto (como 22 para SSH) cerrado o bloqueado hasta que un cliente conecta a una secuencia específica de puertos en el orden y tiempo correctos. Es una capa adicional de seguridad. Definición breve: técnica de «golpes» en puertos para desbloquear servicios.
Importante: cambiar el puerto SSH por defecto no evita rastreos automatizados. Port knocking complica los escaneos y reduce la superficie visible, pero no sustituye a otras medidas (autenticación por clave, firewall, MFA).
Índice
- Requisitos previos
- Paso 1: instalar paquetes
- Paso 2: reglas de iptables
- Paso 3: configurar knockd
- Probar acceso y cerrar el puerto
- Buenas prácticas y consideraciones de seguridad
- Alternativas y comparativa
- Recuperación si te quedas fuera
- Checklist de roles
- Diagrama de decisión
- Preguntas frecuentes
- Resumen final
Requisitos previos
- Acceso administrativo (root) al servidor o acceso a la consola de emergencia.
- Ubuntu o Debian (las instrucciones funcionan en Debian 8 y versiones similares).
- Conocimiento básico de iptables y edición de archivos con nano o similar.
Nota: Si no tienes consola física o acceso a proveedor (panel de control), tener un plan de recuperación antes de bloquear SSH.
Paso 1: asegurarse de que los paquetes requeridos estén instalados
Todas las órdenes siguientes deben ejecutarse como root. Para elevar a root si trabajas con un usuario con sudo:
sudo su
Actualizar listas de paquetes:
apt-get update
Instalar el servidor SSH (si no está instalado):
apt-get install openssh-server
Instalar knockd, el demonio que administra port knocking:
apt-get install knockd
Salida de ejemplo durante la instalación (se mantiene como referencia):
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]?
Presiona Y y Enter para continuar.
A continuación, instala iptables si no está presente:
apt-get install iptables
Paso 2: añadir reglas a iptables
Primero vacía reglas actuales y permite salidas para no bloquear conexiones salientes:
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPT
Permitir conexiones ya establecidas o relacionadas (esto evita cortar la sesión SSH actual):
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Nota importante: la regla usa ESTABLISHED,RELATED sin espacios alrededor de la coma.
Bloquear el puerto SSH (22) entrante para forzar el uso del mecanismo de port knocking:
iptables -A INPUT -p tcp --destination-port 22 -j DROP
Automatizar la restauración de reglas al reiniciar usando iptables-persistent:
apt-get install iptables-persistent
Durante la instalación te preguntará si deseas guardar reglas actuales para IPv4 e IPv6; selecciona Yes para ambas.
Si prefieres guardar las reglas manualmente usa:
iptables-save > /etc/iptables/rules.v4
Ejemplo de salida de iptables-save (referencia):
# 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
Con estas reglas, tu sesión activa se mantiene mientras otros intentos a 22 quedan bloqueados.
Paso 3: configurar knockd
Editar el archivo de configuración de knockd:
nano /etc/knockd.conf
Un ejemplo típico del archivo:
[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
Explicación corta de claves:
- UseSyslog: envía los eventos a syslog.
- sequence: lista de puertos en orden que el cliente debe tocar.
- seq_timeout: tiempo en segundos para completar la secuencia (por defecto 5s).
- command: comando que ejecuta knockd cuando la secuencia coincide; %IP% se reemplaza por la IP del cliente.
- tcpflags: filtra tipos de paquete TCP (por ejemplo syn).
Recomendaciones:
- Cambia los puertos y el orden por defecto. Los valores por defecto son conocidos por atacantes.
- Considera usar secuencias más largas o incluir UDP para variar la firma.
- Limita el tiempo que la IP queda autorizada (ver más abajo ejemplos y runbook).
Activar knockd en el arranque: editar /etc/default/knockd
nano /etc/default/knockd
Cambia:
START_KNOCKD=0
a:
START_KNOCKD=1
Si el servidor tiene varias interfaces y knockd no escucha donde debe, usa KNOCKD_OPTS para especificar la interfaz.
Iniciar knockd manualmente:
service knockd start
Ahora knockd gestionará la apertura temporal del puerto SSH según las reglas configuradas.
Acceder al servidor cuando knockd está activo
Con las reglas puestas, no podrás conectar SSH directamente. El cliente verá timeout o rechazo hasta que realices la secuencia.
Probar el knocking con telnet
En Linux instala telnet con apt. En Windows habilita el cliente Telnet desde “Activar o desactivar características de Windows”.
Ejemplo (reemplaza youripaddress y la secuencia por tus puertos):
telnet youripaddress 7000
telnet youripaddress 8000
telnet youripaddress 9000
Debes completar la secuencia dentro de seq_timeout (5 segundos en el ejemplo). Luego intenta conectar por SSH:
ssh usuario@youripaddress
Para cerrar el acceso, realiza la secuencia inversa definida en el bloque closeSSH:
telnet youripaddress 9000
telnet youripaddress 8000
telnet youripaddress 7000
Nota: Es recomendable combinar port knocking con autenticación por clave pública y, si es posible, con MFA.
Buenas prácticas y consideraciones de seguridad
- No confíes solo en port knocking. Es una capa adicional, no un sustituto de autenticación fuerte.
- Usa secuencias no triviales y cámbialas periódicamente.
- Restringe la aceptación de la IP abierta por un tiempo limitado y registra intentos fallidos.
- Considera cifrar o ofuscar los patrones si usas herramientas propias de knocking.
- Ten un plan de recuperación si pierdes acceso: acceso de consola por proveedor, IP fija alternativa, o modo de rescate.
- Riesgos: knockd puede ser vulnerable a ataques de repetición (replay) si no se limita la ventana de tiempo o el número de intentos.
- Para IPv6, asegúrate de que knockd y tus reglas de firewall soporten direcciones v6; iptables vs ip6tables.
Seguridad adicional (opciones):
- Single Packet Authorization (SPA) como fwknop ofrece mayor resistencia a escucha/repetición.
- Usar certificados o clave privada además del knocking para autenticar al usuario.
Alternativas y cuando falla port knocking
Alternativas:
- fwknop (SPA): envía un paquete cifrado que abre el puerto; evita secuencias visibles.
- VPN: exige conexión a red privada antes de exponer servicios.
- Port knocking a nivel de aplicación (servicios de orquestación) en lugar de iptables.
Casos en los que port knocking puede fallar:
- El cliente está detrás de NAT simétrico y su IP pública cambia entre golpes.
- Pérdida de conexión a la consola del proveedor y reglas persistentes sin acceso físico.
- Sniffers en la red que capturan la secuencia (mitigable con SPA).
Ejemplos y snippets útiles
Ejemplo de knockd.conf que autoriza la IP por 60 segundos y guarda marca en iptables usando un temporizador (enlace a scripts externos recomendable):
[openSSH]
sequence = 1234,2345,3456
seq_timeout = 10
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -m comment --comment "knocked" -j ACCEPT; /usr/bin/sleep 60; /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -m comment --comment "knocked" -j ACCEPT
tcpflags = syn
En este snippet el comando inserta la regla primero y, tras sleep 60, la elimina. Usar scripts para mayor control y logging es preferible.
Recuperación: plan si te quedas fuera
- Acceso al panel del proveedor: activar consola de rescate o reinstalar firewall por consola.
- Si tienes acceso físico, reinicia en modo single-user y edita /etc/iptables/rules.v4.
- Si tienes otra IP autorizada (por ejemplo tu oficina), añade una regla temporal desde consola del proveedor.
- Mantén siempre un usuario con keypair diferente y acceso de emergencia configurado.
Criterios de recuperación mínimos:
- Poder restaurar /etc/iptables/rules.v4 desde respaldo.
- Tener un método de autenticación alternativo (consola o panel proveedor).
Checklist por roles
Administrador de sistemas:
- Respaldar /etc/iptables/rules.v4 y /etc/knockd.conf
- Configurar knockd para arrancar en el inicio
- Probar secuencia y tiempos desde red externa
DevOps / Despliegue:
- Documentar secuencias y tiempos en vault o gestor seguro
- Automatizar cambio periódico de secuencias como parte del pipeline
Seguridad / SOC:
- Monitorizar logs de knockd en syslog
- Alertar por intentos de knocking fallidos repetidos
Diagrama de decisión
flowchart TD
A[¿Necesitas reducir la superficie pública?] -->|Sí| B{¿Quieres resistencia a captura de paquete?}
B -->|Sí| C[Considera SPA 'fwknop' o VPN]
B -->|No| D[Port Knocking 'knockd' con iptables]
A -->|No| E[Usa medidas de autenticación: claves, MFA]
D --> F[Implementar secuencias no triviales y monitorizar]
C --> F
Pruebas y criterios de aceptación
- El puerto 22 debe responder como cerrado antes de la secuencia (no aceptar conexiones).
- Tras la secuencia correcta desde la IP autorizada, la conexión SSH se debe permitir dentro del tiempo configurado.
- Las reglas deben persistir tras reinicio (iptables-persistent u otro método).
- Logs deben registrar intentos de knocking (uso de syslog).
Preguntas frecuentes
¿Port knocking evita que me hackeen?
No completamente. Reduce la visibilidad del servicio, pero debes combinarlo con claves, actualizaciones y monitorización.
¿Puedo usar UDP en la secuencia?
Sí; knockd soporta TCP y UDP en la secuencia si lo configuras adecuadamente.
¿Qué pasa con IPv6?
Asegúrate de que tanto knockd como las reglas de firewall contemplen ip6tables y el soporte adecuado para direcciones IPv6.
Resumen final
Port knocking con knockd y iptables es una capa adicional útil para proteger SSH en servidores Ubuntu/Debian. Implementa secuencias únicas, limita ventanas temporales, mantén planes de recuperación y considera alternativas como SPA o VPN si necesitas mayor resistencia a captura de paquetes. Prueba todo desde redes externas y monitoriza logs.
Notas finales:
- Guarda las configuraciones y documenta la secuencia en un lugar seguro.
- Realiza pruebas de recuperación antes de depender en producción.