Це стандартна поведінка, коли непривілейовані користувачі не мають права прив'язуватися до привілейованих портів (номери портів нижче 1024). Тому програма, яка хотіла б, наприклад, прив'язати до порту 80, повинна мати привілейований (зазвичай це означає запустити як root), щоб прив’язати до цього порту.
Загальний підхід полягає в запуску невеликого "слухацького" процесу з привілейованим користувачем, який приймає з'єднання, а потім породжує непривілейований процес для обробки запиту. Видалення привілеїв для обробки запиту здійснюється з міркувань безпеки. Якщо хтось в змозі використовувати процес, який обробляє запит, він, як правило, дозволяє зловмиснику виконувати команди, використовуючи ті ж привілеї, що і процес обробки. Тому було б погано обробляти весь запит, використовуючи привілейований процес.
Однак для багатьох застосувань в наші дні прийнято працювати як некореневий; але такі процеси, звичайно, не можуть прив'язуватися до привілейованих портів, а потім у стандартній конфігурації. Тож такі сервери, як Tomcat або JBoss, використовувались для прив'язки до високопортових портів, таких як 8080, тому їм не потрібен привілейований слухач.
Звичайно, якщо ви піддаєте такий процес в Інтернеті, ви, ймовірно, надасте доступ через порт 80, оскільки кожен браузер спершу намагатиметься підключитися до порту 80, коли використовується протокол HTTP. Загальною проблемою для цього є використання брандмауера або перекладача портів між додатком та загальнодоступним Інтернетом. Таким чином, запити потрапляють на брандмауер із запитом порту 80, але брандмауер пересилає запит до якогось внутрішнього хоста на порту 8080. Таким чином реальний веб-сервер може працювати на портах високого рівня, публічно доступних на порт 80.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
Іноді це переспрямування виконується просто за допомогою iptables
правила NAT:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Це дозволяє запускати непривілейовану програму прослуховування через порт 8080, тоді як всі вхідні запити на порт 80 просто переспрямовані на порт 8080.
Однак, використовуючи сучасні ядра Linux, є ще одна можливість: використовувати можливості.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Це дозволить binary
прив’язати до привілейованих портів навіть тоді, коли запускається від не-root користувача. Дивіться man capabilities
докладнішу інформацію.