0 votos

¿Por qué no puedo abrir una conexión en el puerto 80 para 0.0.0.0 pero no de otras formas?

Mis conocimientos de Linux/MacOS (creo que son iguales en este sentido) puerto de los permisos es que los puertos 1-1024 sólo están disponibles para root, pero por encima de eso, ellos están disponibles para cualquier persona.

Sin embargo, me he topado con algún comportamiento inesperado cuando la apertura de puertos en MacOS 10.14.2. Estoy usando php -S (versión 7.3.0) para el experimento.

Cuando ejecuto el comando con los siguientes casos:

127.0.0.1:80
[::1]:80
mylocalipv4:80
mylocalipv6:80

devuelve Failed to listen on ::1:80 (reason: Permission denied) como se esperaba (donde la IP/puerto dado se muestra).

Sin embargo, si me quedo es con 0.0.0.0:80, con éxito empieza a escuchar, pero no puedo conectar con curl, ya sea utilizando 127.0.0.1 o la IP de mi máquina.

Si puedo ejecutar el servidor con PHP [::0]:80 con éxito empieza a escuchar, y puedo curl con curl [::1] y con mi dirección ipv6 local.

Yo habría esperado de los últimos dos casos no se inicie con permiso denegado. Por qué no?

3voto

Jose Chavez Puntos 645

De pruebas, puedo ver que es posible para una computadora de escritorio a los usuarios de macOS bind() TCP números de puerto por debajo del 1024 (los llamados puertos conocidos). Funciona en IPv4 e IPv6, y en el localhost/no especificado direcciones.

El kernel Darwin código fuente está disponible libremente desde allí puedo ver que tiene la funcionalidad incorporada para comprobar los procesos de intentar enlazar/escuchar en puertos <1024 y negar eso. Esto es similar a la forma en que funciona Linux. Sin embargo, es posible desactivar esta comprobación al momento de compilar el kernel mediante la definición de "IPNOPRIVPORTS". Supongo que esto es lo que se hizo con el Mojave suministrado kernel.

En Linux lo que solía ser el caso que no fue posible para los no root para enlazar bajos números de puerto, pero hoy en día se dispone de varias opciones de permitir que los usuarios no root para enlazar a la baja puertos numerados. Como por ejemplo el uso de la capacidad de NET_BIND_SERVICE.

En macOS también dispone de varias opciones para restringir el enlace de baja puertos numerados. Por ejemplo, a través de kexts que hace encaje de filtrado, o a través de otros medios. Tal vez usted ha instalado el software, como por ejemplo Little Snitch, que le negó el permiso cuando se prueba.

Por favor, tenga en cuenta que las diferentes direcciones IP que han intentado con tener significados totalmente distintos:

 127.0.0.1 = IPv4 address that means the "localhost" (i.e. your own computer basically) - it is not available on the network
 [::1]     = the IPv6 equivalent of 127.0.0.1

 0.0.0.0   = IPv4 "unspecified address" - i.e. this is not an address in itself, rather it is a special value you give to bind() to let it know that you haven't specified a specific address that you want the port bind() on. Essentially this means that the port will be bound on all the IP-addresses you have.
 [::0]     = IPv6 equivalent of 0.0.0.0 (though usually written [::/128])

Esto puede explicar por qué algunas cosas fallado y algunas cosas que sucedieron. Por ejemplo, usted podría no ser capaz de unirse a 127.0.0.1, pero 0.0.0.0 funciona como se intenta enlazar el puerto no sólo en 127.0.0.1 pero también en otras direcciones IP que usted tiene.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by: