È normale che agli utenti non privilegiati non sia consentito associare porte privilegiate (numeri di porta inferiori a 1024). Pertanto, un'applicazione che desidera associare alla porta 80, ad esempio, dovrà eseguire privilegi (di solito questo significa eseguire come root) per associarsi a questa porta.
Un approccio comune è quello di eseguire un piccolo processo "listener" con un utente privilegiato che accetta la connessione e quindi genera un processo non privilegiato per gestire la richiesta. I privilegi di rilascio per l'elaborazione della richiesta vengono eseguiti per motivi di sicurezza. Se qualcuno è in grado di sfruttare il processo che gestisce la richiesta, in genere consente a un intruso di eseguire comandi utilizzando gli stessi privilegi del processo di elaborazione. Pertanto, sarebbe male gestire l'intera richiesta utilizzando un processo privilegiato.
Tuttavia, per molte applicazioni è comune al giorno d'oggi eseguire come non root; ma tali processi ovviamente non possono legarsi a porte privilegiate in configurazione standard. Quindi server come Tomcat o JBoss erano soliti associarsi a porte alte come 8080, quindi non hanno bisogno di un ascoltatore privilegiato.
Naturalmente se esponete un tale processo a Internet probabilmente fornireste l'accesso sulla porta 80 poiché ogni browser proverebbe prima a connettersi alla porta 80 quando viene utilizzato il protocollo HTTP. Una soluzione comune per fornire ciò consiste nell'utilizzare un firewall o un traduttore di porte tra l'applicazione e Internet pubblico. Quindi le richieste colpiscono il firewall che richiede la porta 80 ma il firewall inoltra la richiesta ad un host interno sulla porta 8080. In questo modo il vero web server può operare su porte alte pur essendo pubblicamente disponibile sulla porta 80.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
A volte questo reindirizzamento viene semplicemente eseguito utilizzando la iptables
regola NAT:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Ciò consente l'esecuzione di un'applicazione senza privilegi in ascolto sulla porta 8080 mentre tutte le richieste in arrivo per la porta 80 vengono semplicemente reindirizzate alla porta 8080.
Tuttavia, usando i moderni kernel Linux esiste un'altra possibilità: utilizzare le funzionalità.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Ciò consentirebbe binary
di collegarsi a porte privilegiate anche se avviato come da utente non root. Vedi man capabilities
per maggiori dettagli.