15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
30.10.2024

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

  1. Entendiendo Puertos y Sus Tipos
  2. Verificando Puertos con netstat
  3. Verificando Puertos con ss
  4. Comparando netstat vs. ss
  5. Otras Herramientas para Verificar Puertos Abiertos
  6. Mejores Prácticas de Seguridad para la Gestión de Puertos Abiertos
  7. 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

RangoCategoríaDescripción
0–1023Puertos Bien ConocidosReservados para servicios de sistema estándar (HTTP, SSH, FTP, etc.)
1024–49151Puertos RegistradosUtilizados por aplicaciones y middleware (MySQL, PostgreSQL, etc.)
49152–65535Puertos Dinámicos/EfímerosAsignados 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 -y

CentOS / RHEL / AlmaLinux / Rocky Linux:

sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -y

Arch Linux:

sudo pacman -S net-tools

Sintaxis Básica de netstat

sudo netstat [options]

Verificando Todos los Puertos TCP y UDP en Escucha

sudo netstat -tuln

Desglose de banderas:

BanderaSignificado
-tMostrar conexiones TCP y puertos
-uMostrar conexiones UDP y puertos
-lMostrar solo sockets en escucha (puertos esperando conexiones)
-nMostrar 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.0 significa que el servicio escucha en todas las interfaces disponibles; 127.0.0.1 significa 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 -tulnp

Salida 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 -tunp

Mostrando Tabla de Enrutamiento

sudo netstat -r

Mostrando Estadísticas de Interfaz de Red

sudo netstat -i

3. 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 -tuln

Las banderas tienen el mismo significado que en netstat:

BanderaSignificado
-tMostrar sockets TCP
-uMostrar sockets UDP
-lMostrar solo sockets en escucha
-nMostrar 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 -tulnp

Salida 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 -tl

Mostrar solo puertos UDP en escucha:

ss -ul

Mostrar todas las conexiones TCP (incluyendo establecidas):

ss -t

Filtrado 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 = :22

Filtrar por puerto de destino:

ss -tuln dport = :3306

Mostrar todos los sockets en estado ESTABLISHED:

ss -t state established

Mostrar todos los sockets en estado LISTEN:

ss -t state listening

Filtrar por dirección IP de origen:

ss -tuln src 192.168.1.100

Mostrar conexiones a un host remoto específico:

ss -t dst 203.0.113.50

Combinar 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 -tm

Mostrando Información de Temporizador

ss -to

Esto 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ísticanetstatss
Paquetenet-tools (a menudo no preinstalado)iproute2 (preinstalado en distros modernas)
VelocidadMás lento (lee desde /proc/net/)Más rápido (usa interfaz kernel Netlink)
Rendimiento a escalaSe degrada con miles de conexionesManeja eficientemente grandes cantidades de conexiones
Filtrado avanzadoRequiere piping a grepFiltrado basado en expresiones integrado
Detalle de salidaBuenoMás detallado (memoria, temporizadores, etc.)
Soporte IPv6AdecuadoExcelente
Estado de mantenimientoDeprecadaActivamente mantenida
Curva de aprendizajeFamiliar para administradores de larga trayectoriaSintaxis ligeramente diferente pero bien documentada

Cuándo Usar netstat

  • Al administrar sistemas Linux más antiguos (CentOS 6, Debian 7, etc.) donde ss puede 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 -y

Verificar qué proceso está usando el puerto 80:

sudo lsof -i :80

Verificar qué proceso está usando el puerto 443:

sudo lsof -i :443

Listar todas las conexiones de red:

sudo lsof -i

Listar todos los sockets TCP en escucha:

sudo lsof -i TCP -s TCP:LISTEN

Salida 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 -y

Escanear todos los puertos TCP en localhost:

sudo nmap -sT localhost

Escanear puertos abiertos con detección de SO:

sudo nmap -sT -O localhost

Escanear un rango de puertos específico:

sudo nmap -p 1-1024 localhost

Escanear puertos UDP (requiere root):

sudo nmap -sU localhost

Escanear 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/udp

Ten 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.1

Usa 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 22

Audita 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).txt

Asegura 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

TareaComando netstatComando ss
Todos los puertos TCP/UDP en escuchasudo netstat -tulnsudo ss -tuln
Todos los puertos en escucha con PIDs###PPT_NOTR
15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar