Desde las pruebas que he realizado, puedo ver que es posible para los usuarios de macOS de escritorio realizar bind() en números de puerto TCP por debajo de 1024 (los llamados puertos conocidos). Funciona tanto en IPv4 como en IPv6, y en las direcciones localhost/no especificadas.
El código fuente del núcleo de Darwin está disponible libremente: desde allí puedo ver que tiene la funcionalidad incorporada para verificar los procesos que intentan hacer bind/listen en puertos <1024 y denegarlo. Esto es similar a cómo funciona Linux. Sin embargo, es posible deshabilitar esta verificación al compilar el núcleo definiendo "IPNOPRIVPORTS". Supongo que esto es lo que se hizo con el kernel suministrado en Mojave.
En Linux solía ser el caso de que no era posible para usuarios no root hacer bind en números de puerto bajos, pero hoy en día tienes varias opciones que permiten a usuarios no root hacer bind en puertos numerados bajos. Como por ejemplo usando la capacidad NET_BIND_SERVICE.
En macOS también tienes varias opciones para restringir la unión de puertos de números bajos. Por ejemplo, a través de módulos de kernel que filtran sockets, u a través de otros medios. Quizás tienes software instalado, como por ejemplo Little Snitch, que te negó el permiso cuando estabas haciendo las pruebas.
Ten en cuenta que las diversas direcciones IP que has probado tienen significados completamente diferentes:
127.0.0.1 = Dirección IPv4 que significa el "localhost" (es decir, tu propio ordenador básicamente) - no está disponible en la red
[::1] = el equivalente en IPv6 de 127.0.0.1
0.0.0.0 = "dirección no especificada" en IPv4 - es decir, no es una dirección en sí misma, más bien es un valor especial que le das a bind() para informarle que no has especificado una dirección específica en la que quieres que el puerto se enlace. Básicamente esto significa que el puerto se enlazará en todas las direcciones IP que tienes.
[::0] = equivalente IPv6 de 0.0.0.0 (aunque generalmente escrito [::/128])
Esto puede explicar por qué algunas cosas fallaron y otras tuvieron éxito. Por ejemplo, es posible que no puedas hacer bind en 127.0.0.1, pero 0.0.0.0 funciona ya que intenta hacer bind en el puerto no solo en 127.0.0.1 sino también en otras direcciones IP que tengas.
0 votos
Si macOS y Linux son (supuestamente) lo mismo en ese sentido, es solo porque son sistemas operativos Unix. macOS en realidad está basado (originalmente) en una versión de BSD con un microkernel, por lo que asumir que macOS y Linux son lo mismo en cualquier aspecto podría no ser preciso. Verificaría eso en línea.