Ir al contenido

Puertos, TCP y UDP: a qué puerta llamas

La IP te lleva hasta un equipo, pero en ese equipo puede haber una web, un servidor SSH, una base de datos y un servidor de correo a la vez. ¿Cómo sabe el equipo a cuál de ellos va cada paquete? Por el puerto.

Si la IP es la dirección del edificio, el puerto es el número de la puerta. Y la forma de llamar a esa puerta depende del protocolo: TCP o UDP.

Un puerto es un número del 0 al 65535 que identifica a un servicio dentro de un equipo. Cuando un programa quiere recibir conexiones, se pone a escuchar en un puerto: el servidor web en el 443, el SSH en el 22…

La combinación completa que identifica a cada conexión es:

protocolo + IP origen + puerto origen + IP destino + puerto destino
TCP 192.168.1.20 51000 203.0.113.45 443

A cada extremo (IP + puerto) se le llama socket. Gracias a esto puedes tener veinte pestañas abiertas contra la misma web: todas van al mismo destino, pero cada una sale de un puerto de origen distinto.

Rango Nombre Para qué
0 – 1023 Bien conocidos (well-known) Servicios estándar: HTTP, SSH, DNS… En Linux hace falta ser root para escuchar en ellos
1024 – 49151 Registrados Aplicaciones concretas: bases de datos, paneles, juegos…
49152 – 65535 Dinámicos o efímeros Los que usa tu equipo como origen al conectarse a algo. En Linux, por defecto, del 32768 al 60999

TCP (Transmission Control Protocol) es el protocolo fiable. Antes de mandar nada establece una conexión, numera cada segmento, espera confirmación de que ha llegado y, si se pierde algo, lo vuelve a enviar. Además, entrega los datos en orden.

La conexión se abre con el famoso saludo en tres pasos (three-way handshake):

Cliente Servidor (puerto 443)
│ 1. SYN "¿Hablamos?" │
│ ────────────────────────────────────► │
│ 2. SYN-ACK "Vale, hablamos" │
│ ◄──────────────────────────────────── │
│ 3. ACK "Perfecto, empiezo" │
│ ────────────────────────────────────► │
│ ... datos con confirmaciones ...│
│ FIN / ACK "Cierro" │
│ ◄───────────────────────────────────► │

Para qué se usa → todo lo que no puede perder ni un byte: webs (HTTP/HTTPS), SSH, correo, transferencias de archivos, bases de datos.

El precio → más cabeceras, más idas y venidas y algo más de latencia.

UDP (User Datagram Protocol) es lo contrario: no establece conexión, no confirma nada y no reenvía nada. Manda el datagrama y ya está. Si se pierde, se pierde.

¿Y eso para qué sirve? Para todo lo que prefiere rapidez antes que perfección:

  1. DNS → una pregunta y una respuesta cortas. Si no llega, se vuelve a preguntar y listo.
  2. Voz y videollamadas → mejor perder un trocito de audio que oírlo con un segundo de retraso.
  3. Streaming en directo y juegos online → lo que importa es lo que pasa ahora, no lo que pasó hace medio segundo.
  4. VPN modernas como WireGuard → el control de errores ya lo hace el tráfico que va dentro del túnel.
  5. HTTP/3 (QUIC) → las webs modernas también van por UDP, en el 443, y la fiabilidad la implementan ellas mismas.
TCP UDP
Conexión Sí (handshake) No
Fiabilidad Confirma y reenvía Ninguna
Orden Garantizado No garantizado
Velocidad Más lento Más rápido
Ejemplos HTTPS, SSH, SMTP, SMB DNS, DHCP, VoIP, WireGuard, QUIC
Puerto Protocolo Servicio
22 TCP SSH
25 / 587 TCP SMTP (envío de correo)
53 UDP y TCP DNS
67 / 68 UDP DHCP (servidor / cliente)
80 TCP HTTP
123 UDP NTP (hora)
443 TCP y UDP HTTPS (y HTTP/3 por UDP)
445 TCP SMB (carpetas compartidas de Windows)
3306 TCP MySQL / MariaDB
3389 TCP RDP (escritorio remoto de Windows)
5432 TCP PostgreSQL
8006 TCP Panel web de Proxmox
8080 / 8443 TCP HTTP / HTTPS alternativos (paneles, proxies)
51820 UDP WireGuard

