Ghost AcademySecLearn// Seguridad Informática
🛡️ Seguridad · Port scan detection
PortSentry
// Detección y bloqueo automático de escaneos de puertos

Herramienta de seguridad que monitoriza puertos cerrados y bloquea automáticamente a los atacantes mediante reglas de iptables cuando detecta un escaneo.

Port scan detection Auto-blacklisting iptables / nftables Ubuntu / Debian atcp · audp modes
🖥️ Atacante
Nmap scan
→
🔍 Puertos
cerrados
→
🛡️ PortSentry
detecta
→
⛔ iptables
KILL_ROUTE
→
💀 DROP
Host seems down
Modo avanzado
atcp · audp
Detecta barridos de puertos secuenciales y aleatorios
Acción de bloqueo
iptables DROP
Descarta todo el tráfico del atacante silenciosamente
Archivo principal
portsentry.conf
/etc/portsentry/portsentry.conf
Resultado
Host seems down
Nmap reporta el host como inactivo — bloqueo silencioso efectivo
1
Instalación
PortSentry está en los repositorios por defecto de Ubuntu
1
Actualizar el índice de paquetes
bash
sudo apt update
2
Instalar PortSentry
bash
sudo apt install portsentry
image1.png

// Instalación de PortSentry con apt install

2
Modo de Operación
Cambiar de modo silencioso a modo de detección activa

Por defecto, PortSentry se instala en modo "Silent" (silencioso) — monitoriza pero no bloquea. Para activar el bloqueo automático hay que cambiar al modo avanzado en el archivo de configuración de default.

1
Editar el archivo de configuración de default
bash
sudo nano /etc/default/portsentry
2
Cambiar TCP_MODE y UDP_MODE al modo avanzado
VariableOriginalNuevo (detección de barrido)
TCP_MODETCP_MODE="tcp"→TCP_MODE="atcp"
UDP_MODEUDP_MODE="udp"→UDP_MODE="audp"
/etc/default/portsentry
TCP_MODE="atcp"
UDP_MODE="audp"
Guarda con Ctrl+X → Y → Enter
ℹ️ Diferencia entre modos: Los modos tcp/udp básicos escuchan conexiones individuales. Los modos atcp/audp (Advanced) detectan también barridos de puertos secuenciales y aleatorios, lo que hace que sean mucho más efectivos contra Nmap.
3
Detección y Bloqueo
Configurar portsentry.conf para definir puertos y acciones
1
Editar el archivo de configuración principal
bash
sudo nano /etc/portsentry/portsentry.conf

Puertos a escuchar (opcional)

Por defecto, PortSentry escucha los puertos bajos comunes. Puedes modificar las variables TCP_PORTS y UDP_PORTS (líneas 54 y 62), pero la configuración por defecto suele ser suficiente.

image2.png

// Variables TCP_PORTS y UDP_PORTS en portsentry.conf

Habilitar el bloqueo — KILL_ROUTE

Busca la línea de la variable KILL_ROUTE (alrededor de la línea 242) y descomenta la línea que usa /sbin/iptables. En Ubuntu 24.04 usa la ruta que devuelve which iptables.

/etc/portsentry/portsentry.conf — línea ~242
# KILL_ROUTE="/sbin/route add -host $TARGET$ reject"   # Dejar comentado

# KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"   # Opción antigua

KILL_ROUTE="/usr/sbin/iptables -I INPUT -s $TARGET$ -j DROP"   # Descomentar esta
💡 Ruta correcta: Usa which iptables en tu sistema para confirmar la ruta exacta del binario. En Ubuntu 24.04 suele ser /usr/sbin/iptables.
bash — verificar ruta
which iptables   # → /usr/sbin/iptables
image3.png

// KILL_ROUTE configurado con la ruta de iptables

Activar BLOCK_TCP y BLOCK_UDP

Busca las variables BLOCK_UDP y BLOCK_TCP (alrededor de la línea 320) y cámbialas a "1" para activar el bloqueo automático.

/etc/portsentry/portsentry.conf — línea ~320
BLOCK_UDP="1"
BLOCK_TCP="1"
image4.png

// BLOCK_UDP y BLOCK_TCP configurados a 1

Lista Blanca — portsentry.ignore

Si tienes IPs de administradores o sistemas de monitorización que escanean puertos legítimamente, añádelos a la lista blanca para evitar que sean bloqueados por error.

