Cómo verificar puertos en Ubuntu: Guía completa de comandos y seguridad

1. Introducción

En la gestión de redes y la administración de servidores, es fundamental conocer con precisión el estado de los puertos. Especialmente al utilizar Ubuntu, comprobar los puertos abiertos y los procesos en uso permite reforzar la seguridad y realizar la resolución de problemas de manera más rápida. En este artículo se explica en detalle cómo usar los comandos y herramientas básicos para verificar puertos en Ubuntu. Está dirigido a principiantes e intermedios, ofreciendo pasos prácticos y fáciles de seguir.

2. ¿Qué es un puerto?

2.1 Concepto básico de los puertos

Un puerto es una interfaz de comunicación virtual que permite a los ordenadores y dispositivos de red enviar y recibir datos. En concreto, cuando varias aplicaciones se comunican al mismo tiempo en una misma dirección IP, los puertos ayudan a identificar y distribuir correctamente la información de cada aplicación. Por ejemplo, un servidor web utiliza el puerto 80 para manejar la comunicación HTTP. Si el mismo servidor permite conexiones SSH, utiliza el puerto 22. De esta forma, cada servicio se diferencia por su número de puerto, lo que hace imprescindible verificar su estado en la gestión de redes.

2.2 Tipos y funciones de los puertos

Los puertos se dividen en tres categorías principales:
  1. Puertos bien conocidos (0–1023)
  • Son números de puerto estandarizados a nivel mundial, asignados a servicios ampliamente utilizados.
    • Ejemplos:
    • HTTP: 80
    • HTTPS: 443
    • SSH: 22
  1. Puertos registrados (1024–49151)
  • Asignados a aplicaciones o empresas específicas.
    • Ejemplos:
    • MySQL: 3306
    • PostgreSQL: 5432
  1. Puertos dinámicos (49152–65535)
  • Se utilizan temporalmente por aplicaciones, muy comunes en las comunicaciones del lado cliente.
Comprender esta clasificación ayuda a identificar el propósito de cada número de puerto.

3. Cómo verificar puertos en Ubuntu

En Ubuntu, se pueden utilizar varias herramientas para comprobar el estado de los puertos. Aquí se explican cuatro comandos especialmente prácticos.

3.1 Uso del comando ss

El comando ss es una potente herramienta de gestión de red en sistemas Linux. Es rápido y ofrece información detallada de las conexiones. Comando básico:
sudo ss -ltn
Explicación de opciones:
  • -l: muestra solo los puertos en estado de escucha (listening).
  • -t: muestra solo el protocolo TCP.
  • -n: muestra direcciones y números de puerto en formato numérico.
Ejemplo de salida:
State       Recv-Q Send-Q      Local Address:Port        Peer Address:Port  
LISTEN      0      128              0.0.0.0:22               0.0.0.0:*

3.2 Uso del comando netstat

El comando netstat ha sido utilizado durante mucho tiempo para la gestión de red. Aunque está siendo reemplazado por ss, todavía está disponible en muchos sistemas. Comando básico:
sudo netstat -ltn
Ejemplo de salida:
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

3.3 Uso del comando lsof

El comando lsof es útil para identificar qué procesos están utilizando un puerto específico. Verificación de un puerto en particular:
sudo lsof -i :80
Ejemplo de salida:
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234  www    4u   IPv4  12345 0t0      TCP *:http (LISTEN)

3.4 Uso del comando nmap

