Al trabajar con redes en Linux, puede ser necesario abrir o cerrar un puerto de red. La gestión de puertos es esencial para la seguridad: cuantos menos puertos abiertos tenga un sistema, menos vectores de ataque potenciales existen. Además, si un puerto está cerrado, un atacante no puede recopilar información sobre el servicio que se ejecuta en ese puerto específico.
Esta guía explica cómo abrir o cerrar puertos y cómo comprobar los puertos abiertos en distribuciones de Linux como Ubuntu/Debian y CentOS/RHEL utilizando cortafuegos como ufw, firewalld e iptables.
Demostraremos este proceso en dos distribuciones Linux: Ubuntu 22.04 y CentOS 9, ejecutadas en un VPS de Hostman. Todos los comandos proporcionados aquí funcionarán en cualquier distribución basada en Debian o RHEL.
Los puertos se utilizan para acceder a aplicaciones y protocolos específicos. Por ejemplo, un servidor puede alojar tanto un servidor web como una base de datos — los puertos dirigen el tráfico al servicio adecuado. Técnicamente, un puerto de red es un número entero no negativo que va de 0 a 65535.
Puertos reservados (0–1023): utilizados por protocolos y servicios de red populares como SSH (puerto 22), FTP (puerto 21), HTTP (puerto 80) y HTTPS (puerto 443).
Puertos registrados (1024–49151): pueden ser utilizados por aplicaciones específicas para comunicarse.
En sistemas basados en Debian (Ubuntu, Debian, Linux Mint, etc.), puedes usar ufw (Uncomplicated Firewall).
ufw viene preinstalado en la mayoría de las distribuciones basadas en APT. Para verificar si está instalado:
ufw version
Si se muestra una versión, ufw está instalado. De lo contrario, instálalo con:
apt update && apt -y install ufw
Por defecto, ufw está inactivo, lo que significa que todos los puertos están abiertos. Puedes verificar su estado con:
ufw status
Para activarlo:
ufw enable
Deberás confirmar con y. Ten en cuenta que habilitar ufw puede interrumpir las conexiones SSH actuales. Por defecto, ufw bloquea todo el tráfico entrante y permite todo el tráfico saliente.
Para comprobar la política por defecto:
cat /etc/default/ufw
Para abrir un puerto:
ufw allow <port_number>
Ejemplo — abrir el puerto 22 para SSH:
ufw allow 22
Puedes abrir varios puertos separándolos con comas y especificando el protocolo (tcp o udp):
ufw allow 80,443,8081,8443/tcp
ufw allow 80,443,8081,8443/udp
En lugar de números de puerto, puedes usar el nombre del servicio (definido en /etc/services).
Ejemplo — abrir Telnet (puerto 23):
ufw allow telnet
Nota: No puedes especificar varios nombres de servicios a la vez; ufw devolverá un error:
Para abrir un rango de puertos:
ufw allow <start_port>:<end_port>/<protocol>
Ejemplo:
ufw allow 8000:8080/tcp
Para cerrar un puerto:
ufw deny <port_number>
Ejemplo — cerrar el puerto 80:
ufw deny 80
También puedes usar el nombre del servicio. Ejemplo — cerrar FTP (puerto 21):
ufw deny ftp
Para listar todos los puertos abiertos y cerrados:
ufw status
O para una vista más detallada:
ufw status verbose
Las distribuciones basadas en RHEL (CentOS 7+, RHEL 7+, Fedora 18+, OpenSUSE 15+) usan firewalld por defecto.
Verifica si firewalld está instalado:
firewall-offline-cmd -V
Si se muestra una versión, firewalld está instalado. Si no, instálalo:
dnf install firewalld
Por defecto, firewalld está deshabilitado. Verifica su estado:
firewall-cmd --state
Para habilitarlo:
systemctl start firewalld
Abrir el puerto 8080 para TCP:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
--zone=public
: especifica la zona de la regla.--add-port=8080/tcp
: especifica el puerto y el protocolo.--permanent
: guarda la regla de forma permanente.También puedes abrir un servicio utilizando su nombre, por ejemplo HTTP (puerto 80):
firewall-cmd --zone=public --add-service=http --permanent
Aplicar los cambios:
firewall-cmd --reload
Para cerrar un puerto por número:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
O por nombre del servicio:
firewall-cmd --zone=public --remove-service=http --permanent
Recarga siempre después de los cambios:
firewall-cmd --reload
Para listar todos los puertos abiertos:
firewall-cmd --list-ports
A diferencia de ufw y firewalld, iptables viene preinstalado en muchas distribuciones (Ubuntu, Debian, RHEL, Rocky Linux, AlmaLinux).
Para abrir el puerto 8182 para conexiones entrantes:
iptables -A INPUT -p tcp --dport 8182 -j ACCEPT
-A INPUT
: agrega una regla a la cadena INPUT.-p tcp
: especifica el protocolo.--dport 8182
: especifica el puerto a abrir.-j ACCEPT
: permite el tráfico a través del puerto.Para conexiones salientes:
iptables -A OUTPUT -p tcp --dport 8182 -j ACCEPT
Para abrir un rango de puertos:
iptables -A INPUT -p tcp --match multiport --dports 1024:2000 -j ACCEPT
Para cerrar un puerto:
iptables -A INPUT -p tcp --dport 8182 -j DROP
Cerrar un rango de puertos:
iptables -A INPUT -p tcp --match multiport --dports 1024:2000 -j DROP
Por defecto, las reglas de iptables solo son efectivas hasta que se reinicie el servidor. Para guardarlas permanentemente, instala iptables-persistent:
Para sistemas basados en APT:
apt update && apt -y install iptables-persistent
Para sistemas basados en DNF:
dnf -y install iptables-persistent
Guardar las reglas actuales:
iptables-save
Las reglas se recargarán automáticamente tras el siguiente reinicio.
Listar todas las reglas y puertos abiertos:
iptables -L -v -n
Listar solo reglas IPv4:
iptables -S
Listar reglas IPv6:
ip6tables -S
En esta guía hemos mostrado cómo abrir y cerrar puertos de red en Linux y cómo comprobar los puertos abiertos actualmente utilizando tres herramientas diferentes: ufw, firewalld e iptables. Una gestión adecuada de los puertos reduce el riesgo de posibles ataques a la red y ayuda a ocultar información sobre los servicios que utilizan esos puertos.