VPNSmith
self-host-vpnINFO

WireGuard + port knocking: VPN sigilosa en Contabo 2026

Oculta tu endpoint WireGuard de Shodan y de los escaneos de puerto. Setup knockd, secuencia segura, fail2ban, script de despliegue automatizado en VPS Contabo.

Por Eric Gerard · Fondateur · VPNSmith — Spécialiste self-host VPN & VPS GDPR10 min de lecturaFoto vía Unsplash

Divulgación de afiliados — Este artículo contiene enlaces de afiliación Contabo. Si contratas un VPS a través de nuestros enlaces, recibimos una comisión sin coste adicional para ti. Todos los comandos se prueban en nuestros propios VPS de producción.

Tienes un WireGuard auto-alojado en Contabo. Todo funciona. Salvo que tu puerto UDP 51820 lleva 3 días en Shodan, tu VPS recibe miles de paquetes de escaneo por hora, y ves en journalctl handshakes WireGuard rechazados desde botnets. Si tu WireGuard está bien configurado (clave pública fuerte, sin PSK compartida), no tienes nada que temer criptográficamente — pero el ruido contamina tus logs, malgasta CPU, y un día alguien podría encontrar una vulnerabilidad.

Port knocking es una técnica antigua pero eficaz para resolver esto: tu endpoint WireGuard queda cerrado por defecto (UFW drop), y se abre únicamente tras una "secuencia de knock" (serie de intentos de conexión TCP en puertos precisos en un orden preciso). El cliente teclea la secuencia, el firewall abre temporalmente el puerto WireGuard, la sesión se establece, el puerto se cierra. Para Shodan, tu VPS no expone ningún puerto UDP/51820 — eres invisible.

Esta guía cubre la instalación de knockd en VPS Contabo, la secuencia segura, la integración con fail2ban y un script de despliegue automatizado para reproducir el setup en varios VPS.

El principio: tres puertas, una combinación

Port knocking funciona como un timbre codificado. Defines una secuencia de puertos (por ejemplo 7001 → 8002 → 9003) y un orden. El cliente envía un simple intento TCP/SYN a cada puerto en orden. Ningún servicio escucha en esos puertos — el firewall LOG los paquetes y pasa.

Cuando el demonio knockd ve la secuencia válida desde una misma IP en < 30 segundos, ejecuta un comando: típicamente iptables -A INPUT -s <ip> -p udp --dport 51820 -j ACCEPT. La IP del cliente queda autorizada temporalmente. Algunos segundos después, knockd cierra: iptables -D INPUT ....

Ventaja: para un escáner externo (Shodan, Censys, masscan), tu puerto 51820 NUNCA responde. No está listado. Límite: no es criptografía. Alguien que sniff tu tráfico puede ver los knocks y replicarlos. Por eso combinamos con WireGuard (que sigue siendo la auth criptográfica fuerte).

Instalación en VPS Contabo

VPS Contabo VPS S (4,99 €/mes, ver oferta) bajo Ubuntu 24.04 LTS, WireGuard ya instalado y funcionando (si no aún: ver nuestra guía self-host WireGuard).

Paso 1 — Instalar knockd

apt update && apt install -y knockd

Paso 2 — Cerrar WireGuard por defecto

Primero, verifica tu firewall actual:

ufw status verbose

Si UFW permite 51820/udp abierto, vamos a reemplazarlo por "cerrado por defecto + abierto por knockd". Edita /etc/default/ufw o directamente iptables:

ufw delete allow 51820/udp
# WireGuard ahora es DROP por defecto

Verifica: desde fuera, nmap -sU -p 51820 tu-ip debe devolver filtered o closed.

Paso 3 — Configurar knockd

/etc/knockd.conf:

[options]
    UseSyslog
    Interface = eth0

[openWireGuard]
    sequence    = 7203,4581,6217
    seq_timeout = 15
    command     = /usr/sbin/iptables -I INPUT -s %IP% -p udp --dport 51820 -j ACCEPT
    tcpflags    = syn

[closeWireGuard]
    sequence    = 6217,4581,7203
    seq_timeout = 15
    command     = /usr/sbin/iptables -D INPUT -s %IP% -p udp --dport 51820 -j ACCEPT
    tcpflags    = syn

Campos clave:

  • sequence: tus puertos knock. No secuenciales (no 1234,1235,1236), elígelos aleatorios entre 1024 y 65000.
  • seq_timeout: 15 segundos para completar la secuencia desde la misma IP. Demasiado corto, problemas de latencia cliente móvil. Demasiado largo, ventana de ataque por brute force ampliada.
  • command: lo que se ejecuta cuando la secuencia es válida. %IP% se reemplaza por la IP origen del knock.
  • tcpflags: syn para coincidir solo con el paquete inicial de conexión (evita falsos positivos).

Para auto-cierre tras 60 segundos en lugar de un knock manual, usa cmd_timeout:

[openWireGuard]
    sequence    = 7203,4581,6217
    seq_timeout = 15
    command     = /usr/sbin/iptables -I INPUT -s %IP% -p udp --dport 51820 -j ACCEPT
    tcpflags    = syn
    cmd_timeout = 60
    stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p udp --dport 51820 -j ACCEPT

