← Volver al blog

Guía

Rangos de puertos explicados: cuáles puedes usar y cuáles no deberías

14 de septiembre de 20264 min de lectura

Hay 65.536 números de puerto, y no son todos iguales. IANA los divide en tres rangos, y el sistema operativo trata a uno de ellos distinto. Saber cuál es cuál explica un par de errores que de otro modo parecen aleatorios.

Los tres rangos

0 a 1023, los puertos bien conocidos. Reservados para servicios estándar. El 22 es SSH, el 80 es HTTP, el 443 es HTTPS, el 53 es DNS. Estos necesitan root para ocuparse en macOS y en cualquier Unix.

1024 a 49151, los puertos registrados. Las organizaciones pueden registrar un puerto para un servicio específico, así el 3306 quedó como MySQL, el 5432 como PostgreSQL y el 6379 como Redis. Nada de esto se impone técnicamente. Es una convención que evita que todos choquen, no una regla que aplique el kernel.

49152 a 65535, los puertos dinámicos o efímeros. No están asignados a nada. Es el pozo del que el sistema saca cuando un programa necesita un puerto temporal, que en general significa conexiones salientes.

En macOS puedes ver el rango efímero que el kernel usa de verdad:

sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
# net.inet.ip.portrange.first: 49152
# net.inet.ip.portrange.last: 65535

Por qué ocupar el puerto 80 falla

Inténtalo como usuario normal y te sale:

PermissionError: [Errno 13] Permission denied

No hay nada mal configurado. Los puertos bajo 1024 son privilegiados, y solo root puede ocuparlos. El razonamiento original era de confianza: si cualquiera pudiera escuchar en el 80, cualquier usuario de una máquina compartida podría hacerse pasar por el servidor web al que todos se conectan.

La mayoría se topa con esto al intentar correr un servidor de desarrollo en el 80 para no escribir el puerto. Las opciones son usar sudo, que no deberías hacer a la ligera con un servidor de desarrollo, poner algo adelante que ya tenga el permiso, o aceptar un puerto alto. La tercera es la razón por la que todos los frameworks usan puertos altos por defecto.

De dónde salen los puertos típicos de desarrollo

Los has visto lo suficiente como para reconocerlos de inmediato:

Puerto Quién lo ocupa normalmente
3000 Node, Rails, Next.js, Create React App
4200 Angular
5000 Flask, y el receptor de AirPlay en macOS
5173 Vite
5432 PostgreSQL
6379 Redis
8000 Django, el http.server de Python
8069 Odoo
8080 Tomcat, y el puerto HTTP alternativo tradicional

Todos cómodamente sobre 1024, y todos por convención. Nada te impide correr Postgres en el 7777.

La trampa propia de macOS: el puerto 5000

Esta pilla gente seguido. En macOS moderno, el receptor de AirPlay escucha en el puerto 5000 por defecto. Si levantas una app de Flask en el 5000 y falla, o se comporta raro, el sistema operativo llegó primero.

Puedes apagar el receptor de AirPlay en Ajustes del Sistema, en General, o simplemente usar otro puerto. El puerto 7000 ha tenido conflictos parecidos, y por eso Bosun excluye el 5000 y el 7000 de su rango monitoreado por defecto.

Cómo elegir puerto para tu propio servicio

Unas reglas prácticas.

Quédate sobre 1024 salvo que tengas una razón real, así nunca necesitas sudo.

Evita el rango efímero, de 49152 hacia arriba. Si atas un servicio fijo ahí, el sistema podría haberle entregado ya ese puerto a una conexión saliente, y obtienes un conflicto intermitente que es horrible de reproducir.

Eso te deja aproximadamente de 1024 a 49151, que es de sobra. Elige algo memorable que no sea ya famoso.

Ver qué rangos están en uso ahora mismo

lsof -i -P -n -sTCP:LISTEN

Normalmente vas a encontrar unas pocas cosas bajo 1024 en manos de procesos del sistema, tus propios servidores en los miles bajos, y quizás algunas entradas de números altos de Docker u otras herramientas que asignan dinámicamente.

Si un puerto que esperabas libre no lo está, el conflicto casi siempre es otra instancia de tu propio servicio. Escribimos sobre cómo arreglar eso en el puerto 3000 en particular.

Bosun monitorea un rango configurable, 3000 a 9999 por defecto, y muestra quién es dueño de cada puerto sin el comando. macOS 14 o posterior, prueba de 14 días.

Ve esto en vez de escribirlo

Bosun vive en tu barra de menú y muestra cada puerto abierto en tu Mac, en vivo, mapeado al proceso detrás. Un clic para matarlo, SIGTERM primero. Útil la primera vez que pasa esto. Realmente útil la quinta vez que pasa en una misma tarde.