Cómo ocultar los puertos de red con una secuencia de golpeo de puertos en Debian 10

El golpeo de puertos es un método para abrir dinámicamente los puertos de red «golpeando» (es decir, conectándose) en una secuencia predefinida de puertos. Esto es especialmente útil para ocultar un puerto de red abierto del escaneo de puertos, ya que el puerto en cuestión se cerrará a menos que se ejecute la secuencia de golpeo de puertos. Una secuencia de golpeo de puertos lo suficientemente larga es prácticamente imposible de forzar: por ejemplo, para adivinar con éxito (por fuerza bruta) una combinación de 3 puertos TCP, un atacante tendría que intentar golpear en cada una de las 281 trillones de combinaciones posibles, y escanear los puertos abiertos después de cada secuencia de golpeo de puertos. Como probablemente puedas imaginar, esto llevaría mucho, mucho tiempo.

Esta guía te ayudará a instalar knockd, un demonio flexible para tocar puertos, en Debian 10. Para fines de demostración, lo configuraremos para oscurecer el puerto SSH, aunque cualquier otro puerto/servicio puede protegerse con este enfoque.

Requisitos

  • Un servidor con Debian 10.
  • Acceso root a tu servidor.
  • La variable de entorno $EDITOR debe estar activada.
  • Un segundo sistema para hacer pruebas.

NOTA: Si tienes intención de utilizar el bloqueo de puertos para ocultar el puerto SSH, asegúrate de que tienes un método de acceso alternativo (a través de la consola, por ejemplo), que te será útil si te bloqueas accidentalmente.

Antes de instalar knockd, comprueba el nombre de la interfaz de red pública de tu sistema con el siguiente comando:

ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

Anota el nombre de la interfaz(ens18 en este caso). Lo necesitarás más adelante.

Paso 1: Instalación de Knockd

knockd es un demonio de bloqueo de puertos que escucha las conexiones y abre los puertos correspondientes. Utilizaremos knockd con reglas iptables para implementar el bloqueo de puertos. Instala los paquetes necesarios como se indica a continuación:

apt update
apt install knockd iptables-persistent

Paso 2: Configuración de Knockd

Knockd emplea un único archivo de configuración, /etc/knockd.conf, para definir las secuencias de golpeo y otros parámetros. Existen dos modos prácticos de funcionamiento. El primero requiere una única secuencia de golpeo para abrir y cerrar el puerto predefinido, mientras que el otro utiliza secuencias de apertura y cierre separadas. Nosotros utilizaremos el primero, ya que requiere menos interacción del usuario.

Primero, haz una copia de seguridad del archivo de configuración existente:

mv /etc/knockd.conf /etc/knockd.conf.bak

En segundo lugar, abre el archivo de configuración en tu editor de texto:

$EDITOR /etc/knockd.conf

E introduce la configuración que se muestra a continuación:

(sustituye ens18 por el nombre de tu interfaz de red).

[options]
        UseSyslog
	Interface = ens18
[SSH]
        sequence = 1000,2000,3000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout = 20

Esto indicará a knockd que habilite el tráfico al puerto 22 después de recibir la secuencia correcta de golpes (1000,2000,3000 en este caso), y que vuelva a deshabilitar el tráfico después de un retraso de 20 segundos. Así, las conexiones SSH sólo se aceptarán durante esta ventana de 20 segundos.

A continuación, activa knockd editando el archivo /etc/default/knockd:

$EDITOR /etc/default/knockd

Y establece START_KNOCKD en 1:

START_KNOCKD=1

Guarda el archivo y sal. También modificaremos la unidad systemd para knockd. Para ello, crea un nuevo archivo de unidad para anular el predeterminado:

$EDITOR /etc/systemd/system/knockd.service

Y pega lo siguiente:

[Unit]
Description=Port-Knock Daemon
After=network.target
Requires=network.target
Documentation=man:knockd(1)
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStartPre=/usr/bin/sleep 1
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target

A continuación, utiliza el siguiente comando para cargar y habilitar la nueva unidad:

systemctl daemon-reload
systemctl enable --now knockd.service

Paso 3: Reglas del cortafuegos

En este punto, Knockd está listo, pero todo el tráfico está habilitado a través del cortafuegos por defecto. Crearemos reglas de cortafuegos para denegar el acceso al puerto 22/tcp.

Los siguientes comandos garantizan que no se interrumpan las conexiones existentes.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Las siguientes son las reglas para eliminar las conexiones al puerto 22/tcp:

iptables -A INPUT -p tcp --destination-port 22 -j DROP
ip6tables -A INPUT -p tcp --destination-port 22 -j DROP

A continuación, guarda las cadenas de reglas actuales para que persistan entre los reinicios:

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Paso 4: Prueba

Desde otro sistema, intenta iniciar una nueva sesión SSH con tu servidor. No deberías poder conectarte. Para realizar la secuencia de golpeo, se pueden utilizar diferentes herramientas, aunque nosotros haremos la demostración con knock, el cliente de golpeo incluido en Knockd. Instala el paquete knockd, como se indica en el Paso 1, en otro sistema y ejecuta los comandos:

knock server_ip_address 1000 2000 3000
ssh username@server_ip_address

Ahora la conexión SSH debería tener éxito.

Configuración alternativa

Knockd puede configurarse alternativamente para que requiera dos secuencias distintas para abrir y cerrar los puertos de red. Esto es útil si quieres mantener los puertos abiertos durante largos periodos de tiempo. Para configurar Knockd de esta manera, abre su archivo de configuración:

$EDITOR /etc/knockd.conf

Y sustituye la configuración existente por la siguiente:

[options]
        UseSyslog
        Interface = your_interface
[openSSH]
        sequence = 1000,2000,3000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
        sequence = 3000,2000,1000
        seq_timeout = 15
        tcpflags = syn
        start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Luego reinicia el servicio para cargar la nueva configuración:

systemctl restart knockd.service

Conclusión

Knockd puede ser una solución eficaz a los ataques de fuerza bruta, que son muy comunes en SSH y otros servicios. Aunque systemd reiniciará Knockd si falla, siempre debes tener un método de respaldo para acceder a tu servidor si utilizas port-knocking para ocultar el puerto SSH.

También te podría gustar...