É um comportamento padrão que usuários não privilegiados não têm permissão para vincular a portas privilegiadas (números de porta abaixo de 1024). Portanto, um aplicativo que gostaria de vincular à porta 80, por exemplo, precisará executar privilégios (geralmente isso significa executar como root) para vincular a essa porta.
Uma abordagem comum é executar um pequeno processo de "ouvinte" com usuário privilegiado, que aceita a conexão e gera um processo não privilegiado para lidar com a solicitação. A eliminação de privilégios para o processamento de solicitações é feita por motivos de segurança. Se alguém é capaz de explorar o processo que lida com a solicitação, geralmente ele permite que um invasor execute comandos usando os mesmos privilégios que o processo de processamento. Portanto, seria ruim manipular toda a solicitação usando um processo privilegiado.
No entanto, para muitos aplicativos, hoje em dia é comum executar como não raiz; mas é claro que esses processos não podem se vincular a portas privilegiadas na configuração padrão. Portanto, servidores como o Tomcat ou o JBoss costumavam se conectar a portas altas como o 8080, para que não precisassem de um ouvinte privilegiado.
Obviamente, se você expor esse processo à Internet, provavelmente forneceria acesso na porta 80, pois cada navegador tentaria primeiro se conectar à porta 80 quando o protocolo HTTP for usado. Uma solução comum para fornecer isso é usar um firewall ou tradutor de portas entre o aplicativo e a Internet pública. Portanto, as solicitações atingem o firewall que solicita a porta 80, mas o firewall encaminha a solicitação para algum host interno na porta 8080. Dessa forma, o servidor da Web real pode operar em portas altas enquanto estiver disponível publicamente na porta 80.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
Às vezes, esse redirecionamento é feito simplesmente usando a iptablesregra NAT:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Isso permite executar um aplicativo sem privilégios que atende na porta 8080, enquanto todas as solicitações de entrada da porta 80 são apenas redirecionadas para a porta 8080.
No entanto, usando os kernels modernos do Linux, existe outra possibilidade: Usar recursos.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Isso permitiria binarya ligação a portas privilegiadas, mesmo quando iniciadas a partir de um usuário não raiz. Veja man capabilitiespara mais detalhes.