nmap es una herramienta especializada en el escaneo de redes, utilizada también en auditorías de seguridad. Escaneo del localhost:
sudo nmap localhost
Ejemplo de salida:
Starting Nmap 7.80 ( https://nmap.org ) at 2024-12-21 18:00 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
Puntos clave:
  • Muestra una lista de puertos abiertos y sus servicios asociados.
  • También permite escanear servidores externos, aunque se debe contar con autorización previa.

4. Verificación de la configuración del firewall

En Ubuntu es común utilizar un firewall para reforzar la seguridad. En particular, ufw (Uncomplicated Firewall) es una herramienta sencilla y potente ampliamente usada. En esta sección se explica cómo comprobar el estado de los puertos con ufw y cómo modificar la configuración según sea necesario.

4.1 Comprobar el estado de ufw

Comando para verificar el estado del firewall:
sudo ufw status verbose
Ejemplo de salida:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
Explicación:
  • Status: active: indica que el firewall está habilitado.
  • Logging: on: el registro de actividad está habilitado.
  • Default: deny (incoming), allow (outgoing): bloquea conexiones entrantes por defecto, permite salientes.
  • ALLOW: muestra qué puertos o servicios están permitidos (ejemplo: SSH y HTTP).
Punto clave: Si el firewall está deshabilitado (Status: inactive), se puede habilitar con:
sudo ufw enable

4.2 Permitir o bloquear puertos

Permitir un puerto:
sudo ufw allow 22/tcp
  • Permite conexiones TCP al puerto 22 (SSH).
Bloquear un puerto:
sudo ufw deny 80/tcp
  • Bloquea el acceso al puerto 80 (HTTP).
Permitir solo una IP específica:
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp
  • Permite conexiones SSH solo desde la IP 192.168.1.100.

4.3 Restablecer y revisar la configuración

Si se necesita reiniciar la configuración, ejecute:
sudo ufw reset
Este comando borra todas las reglas y restaura la configuración por defecto. Después de aplicar cambios, siempre revise las reglas de nuevo.

5. Ejemplo práctico: Verificación del estado de un puerto específico

Aquí se explica el procedimiento utilizando como ejemplo el estado del puerto SSH (22).

5.1 Verificar el estado del puerto

Ejemplo de comando:
sudo ss -ltn | grep ':22'
Ejemplo de salida:
LISTEN      0      128        0.0.0.0:22            0.0.0.0:*
Puntos clave:
  • Si aparece LISTEN, significa que el puerto está en espera de conexiones.
  • 0.0.0.0 indica que acepta conexiones desde todas las direcciones IP.

5.2 Verificar procesos

Ejemplo de comando:
sudo lsof -i :22
Ejemplo de salida:
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1234  root   3u   IPv4  56789 0t0      TCP *:ssh (LISTEN)
Puntos clave:
  • sshd es el proceso demonio que gestiona las conexiones SSH.
  • Verificar el PID (ID del proceso) permite detenerlo o reiniciarlo si es necesario.
Ejemplo de detener proceso:
sudo kill 1234

5.3 Ejemplo de resolución de problemas

Problema: El puerto no está abierto o no se puede establecer conexión. Pasos de solución:
  1. Verificar la configuración del firewall.
sudo ufw status verbose
  1. Si el puerto está bloqueado, añadir una regla para permitirlo.
sudo ufw allow 22/tcp
  1. Comprobar el estado del servicio y reiniciarlo si es necesario.
sudo systemctl restart ssh

6. Puertos y seguridad

La gestión de puertos está directamente relacionada con la seguridad de la red. A continuación, se explican las recomendaciones principales.

6.1 Cerrar puertos innecesarios

Es importante cerrar los puertos que no se utilizan para reducir el riesgo de ataques. Ejemplo: cerrar el puerto 80
sudo ufw deny 80/tcp

6.2 Medidas contra escaneo de puertos

El escaneo de puertos es una técnica utilizada por atacantes para detectar vulnerabilidades. Las medidas de protección más eficaces incluyen:
  1. Fortalecer las reglas del firewall:
sudo ufw default deny incoming
  1. Monitorear registros:
sudo tail -f /var/log/ufw.log
  1. Usar herramientas de detección:
  2. Por ejemplo, fail2ban puede bloquear automáticamente intentos de acceso sospechosos.

7. Conclusión

En este artículo se han explicado los pasos concretos para verificar puertos en Ubuntu, el uso de comandos específicos y la gestión del firewall con ufw, además de medidas de seguridad.

7.1 Resumen de puntos clave

  • Conceptos básicos y tipos de puertos: son las entradas y salidas de comunicación, divididos en puertos bien conocidos, registrados y dinámicos.
  • Uso de comandos para verificación: ss, netstat, lsof y nmap permiten comprobar el estado de puertos y procesos.
  • Gestión del firewall: con ufw se pueden permitir o bloquear puertos para reforzar la seguridad.
  • Importancia de la seguridad: cerrar puertos innecesarios, monitorear registros e implementar herramientas contra ataques son pasos fundamentales.

7.2 Aplicación futura

La gestión de puertos es la base de la seguridad de red. Aplica lo aprendido en este artículo para mantener un servidor seguro y bien administrado.

FAQ: Preguntas frecuentes sobre la verificación de puertos en Ubuntu

Q1. ¿Qué hacer si un puerto no está abierto en Ubuntu?

A: Si un puerto no está abierto, pruebe los siguientes pasos:
  1. Verificar la configuración del firewall:
sudo ufw status verbose
Si el firewall bloquea el puerto, permita el acceso con:
sudo ufw allow [número_de_puerto]/tcp
  1. Comprobar si el servicio está en ejecución:
sudo systemctl status [nombre_servicio]
Ejemplo: para SSH:
sudo systemctl status ssh
Si es necesario, reinicie el servicio:
sudo systemctl restart [nombre_servicio]
  1. Verificar el archivo de configuración del servicio:
  2. Asegúrese de que use el puerto correcto (ejemplo para SSH: /etc/ssh/sshd_config).

Q2. ¿Cuál es la diferencia entre ss y netstat?

A: Ambos muestran conexiones de red, pero tienen diferencias:
  • ss: herramienta moderna recomendada en sistemas Linux actuales. Es rápida y ofrece información detallada. Ejemplo: sudo ss -ltn
  • netstat: herramienta clásica que está quedando obsoleta. Se utiliza en sistemas más antiguos por compatibilidad. Ejemplo: sudo netstat -ltn
En sistemas nuevos se recomienda usar ss.

Q3. ¿Cómo detectar un escaneo de puertos?

A: Existen varias formas de hacerlo:
  1. Revisar los registros del firewall:
sudo tail -f /var/log/ufw.log
Busque intentos frecuentes de conexión sospechosos.
  1. Usar herramientas IDS/IPS:
  • Por ejemplo, fail2ban o Snort bloquean automáticamente accesos maliciosos.
  1. Escanear su propio servidor con nmap:
sudo nmap localhost
Cierre los puertos innecesarios que aparezcan abiertos.

Q4. ¿Cómo verificar qué proceso utiliza un puerto específico?

A: Use el comando lsof:
sudo lsof -i :[número_de_puerto]
Ejemplo: para el puerto 80:
sudo lsof -i :80
Ejemplo de salida:
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234  www    4u   IPv4  12345 0t0      TCP *:http (LISTEN)

Q5. ¿Cómo permitir solo una dirección IP con ufw?

A: Ejecute:
sudo ufw allow from [dirección_IP] to any port [número_de_puerto] proto tcp
Ejemplo: permitir SSH desde 192.168.1.100:
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp

Q6. ¿Cómo cambiar el número de un puerto?

A: Edite el archivo de configuración del servicio. Ejemplo para SSH:
  1. Editar el archivo:
sudo nano /etc/ssh/sshd_config
  1. Buscar la línea Port y asignar un nuevo número:
Port 2222
  1. Reiniciar el servicio:
sudo systemctl restart ssh
  1. Permitir el nuevo puerto en el firewall:
sudo ufw allow 2222/tcp

Q7. ¿Es posible permitir varios puertos a la vez?

A: Sí, se puede hacer de dos formas:
  1. Permitir un rango de puertos:
sudo ufw allow 1000:2000/tcp
Explicación: permite el rango de puertos del 1000 al 2000.
  1. Permitir puertos individuales:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
年収訴求