Verificación de Puertos Abiertos y en Escucha en Linux Usando netstat y ss
Monitorear puertos abiertos y en escucha en un sistema Linux es una de las prácticas más críticas para mantener la seguridad del servidor, diagnosticar problemas de red y gestionar tu infraestructura de manera efectiva. Al auditar regularmente qué puertos están abiertos y qué servicios están vinculados a ellos, puedes identificar proactivamente intentos de acceso no autorizados, detectar configuraciones incorrectas y eliminar superficies de ataque innecesarias antes de que se conviertan en vulnerabilidades graves.
Ya sea que estés ejecutando una aplicación de alto tráfico en un plan de VPS Hosting o administrando una flota de máquinas bare-metal, entender la exposición de red de tu servidor Linux es innegociable. Esta guía proporciona un recorrido técnicamente preciso y completo sobre cómo usar tanto netstat como ss — las dos herramientas de línea de comandos más utilizadas para inspección de puertos en Linux — junto con herramientas complementarias y mejores prácticas del mundo real.
Tabla de Contenidos
- Entendiendo Puertos y Sus Tipos
- Verificando Puertos con netstat
- Verificando Puertos con ss
- Comparando netstat vs. ss
- Otras Herramientas para Verificar Puertos Abiertos
- Mejores Prácticas de Seguridad para la Gestión de Puertos Abiertos
- Conclusión
1. Entendiendo Puertos y Sus Tipos {#understanding-ports}
Antes de profundizar en las herramientas en sí, es importante establecer una comprensión clara de qué son los puertos, cómo se categorizan y por qué es importante monitorearlos.
¿Qué es un Puerto de Red?
Un puerto de red es un punto final de comunicación lógico asociado con un proceso o servicio específico en un host. Los puertos permiten que un único servidor con una dirección IP ejecute múltiples servicios en red simultáneamente — por ejemplo, un servidor web en el puerto 80, un daemon SSH en el puerto 22 y una base de datos en el puerto 3306.
Categorías de Puertos
| Rango | Categoría | Descripción |
|---|---|---|
| 0–1023 | Puertos Bien Conocidos | Reservados para servicios de sistema estándar (HTTP, SSH, FTP, etc.) |
| 1024–49151 | Puertos Registrados | Utilizados por aplicaciones y middleware (MySQL, PostgreSQL, etc.) |
| 49152–65535 | Puertos Dinámicos/Efímeros | Asignados temporalmente para conexiones de cliente salientes |
Estados de Puerto que Encontrarás
- LISTEN — El puerto está abierto y un servicio está esperando activamente conexiones entrantes.
- ESTABLISHED — Existe una conexión activa entre dos puntos finales.
- TIME_WAIT — La conexión se está cerrando; el sistema está esperando para asegurar que el extremo remoto recibió el reconocimiento final.
- CLOSE_WAIT — El extremo remoto ha cerrado la conexión; la aplicación local aún no ha cerrado su lado.
Protocolos de Transporte
- TCP (Protocolo de Control de Transmisión): Orientado a la conexión, confiable, con verificación de errores y entrega garantizada. Utilizado por HTTP, HTTPS, SSH, FTP y la mayoría de protocolos de capa de aplicación.
- UDP (Protocolo de Datagramas de Usuario): Sin conexión, más rápido, pero sin garantías de entrega. Utilizado por DNS, NTP, DHCP y servicios de transmisión.
2. Verificando Puertos con netstat {#netstat}
¿Qué es netstat?
netstat (estadísticas de red) es una utilidad clásica de línea de comandos que muestra conexiones de red activas, tablas de enrutamiento, estadísticas de interfaz y puertos en escucha. Aunque ha sido oficialmente deprecada a favor de ss en distribuciones Linux modernas, netstat sigue siendo ampliamente utilizada — especialmente en sistemas heredados y en entornos donde los administradores están profundamente familiarizados con su sintaxis.
Instalando netstat
netstat es parte del paquete net-tools, que ya no se instala por defecto en muchas distribuciones modernas. Instálalo de la siguiente manera:
Debian / Ubuntu:
sudo apt update && sudo apt install net-tools -yCentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -yArch Linux:
sudo pacman -S net-toolsSintaxis Básica de netstat
sudo netstat [options]Verificando Todos los Puertos TCP y UDP en Escucha
sudo netstat -tulnDesglose de banderas:
| Bandera | Significado |
|---|---|
-t | Mostrar conexiones TCP y puertos |
-u | Mostrar conexiones UDP y puertos |
-l | Mostrar solo sockets en escucha (puertos esperando conexiones) |
-n | Mostrar direcciones IP y números de puerto numéricos (omitir resolución DNS para velocidad) |
Salida de ejemplo:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp6 0 0 :::443 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*Leyendo la salida:
- Proto — El protocolo en uso (tcp, udp, tcp6, udp6).
- Local Address — La dirección IP y número de puerto en el que el servicio está en escucha.
0.0.0.0significa que el servicio escucha en todas las interfaces disponibles;127.0.0.1significa que solo es accesible localmente. - Foreign Address — La dirección del cliente remoto (mostrada como
0.0.0.0:*para puertos en escucha sin conexión activa). - State — El estado de la conexión (
LISTEN,ESTABLISHED,TIME_WAIT, etc.).
Incluyendo Información de Procesos
Para ver qué proceso es propietario de cada puerto en escucha, añade la bandera -p:
sudo netstat -tulnpSalida de ejemplo con información de proceso:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2847/nginx
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3102/mysqld> Nota: Debes ejecutar este comando con sudo para ver nombres de procesos para todos los usuarios, no solo los tuyos.
Filtrando Salida para Puertos o Servicios Específicos
Usa grep para reducir los resultados a un puerto o servicio específico:
# Check if anything is listening on port 80
sudo netstat -tuln | grep ":80"
# Check for SSH (port 22)
sudo netstat -tuln | grep ":22"
# Check for MySQL (port 3306)
sudo netstat -tuln | grep ":3306"
# Check for HTTPS (port 443)
sudo netstat -tuln | grep ":443"Viendo Todas las Conexiones Activas (No Solo en Escucha)
Para ver todas las conexiones activas, incluyendo las establecidas, elimina la bandera -l:
sudo netstat -tunpMostrando Tabla de Enrutamiento
sudo netstat -rMostrando Estadísticas de Interfaz de Red
sudo netstat -i3. Verificando Puertos con ss {#ss}
¿Qué es ss?
ss (estadísticas de socket) es el reemplazo moderno para netstat, desarrollado como parte del paquete iproute2. Se comunica directamente con el kernel de Linux a través de sockets Netlink, lo que lo hace significativamente más rápido y eficiente que netstat — particularmente en sistemas con miles de conexiones concurrentes.
ss se instala por defecto en prácticamente todas las distribuciones Linux modernas, incluyendo Ubuntu 18.04+, CentOS 7+, Debian 9+ y sus derivados.
Sintaxis Básica de ss
ss [options] [filter]Verificando Todos los Puertos TCP y UDP en Escucha
ss -tulnLas banderas tienen el mismo significado que en netstat:
| Bandera | Significado |
|---|---|
-t | Mostrar sockets TCP |
-u | Mostrar sockets UDP |
-l | Mostrar solo sockets en escucha |
-n | Mostrar direcciones numéricas (sin resolución DNS) |
Salida de ejemplo:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 511 [::]:443 [::]:*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*Incluyendo Información de Procesos
sudo ss -tulnpSalida de ejemplo:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1023,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2847,fd=6))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3102,fd=21))Filtrando por Protocolo
Mostrar solo puertos TCP en escucha:
ss -tlMostrar solo puertos UDP en escucha:
ss -ulMostrar todas las conexiones TCP (incluyendo establecidas):
ss -tFiltrado Avanzado con ss
Una de las características más poderosas de ss es su filtrado basado en expresiones integrado, que te permite filtrar por puerto, dirección, estado y más — sin depender de grep.
Filtrar por número de puerto específico:
ss -tuln sport = :80
ss -tuln sport = :443
ss -tuln sport = :22Filtrar por puerto de destino:
ss -tuln dport = :3306Mostrar todos los sockets en estado ESTABLISHED:
ss -t state establishedMostrar todos los sockets en estado LISTEN:
ss -t state listeningFiltrar por dirección IP de origen:
ss -tuln src 192.168.1.100Mostrar conexiones a un host remoto específico:
ss -t dst 203.0.113.50Combinar múltiples filtros:
ss -t state established '( dport = :443 or sport = :443 )'Mostrando Uso de Memoria de Socket
ss también puede mostrar uso detallado de memoria por socket, lo que es útil para diagnosticar problemas de rendimiento:
ss -tmMostrando Información de Temporizador
ss -toEsto muestra temporizadores de retransmisión y temporizadores de keepalive para conexiones TCP, lo que es invaluable para diagnosticar problemas de estabilidad de conexión.
4. Comparando netstat vs. ss {#comparison}
Ambas herramientas logran el mismo objetivo fundamental, pero hay diferencias significativas que deben guiar tu elección:
| Característica | netstat | ss |
|---|---|---|
| Paquete | net-tools (a menudo no preinstalado) | iproute2 (preinstalado en distros modernas) |
| Velocidad | Más lento (lee desde /proc/net/) | Más rápido (usa interfaz kernel Netlink) |
| Rendimiento a escala | Se degrada con miles de conexiones | Maneja eficientemente grandes cantidades de conexiones |
| Filtrado avanzado | Requiere piping a grep | Filtrado basado en expresiones integrado |
| Detalle de salida | Bueno | Más detallado (memoria, temporizadores, etc.) |
| Soporte IPv6 | Adecuado | Excelente |
| Estado de mantenimiento | Deprecada | Activamente mantenida |
| Curva de aprendizaje | Familiar para administradores de larga trayectoria | Sintaxis ligeramente diferente pero bien documentada |
Cuándo Usar netstat
- Al administrar sistemas Linux más antiguos (CentOS 6, Debian 7, etc.) donde
sspuede no estar disponible. - Cuando trabajas con scripts o documentación que ya usan sintaxis de
netstat. - Cuando estés más cómodo con su formato de salida y no necesites filtrado avanzado.
Cuándo Usar ss
- En cualquier distribución Linux moderna (Ubuntu 18.04+, CentOS 7+, Debian 9+ y más nuevas).
- Al administrar servidores con un alto volumen de conexiones concurrentes — como aquellos ejecutándose en Servidores Dedicados bajo carga pesada.
- Cuando necesites filtrado avanzado, información de temporizador o estadísticas de memoria de socket.
- Para automatización y scripting donde el rendimiento importa.
5. Otras Herramientas para Verificar Puertos Abiertos {#other-tools}
Más allá de netstat y ss, varias otras utilidades son útiles para inspección de puertos y análisis de red en Linux.
lsof — Listar Archivos Abiertos (Incluyendo Sockets)
lsof (Listar Archivos Abiertos) trata los sockets de red como archivos (consistente con la filosofía de Linux de “todo es un archivo”) y puede mostrar qué proceso tiene abierto un puerto específico.
Instalar lsof:
# Debian/Ubuntu
sudo apt install lsof -y
# CentOS/RHEL
sudo yum install lsof -yVerificar qué proceso está usando el puerto 80:
sudo lsof -i :80Verificar qué proceso está usando el puerto 443:
sudo lsof -i :443Listar todas las conexiones de red:
sudo lsof -iListar todos los sockets TCP en escucha:
sudo lsof -i TCP -s TCP:LISTENSalida de ejemplo:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2847 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
nginx 2848 www-data 6u IPv4 23456 0t0 TCP *:http (LISTEN)nmap — Network Mapper
nmap es una herramienta poderosa de escaneo de red utilizada para auditoría de seguridad, descubrimiento de red y escaneo de puertos. A diferencia de ss y netstat (que inspeccionan el sistema local), nmap puede escanear hosts locales y remotos.
Instalar nmap:
# Debian/Ubuntu
sudo apt install nmap -y
# CentOS/RHEL
sudo yum install nmap -yEscanear todos los puertos TCP en localhost:
sudo nmap -sT localhostEscanear puertos abiertos con detección de SO:
sudo nmap -sT -O localhostEscanear un rango de puertos específico:
sudo nmap -p 1-1024 localhostEscanear puertos UDP (requiere root):
sudo nmap -sU localhostEscanear un servidor remoto:
sudo nmap -sT 203.0.113.50> Importante: Solo escanea sistemas que poseas o para los que tengas permiso explícito de escanear. El escaneo de puertos no autorizado puede violar leyes y términos de servicio.
fuser — Identificar Procesos Usando Archivos o Sockets
# Find which process is using port 80 (TCP)
sudo fuser 80/tcp
# Find which process is using port 53 (UDP)
sudo fuser 53/udp/proc/net/ — Interfaz Directa del Kernel
Para propósitos de scripting, puedes leer información de puertos directamente desde el sistema de archivos virtual del kernel de Linux:
# View raw TCP socket table
cat /proc/net/tcp
# View raw UDP socket table
cat /proc/net/udpTen en cuenta que las direcciones y puertos en /proc/net/tcp se muestran en hexadecimal y requieren conversión para legibilidad humana. Herramientas como ss y netstat analizan estos datos automáticamente.
6. Mejores Prácticas de Seguridad para la Gestión de Puertos Abiertos {#security}
Saber cómo verificar puertos abiertos es solo la mitad de la batalla. Actuar sobre esa información es lo que mantiene tu servidor seguro. Aquí hay mejores prácticas accionables que todo administrador de Linux debe seguir:
Principio de Menor Exposición
Solo expone puertos que sean absolutamente necesarios para que tu aplicación funcione. Cada puerto abierto es un vector de ataque potencial. Audita regularmente tus puertos en escucha y cierra o coloca en firewall cualquier cosa que no necesite ser públicamente accesible.
Vincula Servicios a Interfaces Específicas
Evita vincular servicios a 0.0.0.0 (todas las interfaces) a menos que sea requerido. Por ejemplo, un servidor de base de datos MySQL solo debe escuchar en 127.0.0.1 si solo se accede localmente:
# In /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1Usa un Firewall
Usa ufw (Ubuntu) o firewalld / iptables (CentOS/RHEL) para restringir el acceso a puertos abiertos por dirección IP, subred o interfaz de red:
# Allow SSH only from a specific IP (ufw)
sudo ufw allow from 203.0.113.10 to any port 22
# Deny all other access to port 22
sudo ufw deny 22Audita Regularmente Puertos en Escucha
Programa auditorías regulares de puertos usando trabajos cron o herramientas de monitoreo. Un nuevo puerto en escucha repentino puede indicar un servicio comprometido, una configuración incorrecta, o — en el peor de los casos — malware:
# Quick audit command — save output and compare over time
sudo ss -tulnp > /var/log/port_audit_$(date +%F).txtAsegura Servicios con SSL/TLS
Cualquier servicio expuesto a internet — servidores web, servidores de correo, paneles de control — debe usar conexiones encriptadas. Empareja tus puertos abiertos con Certificados SSL válidos para proteger datos en tránsito y prevenir ataques de intermediario.
Monitorea Cambios Inesperados
Usa herramientas de detección de intrusiones como AIDE, Tripwire o auditd para alertarte cuando nuevos procesos comiencen a escuchar en puertos. Integra con logging centralizado (p. ej., ELK Stack, Graylog) para visibilidad integral.
Deshabilita Servicios Innecesarios
Si un servicio no es necesario, detenlo y deshabilítalo para que no se inicie al arrancar:
# Stop and disable a service (systemd)
sudo systemctl stop <service-name>
sudo systemctl disable <service-name>Referencia Rápida: Comandos Más Útiles
| Tarea | Comando netstat | Comando ss |
|---|---|---|
| Todos los puertos TCP/UDP en escucha | sudo netstat -tuln | sudo ss -tuln |
| Todos los puertos en escucha con PIDs | ###PPT_NOTR |
