Qué es un puerto y cómo ver servicios en Linux
Aprende qué es un puerto y cómo identificar servicios activos en Linux usando el comando ss. Diferencia entre puertos TCP y UDP y rangos de privilegios.
Qué es realmente un puerto
Un puerto es un número que permite que un servidor ejecute muchos servicios a la vez sin que su tráfico se mezcle. Su VPS tiene una única dirección IP, pero puede ejecutar un servidor web, un servidor SSH y una base de datos simultáneamente. Cuando llega un paquete, el sistema operativo debe saber a cuál de ellos pertenece. El número de puerto es la respuesta. El tráfico web va al puerto 443; el SSH al puerto 22. La dirección IP lleva el paquete hasta su servidor; el puerto lo lleva al programa correcto dentro de ese servidor.
Un puerto es un número de 16 bits: 16 bits permiten valores de 0 a 65535. El 0 está reservado, por lo que en la práctica los puertos van del 1 al 65535. Los puertos por debajo de 1024 son los puertos "well-known" y requieren privilegios root para abrirse; por eso los servicios estándar residen allí: 22 para SSH, 80 para HTTP, 443 para HTTPS, 53 para DNS. Cualquier número por encima de 1024 está disponible para programas ordinarios.
Existen dos tipos, TCP y UDP, y el número de puerto en uno es independiente del mismo número en el otro. TCP es el protocolo basado en conexión que utilizan la mayoría de los servicios, como SSH, HTTP y bases de datos. UDP no tiene conexión y se utiliza para elementos como DNS y algunas VPN. Al configurar un firewall, normalmente se especifica cuál de ellos, por ejemplo 22/tcp.
Listening significa que un programa está esperando en un puerto
Un programa que desea recibir conexiones solicita al kernel "escuchar" (listen) en un puerto. A partir de ese momento, el puerto queda abierto en la máquina y el programa responde a cualquier cosa que llegue allí, sujeto a las reglas del firewall. Un puerto sin ningún proceso escuchando simplemente rechaza las conexiones. Por tanto, la primera pregunta en cualquier auditoría de seguridad es: qué está escuchando y dónde.
El comando para responder a eso es ss:
sudo ss -tlnpLos flags significan: TCP (t), solo sockets en escucha (l), puertos numéricos (n, para ver 22 en lugar de ssh), y el proceso propietario (p). Un resultado típico:
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxLa columna Process indica qué programa es el propietario de cada puerto, lo cual permite rastrear algo que no se pretendía dejar ejecutándose.
La columna Local Address es la parte importante
Lea con atención la dirección delante de cada puerto, ya que determina quién puede acceder al servicio. Verá tres casos constantemente.
0.0.0.0:22 significa "escuchar en todas las direcciones IPv4 que tenga esta máquina", incluida la pública. El servicio es accesible desde internet mediante IPv4, si el firewall lo permite.
[::]:80 significa lo mismo para IPv6: escuchar en todas las direcciones IPv6, incluida la pública. Muchos programas se vinculan (bind) aquí por defecto, y en Linux un socket :: a menudo acepta también IPv4.
127.0.0.1:5432 significa "escuchar solo en loopback". 127.0.0.1 es la dirección que una máquina utiliza para comunicarse consigo misma y no es enrutable desde ningún otro lugar. Un servicio vinculado aquí solo es accesible desde el mismo servidor, nunca desde internet, independientemente de la configuración del firewall. La línea de Postgres mencionada arriba es segura por diseño.
La regla práctica se deriva de esto: una base de datos, una caché o un panel de administración que solo utilicen sus propias aplicaciones debe vincularse a 127.0.0.1, no a 0.0.0.0. Si nunca escucha en una dirección pública, no hay nada que un atacante pueda alcanzar.
Listening no es lo mismo que ser alcanzable
Otra distinción evita mucha confusión. Que un puerto esté abierto en la máquina (es decir, que un programa esté escuchando) es distinto a que ese puerto sea alcanzable desde el exterior (es decir, que el firewall lo permita). Ambos deben ser ciertos para que un cliente remoto pueda conectarse.
Existen dos capas de control. Usted decide qué escucha, configurando la dirección de vinculación (bind address) de cada servicio. Y usted decide qué puede alcanzar el mundo exterior, mediante un firewall. Un servidor bien administrado utiliza ambos: los servicios se vinculan solo donde es necesario, y un firewall deniega todo lo que no se haya permitido explícitamente. Leer qué está escuchando con ss es el primer paso; decidir qué permite el firewall es el segundo, tratado en firewalls 101 con UFW.
Hay un detalle sutil que causa errores. IPv4 e IPv6 son independientes, y un firewall que solo cubra IPv4 deja los servicios [::] abiertos en IPv6. Ese error específico tiene su propio artículo: la trampa del firewall IPv6.
FAQ
¿Cómo veo qué puertos están abiertos en mi servidor Linux?
Ejecute sudo ss -tlnp para TCP o sudo ss -ulnp para UDP. Eso listará cada socket en escucha, el puerto, la dirección local a la que está vinculado y el proceso propietario. Lea la columna Local Address: 0.0.0.0 o [::] significa que el servicio está expuesto a la red, mientras que 127.0.0.1 significa que escucha solo en la propia máquina.
¿Cuál es la diferencia entre 0.0.0.0 y 127.0.0.1?
0.0.0.0 significa "escuchar en todas las direcciones IPv4", incluida la pública, por lo que el servicio puede ser alcanzado desde la red. 127.0.0.1 es loopback, la dirección que la máquina usa para hablar consigo misma; no es enrutable desde ningún otro lugar, por lo que un servicio vinculado a ella solo es accesible localmente. Vincule los servicios internos a 127.0.0.1 para que nunca queden expuestos.
¿Necesito abrir un puerto en el firewall para que un servicio funcione?
Solo para los servicios que deben ser alcanzados desde otras máquinas. Un servicio vinculado a 127.0.0.1 no necesita reglas de firewall porque nada externo puede alcanzarlo de todos modos. Un servicio en 0.0.0.0 o [::] necesita una regla de firewall para permitir el tráfico, y debe denegarse por defecto hasta que se añada una regla.
¿Cuál es la diferencia entre un puerto TCP y un puerto UDP?
TCP se basa en la conexión y lo utilizan la mayoría de los servicios, como SSH, servidores web y bases de datos. UDP no tiene conexión y lo utilizan DNS y algunas VPN. El mismo número en TCP y UDP son puertos distintos, por lo que 53/tcp y 53/udp son diferentes. Al escribir reglas de firewall, debe especificar el protocolo, por ejemplo 22/tcp.