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.