Es un comportamiento estándar que los usuarios no privilegiados no pueden vincularse a puertos privilegiados (números de puerto inferiores a 1024). Por lo tanto, una aplicación que quisiera vincularse al puerto 80, por ejemplo, tendrá que ejecutarse con privilegios (generalmente esto significa ejecutarse como root) para vincularse a este puerto.
Un enfoque común es ejecutar un pequeño proceso de "escucha" con un usuario con privilegios que acepta la conexión y luego genera un proceso sin privilegios para manejar la solicitud. La eliminación de privilegios para el procesamiento de solicitudes se realiza por razones de seguridad. Si alguien puede explotar el proceso que maneja la solicitud, entonces generalmente permite que un intruso ejecute comandos usando los mismos privilegios que el proceso de procesamiento. Por lo tanto, sería malo manejar toda la solicitud utilizando un proceso privilegiado.
Sin embargo, para muchas aplicaciones es común hoy en día ejecutarse como no root; pero tales procesos, por supuesto, no pueden unirse a puertos privilegiados en una configuración estándar. Por lo tanto, los servidores como Tomcat o JBoss solían vincularse a puertos altos como 8080, por lo que no necesitan un oyente privilegiado.
Por supuesto, si expone este proceso a Internet, es probable que proporcione acceso en el puerto 80, ya que cada navegador primero intentará conectarse al puerto 80 cuando se utiliza el protocolo HTTP. Una solución común para proporcionar esto es usar un firewall o un traductor de puertos entre la aplicación y el Internet público. Entonces, las solicitudes llegan al firewall que solicita el puerto 80, pero el firewall envía la solicitud a algún host interno en el puerto 8080. De esta manera, el servidor web real puede operar en puertos altos mientras está disponible públicamente en el puerto 80.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
A veces, esta redirección se realiza simplemente usando la iptables
regla NAT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Esto permite ejecutar una aplicación no privilegiada que escucha en el puerto 8080 mientras que todas las solicitudes entrantes para el puerto 80 se redirigen al puerto 8080.
Sin embargo, usando los núcleos modernos de Linux hay otra posibilidad: usar capacidades.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Esto permitiría binary
enlazar a puertos privilegiados incluso cuando se inicie desde un usuario no root. Ver man capabilities
para más detalles.