1
Editar el archivo de lista blanca
bash
sudo nano /etc/portsentry/portsentry.ignore
2
Añadir IPs al final del archivo, una por línea
/etc/portsentry/portsentry.ignore
127.0.0.1
192.168.1.50   # IP del administrador
⚠️ Importante: Incluye siempre 127.0.0.1 (loopback) en la lista blanca para evitar que el propio servidor se bloquee a sí mismo.
4
Iniciar el Servicio
Aplicar la configuración y habilitar el inicio automático
1
Reiniciar PortSentry para aplicar los cambios
bash
sudo systemctl restart portsentry
2
Verificar que está activo
bash
sudo systemctl status portsentry
Debe mostrar: active (running)
3
Habilitar el inicio automático con el sistema
bash
sudo systemctl enable portsentry
5
Prueba con Nmap
Verificar que PortSentry detecta y bloquea el escaneo

Desde otra máquina en la red (ej. Kali), lanza un escaneo TCP a los puertos cerrados del servidor Ubuntu:

bash — desde Kali
nmap -sT -p 1-1000 192.168.1.45

Si PortSentry funciona, la IP atacante se añade automáticamente a las reglas de iptables y el host "desaparece" de la red para esa IP.

bash — verificar reglas de bloqueo
sudo systemctl status portsentry
sudo iptables -L INPUT
image5.png

// Resultado de iptables -L INPUT mostrando regla DROP para la IP atacante

Resultado Nmap
Host seems down
Nmap reportó el host como inactivo — el bloqueo DROP funciona
Tiempo del escaneo
~1.49 segundos
Extremadamente rápido para 1000 puertos — DROP inmediato
ℹ️ ¿Por qué "Host seems down"? Cuando PortSentry añade la regla DROP, el servidor deja de responder absolutamente nada a la IP atacante — ni paquetes de eco, ni RST. Nmap interpreta la ausencia total de respuesta como un host inactivo o un firewall silencioso. Es el comportamiento esperado y correcto.
6
iptables vs nftables en Ubuntu 24.04
Por qué la regla puede no aparecer en iptables -L INPUT
⚠️ Conflicto de compatibilidad iptables/nftables

En Ubuntu 24.04 (y versiones recientes), las herramientas tradicionales de iptables están en realidad en modo compatibilidad y redirigen a nftables (el framework de firewalling moderno).

PortSentry puede estar añadiendo la regla DROP correctamente en el backend de nftables a través de esta capa de compatibilidad, pero el comando sudo iptables -L INPUT no siempre refleja la configuración de manera inmediata cuando hay una capa de abstracción.

Conclusión: La ausencia de la regla en iptables -L INPUT no significa que el bloqueo no funcione. El test real es si el ping a la IP del servidor falla desde la máquina atacante.

7
Verificar el Bloqueo
Confirmar que PortSentry actuó correctamente con ping

La forma más fiable de confirmar el bloqueo — sin depender de iptables -L INPUT — es comprobar la conectividad ICMP desde la máquina atacante:

1
Lanzar un ping desde Kali al servidor Ubuntu (IP bloqueada)
bash — desde Kali
ping 192.168.1.44   # IP del servidor Ubuntu

Si el bloqueo funciona: el ping falla (paquetes perdidos / timeout) — la regla DROP bloquea también el tráfico ICMP.

image6.png

// Ping fallido desde Kali — regla DROP aplicada correctamente

2
Comprobar conectividad a otra IP no bloqueada
bash — desde Kali
ping 192.168.1.1   # IP del router u otro host de la red

Este ping debe funcionar, confirmando que Kali tiene conectividad normal — solo está bloqueada hacia la IP del servidor.

image7.png

// Ping exitoso a otra IP — Kali tiene conectividad, solo Ubuntu bloqueó la IP de Kali

✅ Interpretación del resultado: Si el ping a Ubuntu (192.168.1.44) falla pero el ping a otras IPs funciona, significa que PortSentry ejecutó el bloqueo correctamente, incluso si no lo ves en iptables -L INPUT. El servidor Ubuntu simplemente ignora todo el tráfico proveniente de la IP de Kali.
🔴 Recuerda desbloquear después del test: La regla DROP persiste hasta que se limpien manualmente las reglas de iptables o se reinicie el servicio. Para eliminar reglas de bloqueo de prueba:

sudo iptables -D INPUT -s <IP_KALI> -j DROP
o bien:
sudo iptables -F INPUT (elimina todas las reglas de INPUT)