Es más limpio: no hace falta que el cliente envíe un "close knock", knockd cierra solo tras 60s. WireGuard ha establecido su sesión UDP mientras tanto, queda activa.

Paso 4 — Activar knockd

/etc/default/knockd:

START_KNOCKD=1
KNOCKD_OPTS="-i eth0"
systemctl enable --now knockd
journalctl -u knockd -f

Knocker del lado cliente

Linux / macOS: instala el paquete knockd (también provee el cliente knock):

apt install knockd      # Ubuntu/Debian
brew install knock      # macOS via Homebrew

Uso:

knock tu-ip-vps 7203 4581 6217

Espera 1-2 segundos, después monta WireGuard normalmente:

wg-quick up wg0

Tienes 60 segundos para que WireGuard complete su handshake UDP. Una vez la sesión activa, knockd puede cerrar el firewall: la conexión existente no se ve afectada por las nuevas reglas INPUT.

Windows: sin port oficial knock.exe mantenido. Solución pragmática: un script PowerShell que hace 3 Test-NetConnection rápidos:

$ip = "tu-ip-vps"
$ports = 7203, 4581, 6217
foreach ($p in $ports) {
    Test-NetConnection -ComputerName $ip -Port $p -InformationLevel Quiet
    Start-Sleep -Milliseconds 200
}
Start-Sleep -Seconds 1
# Lanza la app WireGuard aquí

Android: app KnockOnD en Play Store (gratis). Configuras IP + secuencia, pulsas el botón, envía los knocks. Combina con WireGuard Android: tras el knock, monta el túnel manualmente.

iOS: PortKnock en AppStore (gratis). Mismo principio.

Endurecimiento: evitar el knock-replay

El knock simple tiene una debilidad: si alguien sniff tu tráfico (Wi-Fi público, ISP hostil, etc.), puede replicar la secuencia desde su IP y conseguir la apertura del firewall. Tres mitigaciones:

1. fail2ban sobre los knocks inválidos

Banea las IPs que hacen 5+ knocks inválidos (sin completar la secuencia). Crea /etc/fail2ban/filter.d/knockd.conf:

[Definition]
failregex = ^.*knockd.*<HOST>:.*: Stage \d failed.*$
ignoreregex =

Y /etc/fail2ban/jail.d/knockd.conf:

[knockd]
enabled = true
filter = knockd
logpath = /var/log/syslog
maxretry = 5
findtime = 60
bantime = 3600

Reload: systemctl reload fail2ban.

2. secuencias one-time (knockd 0.8+)

Usa secuencias de uso único via one_time_sequences:

[openWireGuard]
    one_time_sequences = /etc/knockd/sequences.list
    seq_timeout = 15
    command = /usr/sbin/iptables -I INPUT -s %IP% -p udp --dport 51820 -j ACCEPT
    tcpflags = syn
    cmd_timeout = 60
    stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p udp --dport 51820 -j ACCEPT

El archivo /etc/knockd/sequences.list contiene una secuencia por línea. Una vez usada, se elimina. Pregeneras 100 secuencias, las distribuyes al cliente (archivo cifrado) y cada conexión consume una.

Es notablemente más seguro contra el replay, a costa de una gestión más compleja.

3. Combinar con una VPN de arranque

Enfoque elegante: tu VPS expone únicamente un Shadowsocks o un V2Ray en 443 (modo camuflaje). Los knocks WireGuard se envían a través de este primer túnel SS/V2Ray. El sniff externo solo ve TLS hacia tu dominio, no los knocks.

Es el setup "cinturón+tirantes" para viajes ultra-sensibles.

Script de despliegue automatizado

Para reproducir este setup en varios VPS Contabo, aquí un script que usamos. Colócalo en /usr/local/bin/setup-knock-wg.sh:

#!/bin/bash
set -euo pipefail

if [[ $EUID -ne 0 ]]; then
    echo "Ejecuta este script como root"
    exit 1
fi

# Genera 3 puertos aleatorios entre 5000 y 60000
PORT1=$(( ( RANDOM % 55000 ) + 5000 ))
PORT2=$(( ( RANDOM % 55000 ) + 5000 ))
PORT3=$(( ( RANDOM % 55000 ) + 5000 ))

echo "Secuencia generada: $PORT1 -> $PORT2 -> $PORT3"

apt update && apt install -y knockd fail2ban

cat > /etc/knockd.conf <<EOF
[options]
    UseSyslog
    Interface = eth0

[openWireGuard]
    sequence    = ${PORT1},${PORT2},${PORT3}
    seq_timeout = 15
    command     = /usr/sbin/iptables -I INPUT -s %IP% -p udp --dport 51820 -j ACCEPT
    tcpflags    = syn
    cmd_timeout = 60
    stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p udp --dport 51820 -j ACCEPT
EOF

sed -i 's/START_KNOCKD=0/START_KNOCKD=1/' /etc/default/knockd

# Cierra WireGuard por defecto
ufw delete allow 51820/udp 2>/dev/null || true

