¿Cómo puedo abrir el puerto 80 para que un proceso no root pueda unirse a él?

46

Quiero ejecutar un servidor web en mi Mac como un proceso no root. Normalmente, solo los procesos raíz pueden unirse al puerto 80 (o a cualquier puerto por debajo de 1024).

¿Puedo abrir el puerto 80 específicamente para que los procesos no root puedan escucharlo?

Avner
fuente
Relacionado: link1 , link2
Nathan Farrington
más bien como la pregunta de unix.stackexchange.com , ¿no?
Filip Bartuzi el
1
¿Por qué Unix si está en un sistema Macos?
nhed

Respuestas:

28

Esto es difícil de hacer por diseño, y a menos que tenga acceso de root a su máquina, ninguno de los siguientes funcionará, ya que requieren root para configurar los cambios. Sin embargo, una vez cambiados, los programas de espacio de usuario tendrán acceso sin tener root.

Hay dos formas comunes de lograr esto, y la que elija dependerá de por qué está tratando de evitar la restricción:

Apunte el puerto 80 a otro puerto, como 8080

Al reconfigurar su máquina para pasar todo el tráfico del puerto 80 al puerto 8080, o cualquier puerto de su elección, puede permitir que los servidores de espacio de usuario reciban puertos de privilegio raíz en el área a la que tienen acceso.

El proceso es sencillo:

Paso 1: Ver las reglas actuales del firewall.

sudo ipfw show

Paso 2: Agregar regla de reenvío de puertos (80 a 8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

Si desea eliminar sus reglas de firewall, ejecute:

sudo ipfw flush

( fuente )

Este es un cambio temporal, y se revertirá una vez que reinicie o se vacíe como se indica en la última línea.

Puede hacer que el cambio sea permanente , o puede agregar el comando como una línea de inicio antes de iniciar su servidor, lo que probablemente sea más seguro desde el punto de vista de la seguridad.

Use Authbind

Authbind fue diseñado específicamente para permitir el acceso de un programa a puertos de nivel inferior sin darle acceso completo a la raíz.

Hay un puerto MacOSX:

https://github.com/Castaglia/MacOSX-authbind

Sin embargo, aún puede estar limitado al tráfico IPv4, por lo que es posible que tenga que hacer una investigación adicional para determinar si cumple con sus necesidades.

Adam Davis
fuente
LOVE MacOSX-authbind ... Le permite ejecutar, por ejemplo, un servidor web en el puerto 80, como "Administrador regular". es decir, en tu launchd .plist... ` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
alex grey
13
OS X Yosemite elimina ipfw. Esta esencia describe una solución alternativa usando pf.
lyschoening
Tenga en cuenta que redirigir el tráfico a un puerto no privilegiado puede ser inseguro si se encuentra en un entorno compartido; otro proceso puede vincularse a ese puerto antes de que lo haga su programa o si su programa desvincula el puerto incluso momentáneamente para un reinicio rápido.
Lie Ryan
authbind es realmente una gran solución, ¡gracias!
favor
7

Puede utilizar ncatpara reenviar el tráfico de un servidor web que se ejecuta en otro puerto:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

Esto reenviará el tráfico en el puerto 80 a localhost: 1234. Sin embargo, esto es un poco complicado, no lo usaría en ningún lugar más allá de las pruebas rápidas y definitivamente no en producción.

Tenga en cuenta que esto no permitirá que un proceso no root se una a él, pero al elegir un puerto al que se pueda unir el proceso, 1234 en este ejemplo, parecerá que está vinculado al puerto 80. Esto está haciendo el equivalente de reenvío del puerto 80 al puerto 1234 con un firewall, pero de forma mucho más temporal.

Mathew Hall
fuente
2
Esta es una buena solución. NÓTESE BIEN. ncatviene con el nmapque se puede instalar a través de puertos Mac con sudo port install nmap. MacPorts se puede instalar desde macports.org/install.php .
William Denniss
Esto solo me da bind: la dirección ya está en uso errores.
Matt Joiner
Lo mismo aquí, no funcionó. Esto hizo el truco: unix.stackexchange.com/a/187038
Sebastian J.
2

También puede usar ssh para reenviar puertos. Entonces, si tiene un servidor que se ejecuta en 8080, puede reenviar el tráfico desde el puerto 80. Aquí hay un script que uso, que detiene el apache nativo si se está ejecutando y reenvía el tráfico:

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh [email protected] -L 80:127.0.0.1:8080
bdombro
fuente
El reenvío de puertos Ssh puede tener un rendimiento bastante bajo, y las características de seguridad no tienen mucho sentido en un entorno local-> local. Es mejor usar el reenvío de puertos integrado de osx, o algo así como ncat.
Shayne
-3

Lo que debería poder hacer es abrir el puerto 80 en su enrutador y apuntarlo a la dirección IP local de su servidor web. Luego, en su Mac, habilite Compartir web desde el panel de preferencias Preferencias del sistema> Compartir y apúntelo al directorio que elija. Esto me ha funcionado en el pasado hasta que cambié al servidor 10.6.

Matt Love
fuente
1
Estoy buscando esto como una solución para mi propia máquina de desarrollo. Como tengo que trabajar en lugares donde no tengo control sobre el enrutador, esta solución no podría funcionar para mí. Sospecho que debería funcionar si está configurando un servidor y por alguna razón no tiene acceso de root.
Avner
Entonces, para ser claros, ¿estás tratando de configurar un servidor web en diferentes sitios de clientes, pero no tienes acceso para abrir el puerto 80? ¿Cómo abrirá el puerto en el enrutador si no tiene acceso? ¿Estoy entendiendo correctamente o estoy fuera de lugar?
Matt Love
Solo estoy tratando de usar el puerto 80 en mi propia máquina de desarrollo, no en un servidor de producción. Me despliego en heroku de todos modos.
Avner