No hace falta aprendérselos de memoria. Con el tiempo, los que usas se quedan solos.

Cuando compruebas un puerto desde fuera, hay tres respuestas posibles:

  1. Abierto → hay un servicio escuchando y responde. En TCP, contesta al SYN con un SYN-ACK.
  2. Cerrado → llega al equipo, pero no hay nada escuchando. En TCP responde con un RST, que viene a ser un “aquí no hay nadie”.
  3. Filtrado → no responde nada. Normalmente es que un firewall ha descartado el paquete por el camino.

Desde el punto de vista de la seguridad, filtrado es lo mejor: el atacante no sabe ni siquiera si hay un equipo ahí.

Desde el propio equipo (lo que está escuchando):

Ventana de terminal
ss -tulpn # Linux: TCP y UDP en escucha, con el proceso
netstat -ano # Windows
Get-NetTCPConnection -State Listen # Windows, PowerShell

Desde otro equipo (lo que se ve desde la red):

Ventana de terminal
nc -zv 192.168.1.10 22 # ¿responde el 22?
Test-NetConnection 192.168.1.10 -Port 22 # lo mismo en PowerShell
nmap 192.168.1.10 # los 1000 puertos más comunes
nmap -p- 192.168.1.10 # los 65535

Las técnicas de escaneo (SYN, connect, UDP, NULL/FIN/Xmas…) tienen su propia página en la sección de Ciberseguridad.

En mi red de casa hay muy pocos puertos abiertos, solo los imprescindibles: casi todo lo que publico sale por un túnel que se inicia desde dentro (como Cloudflare Tunnel), así que para publicar algo no hace falta abrir nada en el router. La regla es muy simple: cada puerto abierto tiene que tener un motivo, y si no lo tiene, se cierra.

Y lo de que te escanean no es una exageración. En mi caso particular, tengo montado un pequeño panel que registra lo que llega a mi servidor expuesto a internet, y en cuanto un servicio queda accesible empiezan a llegar escáneres probando puertos y rutas típicas. No es que alguien “vaya a por ti”: es que todo internet se escanea constantemente, de forma automática, las 24 horas.

Panel de tráfico hacia mi servidor expuesto en 24 horas Mi panel de tráfico hacia mi servidor expuesto durante 24 horas. Cada punto es un origen; los rojos, IPs marcadas como maliciosas.

  • “Si cambio SSH al puerto 2222 ya estoy seguro” → reduce el ruido de los bots en los registros, pero no es seguridad. Un escaneo de los 65535 puertos lo encuentra en segundos. Lo que protege es usar claves, desactivar el acceso por contraseña y filtrar en el firewall.
  • Abrir un puerto TCP cuando el servicio es UDP (o al revés) → WireGuard es UDP. Si abres el 51820 en TCP, no va a funcionar nunca.
  • Pensar que DNS es solo UDP → las respuestas grandes y las transferencias de zona van por TCP 53. Si lo bloqueas, algunas consultas fallarán.
  • Conflictos de puerto → dos servicios no pueden escuchar en el mismo puerto y la misma IP. Es el clásico “address already in use” al levantar un contenedor que usa el 80 mientras ya hay otro servidor web en el host.
  • Exponer paneles de administración (el 8006 de Proxmox, el 3389 de RDP, una base de datos…) directamente a internet → esos van siempre detrás de una VPN.
  • Puerto → número del 0 al 65535 que identifica el servicio dentro de un equipo. IP + puerto = socket.
  • TCP → con conexión (SYN, SYN-ACK, ACK), fiable y ordenado. Para webs, SSH, correo…
  • UDP → sin conexión, rápido y sin garantías. Para DNS, DHCP, voz, VPN y QUIC.
  • Estado de un puerto → abierto, cerrado (RST) o filtrado (silencio, normalmente un firewall).
  • Comprueba lo que escuchas con ss -tulpn y lo que se ve desde fuera con nmap o nc.

Siguiente: Equipos de red Relacionado: NAT y PAT, DHCP y DNS, Índice de Redes