# Configura fail2ban
cat > /etc/fail2ban/filter.d/knockd.conf <<EOF
[Definition]
failregex = ^.*knockd.*<HOST>:.*: Stage \d failed.*\$
ignoreregex =
EOF

cat > /etc/fail2ban/jail.d/knockd.conf <<EOF
[knockd]
enabled = true
filter = knockd
logpath = /var/log/syslog
maxretry = 5
findtime = 60
bantime = 3600
EOF

systemctl enable --now knockd
systemctl reload fail2ban

echo ""
echo "Setup completo!"
echo "Cliente: knock $(curl -s ifconfig.me) ${PORT1} ${PORT2} ${PORT3}"
echo "Guarda esta secuencia con seguridad — gestor de contraseñas recomendado."

Vuelve ejecutable y lanza:

chmod +x /usr/local/bin/setup-knock-wg.sh
/usr/local/bin/setup-knock-wg.sh

Obtienes en salida la secuencia para usar del lado cliente. Guárdala en Bitwarden / 1Password / KeePass — es un secreto igual que tu clave SSH.

Validación: probar que funciona

1. Desde fuera (tu laptop, no el VPS) — verificar que 51820 está cerrado:

nmap -sU -p 51820 tu-ip-vps
# PORT      STATE    SERVICE
# 51820/udp filtered (o closed) — sin respuesta

2. Aún desde fuera — knock + intento WireGuard:

knock tu-ip-vps 7203 4581 6217
sleep 2
wg-quick up wg0
wg show wg0   # debe mostrar un handshake

3. Lado servidor — verificar el log:

journalctl -u knockd | tail -20
# Debe mostrar: openWireGuard: Stage 3 OK
#               openWireGuard: OPEN SESAME
#               openWireGuard: running command

4. Verificar que tras el cmd_timeout, el firewall se cierra:

# En el servidor, esperar 60s después:
iptables -L INPUT -n | grep 51820
# Sin regla para tu IP. Sesión WireGuard sigue activa gracias al conntrack.

Casos de uso típicos

1. Self-host para uno mismo, harto del ruido Shodan. Setup perfecto: 5 minutos de config, ya no estás en Shodan, tus logs son limpios. Ningún cambio del lado cliente WireGuard móvil (solo un knock antes de cada conexión).

2. Self-host para algunos usuarios avanzados. Distribuye a cada user una secuencia one-time. Cada uno tiene su secuencia individual. Si hay fuga, revocas esa secuencia sin impacto en las demás.

3. Setup multi-VPS resilientes. Cada VPS Contabo tiene su propia secuencia aleatoria. El cliente tiene una lista de fallback: si VPS1 no responde (knock fallido o IP down), hace knock al VPS2, etc.

4. Honeypot invertido. Acoplado con psad o crowdsec, las IPs que escanean tus puertos knock inválidamente terminan en una lista negra comunitaria. Te conviertes en un sensor de threat intel.

Límites y alternativas

Port knocking no es mágico:

  • Si alguien tiene acceso pasivo a tu tráfico LAN (proxy de empresa que MITM TLS), puede ver los knocks y replicarlos.
  • Si tu cliente móvil está en una red cell donde el operador logea todo, idem.
  • Si tu VPS es un poco lento, el seq_timeout = 15s puede ser demasiado corto en 3G en borde de cobertura.

Alternativas a considerar:

NecesidadSolución
Ocultar endpoint VPN de los escaneosPort knocking (esta guía)
Ocultar Y resistir al sniffingCloak (ver nuestra guía)
Bypass DPI nacional (GFW, etc.)V2Ray + REALITY (ver nuestra guía)
Autenticación criptográfica fuerte únicamenteWireGuard puro, peering OK
Setup pro multi-usuariosXray-core + dashboards x-ui

Port knocking es complementario, no sustituto. Puedes apilar: port knocking + Cloak + WireGuard, y tienes un setup casi invisible. A costa de una complejidad operativa aumentada.

Cuándo una VPN comercial es más simple

Si no quieres gestionar knockd + fail2ban + UFW + WireGuard, una VPN comercial te ahorra eso. NordVPN no te da el control de bajo nivel, pero sus servidores son compartidos (dilución natural de los escaneos). No eres el objetivo identificable.

Muchos de nuestros lectores combinan: self-host con port knocking para uso diario (rendimiento máx, IP fija), VPN comercial como backup de viaje (sin mantenimiento).

Para profundizar

Fuentes técnicas:


Artículo publicado el 2026-06-03. Setup probado sobre VPS Contabo VPS S Núremberg + clientes residenciales Europa, marzo-abril 2026. Port knocking es una capa defensiva complementaria, no una bala de plata — combina siempre con auth WireGuard fuerte y fail2ban.

Recordatorio legal: port knocking y WireGuard self-host son perfectamente legales en la UE, EE.UU., Canadá. Verificar las regulaciones locales antes de desplegar en jurisdicciones sensibles. VPNSmith publica esta guía con fines educativos.

★ Datacenter Nuremberg GDPR · ✓ IPv4 dédiée incluse · 200+ Mbps garantis

Probar Contabo30 jours satisfait ou remboursé