IP, puertos y sockets: qué son y cómo funcionan
En una frase: La IP dice a qué ordenador va cada paquete, los routers deciden por dónde y el puerto dice a qué programa. Un socket es lo que une las tres cosas.
Lo que vas a aprender
- Distinguir una IP privada de una pública y explicar cómo NAT deja que toda tu casa comparta una sola.
- Entender cómo viaja un paquete de router en router sin que nadie conozca el camino entero.
- Explicar qué es un puerto, por qué la web usa el 80 y el 443 y qué es un socket.
- Averiguar con la terminal qué programas escuchan en tu ordenador y en qué dirección.
Antes de empezar, lee: 04-el-modelo-tcp-ip.md
El problema
Sección titulada «El problema»En la lección anterior viste que la IP de tu portátil se parece a 192.168.1.133 y que es privada. El portátil de tu vecino puede tener la misma, y el de alguien en Tokio, también.
Entonces, cuando example.com te responde, ¿cómo sabe a cuál de todos los 192.168.1.133 del mundo enviar la respuesta? ¿Por dónde la envía, entre miles de redes? Y cuando llega a tu portátil, donde están abiertos el navegador, Spotify y Slack, ¿a qué programa se la entrega?
Son tres preguntas: qué ordenador, por qué camino y qué programa.
La analogía
Sección titulada «La analogía»La analogía
Piensa en un edificio de oficinas con una sola dirección postal y una recepción en la entrada. Dentro, cada despacho tiene un número interno que solo vale dentro del edificio: en el de enfrente también hay un despacho 3, y no pasa nada.
Cuando alguien del despacho 3 envía una carta, recepción cambia el remitente por la dirección del edificio, le añade una referencia, «ref. 61000», y apunta en su libreta: «61000 → despacho 3». Cuando llega la respuesta con esa referencia, recepción mira la libreta y la sube al despacho 3. Desde fuera, nadie sabe que existe un despacho 3. Y dentro de cada despacho, cada persona tiene su buzón.
La dirección del edificio es tu IP pública; el número de despacho, tu IP privada; cada buzón, un puerto; y la recepción con su libreta, tu router. La referencia también es un puerto, el del router.
Dónde falla la analogía
- Recepción tira las cartas cuya referencia no está en la libreta: no puede preguntar «¿para quién es esto?».
- En el edificio, cada buzón es fijo. En la red, solo los servidores usan puertos fijos; un cliente, como tu navegador, estrena uno en cada conversación.
- Con IPv6 hay direcciones de sobra: cada despacho puede tener su propia dirección pública, y recepción no tiene que traducir nada.
Cómo funciona de verdad
Sección titulada «Cómo funciona de verdad»Qué ordenador: las direcciones IP
Sección titulada «Qué ordenador: las direcciones IP»Una (término) Dirección IPEl número que identifica a un ordenador en una red, por ejemplo 192.168.1.133 (IPv4) o 2606:4700:10::6814:179a (IPv6). Es la dirección que usa la capa de red para llevar cada paquete a su destino.Ir a la definición identifica a un ordenador dentro de una red, y hay dos versiones en uso.
IPv4 son cuatro números del 0 al 255 separados por puntos, como 192.168.1.133: 32 bits, que dan para unos 4.300 millones de direcciones. Hoy hay más dispositivos conectados que direcciones: los últimos bloques libres se repartieron en 2011.
Para que alcanzaran, se reservaron unos rangos para uso interno. Las (término) IP privadaUna dirección IP que solo vale dentro de una red local, como 192.168.1.133. Las mismas se repiten en millones de casas, y desde internet no se puede llegar a ellas.Ir a la definición solo valen dentro de su red local, y por eso pueden repetirse en todo el mundo. Una (término) IP públicaUna dirección IP única en todo internet, con la que se puede llegar a un ordenador desde cualquier parte. En casa, normalmente la tiene tu router y la comparten todos tus dispositivos.Ir a la definición, en cambio, es única en todo internet.
| Rango | Qué es |
|---|---|
10.0.0.0 a 10.255.255.255 |
Privado. Redes de empresas y de operadores |
172.16.0.0 a 172.31.255.255 |
Privado. Por ejemplo, la red interna de Docker (Fase 7) |
192.168.0.0 a 192.168.255.255 |
Privado. Casi todas las redes de casa |
127.0.0.0 a 127.255.255.255 |
No es privado: es este mismo ordenador (loopback). La más usada es 127.0.0.1, la de (término) localhostUn nombre que siempre significa «este mismo ordenador». Cuando abres localhost:8080, el cliente y el servidor están en tu máquina.Ir a la definición |
IPv6 son 128 bits: un 34 seguido de 37 ceros, suficientes para que cada dispositivo tenga una dirección pública propia. Se escriben como ocho grupos de cuatro cifras hexadecimales separados por dos puntos, y se acortan quitando los ceros a la izquierda de cada grupo y cambiando, una sola vez, una tira de grupos a cero por ::. La dirección de example.com que viste en la lección anterior, 2606:4700:10::6814:179a, es en realidad 2606:4700:0010:0000:0000:0000:6814:179a. Y ::1 es la versión IPv6 de 127.0.0.1.
Las dos versiones conviven: tu ordenador seguramente tiene al menos una de cada, y curl prueba las dos. En una URL, una IPv6 va entre corchetes para no confundir sus dos puntos con los del puerto: http://[::1]:4321.
Cómo sale tu IP privada a internet: NAT
Sección titulada «Cómo sale tu IP privada a internet: NAT»Si tu IP privada no vale fuera de casa, alguien tiene que cambiarla al salir. Lo hace tu (término) RouterUn aparato que conecta redes distintas y decide hacia dónde reenviar cada paquete según su dirección IP de destino. El de tu casa conecta tu red local con la de tu operador.Ir a la definición, y se llama (término) NATTraducción de direcciones de red (Network Address Translation). Al salir a internet, el router cambia la IP privada de tu dispositivo por su IP pública y apunta el cambio para deshacerlo en las respuestas.Ir a la definición (Network Address Translation, traducción de direcciones de red). Tu router tiene dos direcciones: una privada hacia dentro (192.168.1.1) y una pública hacia fuera, que le asigna tu operador.
Así va y vuelve una petición tuya a example.com:
1Tu portátil → router
- origen
192.168.1.133:54321 - destino
104.20.23.154:80
Tu portátil envía la petición con su IP privada como origen.
2Router → example.com
- origen
203.0.113.7:lo cambia el router61000 - destino
104.20.23.154:80
El router cambia el origen por su IP pública y un puerto libre (a veces, el mismo), y apunta el cambio en su tabla.
3example.com → router
- origen
104.20.23.154:80 - destino
203.0.113.7:61000
El servidor responde a quien cree que le ha escrito: el router.
4Router → tu portátil
- origen
104.20.23.154:80 - destino
192.168.1.133:lo cambia el router54321
El router busca el puerto 61000 en su tabla y devuelve el destino original.
| Fuera (pública) | Dentro (privada) |
|---|---|
203.0.113.7: | 192.168.1.133: |
203.0.113.7: | 192.168.1.140: |
La segunda fila podría ser tu móvil, en el mismo wifi: gracias a los puertos, el router distingue las conversaciones de todos tus dispositivos aunque salgan por la misma IP pública. Normalmente también apunta con quién habla cada uno, y borra la entrada cuando la conversación termina o tras un rato sin tráfico.
La consecuencia importante es que una conversación solo se puede empezar desde dentro. Si alguien de internet envía un (término) PaqueteLa unidad de datos de la capa de red. Lleva la dirección IP de origen y la de destino, y los routers lo van pasando de red en red hasta su destino.Ir a la definición a tu IP pública sin que hayas empezado nada, el router no encuentra su entrada en la tabla, no sabe a quién dárselo y lo tira. «Abrir un puerto» en el router es añadir una entrada fija: «lo que llegue al puerto 8080, mándalo a 192.168.1.133». Por eso los servidores de verdad viven en centros de datos, con IP públicas (Fase 8).
Dos matices:
- Algunos operadores hacen otro NAT en su red (CGNAT, Carrier-Grade NAT): ni siquiera tu router tiene IP pública, y la compartes con otros clientes. Entonces, abrir un puerto en tu router no sirve.
- Con IPv6 no hace falta NAT. Tu portátil tiene su propia IPv6 pública (lo comprobarás en el Pruébalo). Lo que frena las conexiones de fuera que nadie ha pedido es el router, que casi siempre las bloquea por defecto.
Por qué camino: el enrutamiento
Sección titulada «Por qué camino: el enrutamiento»Falta saber por dónde va el paquete. A decidirlo se le llama (término) EnrutamientoCómo decide cada router hacia dónde reenviar un paquete para acercarlo a su destino (en inglés, routing). Ningún router conoce el camino entero, solo el siguiente salto.Ir a la definición (routing), y lo hace cada aparato del camino.
Simplificada, la tabla de rutas de tu portátil es esta:
| Si el destino es… | Lo envía… |
|---|---|
127.0.0.1 o ::1 |
A sí mismo, sin salir del ordenador |
192.168.1.…, su red local |
Directamente, por el wifi |
| Cualquier otra dirección (default) | A 192.168.1.1, su (término) Puerta de enlaceEl router al que tu ordenador envía todo lo que no va a su propia red local (en inglés, gateway). En casa es tu router, por ejemplo 192.168.1.1.Ir a la definición (gateway): el router de casa |
Sabe qué direcciones son de su red local por la máscara (netmask) que viste en la lección anterior: 0xffffff00, o sea 255.255.255.0, significa que las que comparten los tres primeros números, 192.168.1.…, son vecinas.
El router de casa hace lo mismo: lo de tu red, hacia dentro, y lo demás, hacia tu operador. Los routers de internet tienen tablas enormes, con rutas hacia todas las redes, que se cuentan entre ellos con un protocolo llamado BGP.
Lo importante es que ningún router conoce el camino entero. Cada uno solo decide el siguiente salto, como en una autopista: cada cartel te acerca a Madrid, pero ninguno te da la ruta completa.
¿Y si dos routers mal configurados se pasan un paquete para siempre? Para evitarlo, la cabecera IP lleva un contador, el TTL (time to live, nada que ver con el TTL de DNS de la lección 7), que empieza por ejemplo en 64 y al que cada router le resta uno. Si llega a cero, el router tira el paquete y avisa al origen con un mensaje de error. En el Pruébalo usarás esos avisos para ver el camino.
Qué programa: los puertos
Sección titulada «Qué programa: los puertos»Cuando el paquete llega al ordenador, el sistema operativo tiene que entregarlo al programa correcto. Para eso está el (término) PuertoUn número, del 0 al 65535, que indica a qué programa de un ordenador va dirigida una conexión. El ordenador tiene una dirección; cada programa que escucha, su puerto.Ir a la definición: un número del 0 al 65535. La cabecera (término) TCPEl protocolo de la capa de transporte que hace que los datos lleguen completos y en orden, y al programa correcto gracias a los puertos.Ir a la definición (o UDP) lleva el puerto de destino, que dice a qué programa va, y el de origen.
IANA, la organización que los reparte, los divide en tres rangos:
| Rango | Nombre | Ejemplos |
|---|---|---|
| 0 a 1023 | Puertos conocidos (well-known) | 22 (SSH), 53 (DNS), 80 (HTTP), 443 (HTTPS) |
| 1024 a 49151 | Registrados | 5432 (PostgreSQL), 3306 (MySQL). Por costumbre, también los de las herramientas para crear webs: 3000, 5173, 8080 |
| 49152 a 65535 | Dinámicos o efímeros | Los que el sistema operativo elige para los clientes |
Por qué la web usa el 80 y el 443. Es una convención: IANA asignó el 80 a HTTP y el 443 a HTTPS. Si una URL no lleva puerto, el navegador usa el 80 con http:// y el 443 con https://. Por eso https://example.com y https://example.com:443 son la misma dirección, y por eso en la lección 2 escribiste :8080.
Los puertos efímeros. Tu navegador no tiene un puerto fijo. Cuando abre una conexión, el sistema operativo le asigna un puerto libre para esa conversación y lo libera al terminar. macOS los elige entre el 49152 y el 65535, y Linux, por defecto, entre el 32768 y el 60999.
Lo que une las tres cosas: los sockets
Sección titulada «Lo que une las tres cosas: los sockets»Un programa no fabrica paquetes IP. Le pide al sistema operativo un (término) SocketLo que el sistema operativo le da a un programa para usar la red, con su protocolo, su dirección IP y su puerto. Un servidor escucha con un socket, y cada conversación tiene un socket en cada extremo, que conoce también la IP y el puerto del otro.Ir a la definición (en inglés, «enchufe»): un extremo de comunicación con su protocolo, su dirección IP y su puerto. Si está conectado, también conoce la IP y el puerto del otro extremo.
Un socket se usa de dos formas:
- Para escuchar. El servidor pide un socket, lo asocia a un puerto (bind) y se pone a escuchar (listen), como
nc -l 8080en la lección 2. Cuando llega un cliente, el sistema operativo crea un socket nuevo para esa conversación, y el que escucha sigue esperando. - Para conectarse. El cliente pide un socket y lo conecta a la IP y el puerto del servidor. El sistema operativo le pone tu IP y un puerto efímero.
Una conexión TCP queda identificada por cuatro valores: la IP y el puerto de origen, y la IP y el puerto de destino. Por eso un servidor puede atender a miles de clientes a la vez en el mismo puerto 443: cada conversación se distingue por la IP o el puerto del cliente.
En qué dirección escucha un servidor. Al asociar el socket, el servidor elige también la IP, y eso decide quién puede conectarse:
| Escucha en | Quién puede conectarse |
|---|---|
127.0.0.1 |
Solo los programas de tu ordenador, por IPv4 |
::1 |
Solo los programas de tu ordenador, por IPv6 |
0.0.0.0 |
Cualquiera que llegue a alguna IPv4 de tu ordenador, también desde tu red |
:: |
Cualquiera que llegue a alguna de tus IP, por IPv6 y normalmente también por IPv4 |
Aquí está la respuesta a lo que viste en la lección 2. localhost es un nombre que apunta a dos direcciones, ::1 y 127.0.0.1, y en macOS nc -l 8080 escucha solo en IPv4. Así que curl probó primero ::1, no encontró a nadie («Connection refused») y después probó 127.0.0.1, donde sí estaba nc.
Pruébalo
Sección titulada «Pruébalo»Primero, tus dos direcciones IP:
1. Tu IP privada y tu IP pública
ipconfig getifaddr en0curl -4 icanhazip.comcurl -6 icanhazip.comLo que verás:
192.168.1.133203.0.113.72001:db8:4f2a:1c00:9d3e:71b2:a85c:3e10Cada comando escribe una línea:
ipconfig getifaddr en0te da tu IP privada, la de tu portátil en el wifi de casa. En Linux, usahostname -I.curl -4 icanhazip.compregunta a un servidor de Cloudflare desde qué dirección le llega tu petición, por IPv4 (-4). Es tu IP pública, que no es de tu portátil sino de tu router (o, con CGNAT, de tu operador): desde el móvil, en el mismo wifi, verías la misma.curl -6 icanhazip.comhace lo mismo por IPv6. Ejecuta despuésifconfig en0 | grep inet6y encontrarás esa dirección entre las de la lista: es de tu portátil, sin traducir, porque con IPv6 no hay NAT. Si tu red no tiene IPv6, dará un error, y no pasa nada.
Hemos cambiado las dos IP públicas por direcciones de ejemplo. Las tuyas serán distintas.
Ahora, los sockets. Abre una terminal y deja un servidor escuchando, como en la lección 2:
nc -l 8080En una segunda terminal, pregunta qué programas están escuchando:
2. ¿Quién está escuchando?
lsof -nP -iTCP -sTCP:LISTENLo que verás:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMElimactl 5445 tuusuario 14u IPv4 0x376dab910c3f4fd7 0t0 TCP 127.0.0.1:52593 (LISTEN)…node 15218 tuusuario 19u IPv6 0x3bfa7c36078a5081 0t0 TCP [::1]:5173 (LISTEN)nc 26159 tuusuario 3u IPv4 0xd0ac77b78e83fcc3 0t0 TCP *:8080 (LISTEN)…lsof lista los ficheros abiertos, y para el sistema operativo un socket también lo es. -iTCP -sTCP:LISTEN pide solo los sockets TCP que escuchan, y -n y -P muestran las direcciones y los puertos como números.
Cada línea es un socket escuchando. COMMAND y PID son el programa y su número de (término) ProcesoUn programa en ejecución. Cuando arrancas un servidor, el sistema operativo crea un proceso que se queda vivo esperando peticiones.Ir a la definición; TYPE, si es IPv4 o IPv6; y NAME, dónde escucha:
127.0.0.1:52593y[::1]:5173(Vite, para crear webs) solo aceptan conexiones de tu ordenador, por IPv4 y IPv6.*:8080, tunc, escucha en todas tus direcciones IPv4: el0.0.0.0de la tabla de arriba.lsofescribe*tanto para0.0.0.0como para::, yTYPEte dice cuál es.
Tus programas y números serán otros, y hemos cambiado el nombre de usuario por tuusuario. En macOS, sin sudo, lsof solo enseña tus programas. En Linux también puedes usar ss -tln.
Deja nc escuchando. En una tercera terminal, conéctate a él con nc localhost 8080, y vuelve a la segunda:
3. Una conversación, tres sockets
lsof -nP -i :8080Lo que verás:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnc 26159 tuusuario 3u IPv4 0xd0ac77b78e83fcc3 0t0 TCP *:8080 (LISTEN)nc 26159 tuusuario 4u IPv4 0x433842aea8e4ffc 0t0 TCP 127.0.0.1:8080->127.0.0.1:49823 (ESTABLISHED)nc 26179 tuusuario 5u IPv4 0xb04bd315e3db3fc 0t0 TCP 127.0.0.1:49823->127.0.0.1:8080 (ESTABLISHED)-i :8080 pide todos los sockets del puerto 8080. Hay tres:
*:8080 (LISTEN): el socket que escucha, esperando a más clientes.127.0.0.1:8080->127.0.0.1:49823: el socket que el sistema operativo creó para esta conversación, en el mismo proceso del servidor (mira elPID).127.0.0.1:49823->127.0.0.1:8080: el socket del cliente, en otro proceso, con el puerto efímero49823.
Los sockets 1 y 2 comparten el puerto 8080, pero el 2 conoce también el otro extremo, y así los distingue el sistema operativo. Las líneas 2 y 3 son la misma conexión (ESTABLISHED, abierta) vista desde cada extremo, con los mismos cuatro valores. Tu puerto efímero será otro. Al acabar, pulsa Ctrl + C en las dos terminales de nc.
Por último, el camino que siguen tus paquetes hasta example.com:
4. El camino, salto a salto
traceroute -n example.comLo que verás:
traceroute: Warning: example.com has multiple addresses; using 172.66.147.243traceroute to example.com (172.66.147.243), 64 hops max, 40 byte packets1 192.168.1.1 3.171 ms 3.506 ms 1.866 ms2 10.0.33.135 5.687 ms 3.461 ms 7.890 ms3 * 172.16.4.129 5.818 ms 3.314 ms4 10.221.236.69 4.825 ms 10.220.106.138 6.570 ms 6.740 ms5 10.221.223.12 6.005 ms 5.590 ms 5.462 ms6 198.51.100.46 6.193 ms 198.51.100.60 8.876 ms 198.51.100.12 20.815 ms7 188.114.108.68 7.125 ms 5.646 ms 198.51.100.155 22.526 ms8 188.114.108.67 7.222 ms 188.114.108.31 15.326 ms 188.114.108.23 9.224 ms9 172.66.147.243 6.541 ms 5.953 ms 5.127 mstraceroute usa el TTL a propósito: envía paquetes que solo aguantan un salto, luego dos, luego tres… Cada router que tira uno avisa al origen, y así se descubre quién es. -n muestra las direcciones como números.
- Cada línea es un salto. El 1 es tu router, tu puerta de enlace, y el último es example.com (
172.66.…es pública: el rango privado va solo del 172.16 al 172.31). Las188.114.…ya son de la red de Cloudflare. - Los saltos 2 a 5 tienen IP privadas: son routers internos del operador, que no necesitan ser alcanzables desde internet.
- Los tres tiempos son las tres pruebas de cada salto, de ida y vuelta, en milisegundos. Un
*es una prueba sin respuesta a tiempo, y varias IP en un salto significan que las pruebas fueron por caminos paralelos.
Hemos cambiado las IP públicas del operador por direcciones de ejemplo, y tu camino será distinto. Si se queda imprimiendo * * * sin llegar, páralo con Ctrl + C. En Linux puede que tengas que instalarlo (sudo apt install traceroute) o usar tracepath -n example.com.
Ya lo has visto
Sección titulada «Ya lo has visto»- La página del router está en su IP privada, a menudo
192.168.1.1: tu puerta de enlace. - «Abrir puertos» para jugar online, como piden algunas consolas, es añadir una entrada fija a la tabla NAT del router.
Y si programas:
Network: use --host to exposeen Vite. Por defecto, Vite solo escucha en localhost; en macOS, solo en[::1](ejercicio 2):http://localhost:5173funciona (se prueba::1), perohttp://127.0.0.1:5173da «Connection refused», la lección 2 al revés. Con--hostescucha en todas las direcciones y te enseña tu IP privada:Network: http://192.168.1.133:5173/.- En Node,
http.createServer(…).listen(3000)pide el socket, hace bind y listen; cadafetchusa un socket de cliente. Error: listen EADDRINUSE: address already in use :::3000: ya hay un socket escuchando en ese puerto, a menudo un servidor que dejaste abierto.:::3000es::(Node escucha por defecto en todas las direcciones) y:3000. Para ver quién lo ocupa:lsof -nP -iTCP:3000 -sTCP:LISTEN.new URL('https://example.com:443').portes una cadena vacía: el puerto por defecto ni se apunta.
Errores comunes
Sección titulada «Errores comunes»- «localhost, 127.0.0.1 y 0.0.0.0 son lo mismo.»
localhostes un nombre para127.0.0.1y::1, a los que solo se llega desde tu ordenador. Escuchar en0.0.0.0es escuchar en todas tus direcciones IPv4, y te pueden alcanzar desde tu red. Con Docker (Fase 7) te importará: un servidor que escucha en127.0.0.1dentro de un contenedor no es accesible desde fuera del contenedor, ni siquiera desde tu propio ordenador. - «Un puerto solo admite una conexión.» Un socket que escucha acepta todas las que lleguen, y cada una se distingue por sus cuatro valores. Lo que no se puede es tener dos sockets escuchando en el mismo puerto y la misma dirección: eso es el error
EADDRINUSE(«dirección ya en uso»). - «Un socket es un WebSocket.» No son lo mismo, aunque se llamen parecido. WebSocket es un protocolo de aplicación para que el navegador y el servidor se envíen mensajes en los dos sentidos, y funciona sobre una conexión TCP, es decir, sobre sockets. Lo verás en la Fase 4.
Resumen
Sección titulada «Resumen»- Una dirección IP identifica a un ordenador en una red. IPv4 se quedó sin direcciones libres; IPv6 tiene de sobra.
- En IPv4, tus dispositivos tienen IP privadas, y el router las traduce a su IP pública con NAT. Por eso nadie de fuera puede empezar una conversación con tu portátil.
- Cada router solo decide el siguiente salto, y nadie conoce el camino entero.
- El puerto dice a qué programa va cada dato: los servidores usan puertos conocidos (80, 443) y los clientes, efímeros.
- Un socket es lo que el sistema operativo le da a un programa para usar la red. Una conexión se identifica por la IP y el puerto de cada extremo.
¿Lo has entendido?
Sección titulada «¿Lo has entendido?»Tu portátil y el de un amigo, cada uno en su casa, tienen la IP 192.168.1.133. ¿Hay algún problema?Ver respuesta
No. Son IP privadas, y cada una solo vale dentro de su red local. Al salir a internet, el router de cada casa la cambia por su IP pública, que sí es única.
Un servidor escucha en el puerto 443 y tiene 5.000 clientes conectados a la vez. ¿Cómo sabe el sistema operativo a qué conexión pertenece cada paquete que llega?Ver respuesta
Por los cuatro valores. El destino es el mismo para todos (la IP del servidor y el 443), pero cada cliente llega desde otra IP, o desde la misma con otro puerto efímero. Cada combinación es un socket distinto en el servidor.
Dejas nc -l 8080 escuchando en tu portátil. ¿Puede conectarse tu móvil, que está en tu wifi? ¿Y un amigo desde su casa?Ver respuesta
Tu móvil, sí: está en tu red y puede llegar a tu IP privada, http://192.168.1.133:8080. Tu amigo, no: tu IP privada no vale fuera de tu casa, y si se conecta a tu IP pública, tu router no encuentra esa conexión en su tabla NAT y la tira. Por IPv6 tampoco: en macOS, nc solo escucha en IPv4 y, aunque escuchara, el router suele bloquear las conexiones que nadie ha pedido. Habría que abrir un puerto en el router, y para un servidor de pruebas no es buena idea.
Para profundizar
Sección titulada «Para profundizar»- ¿Qué es el enrutamiento? (Cloudflare Learning): las tablas de rutas y BGP, con más detalle.
- RFC 1918 (en inglés): el documento de 1996 que reservó los rangos privados, y por qué hacían falta.
- Beej’s Guide to Network Programming (en inglés): cómo se programan los sockets en C, la base de lo que hace Node por debajo. Para curiosos.