Традиционно Unix-системы позволяют непривилегированным процессам открывать для прослушивания (listen) только TCP-порты с номерами от 1024 и выше. Порт номер 1023 и все меньшие считаются "привилегированными" и доступны только суперпользователю. Такое разграничение гарантировало, например, что непривилегированный пользователь не может занять своим процессом, скажем, 25-й порт в тот момент, когда системный SMTP-процесс по какой-то причине оказался отключен, и принимать чужую почту. Кроме защиты подобного рода такое жесткое ограничение создавало и неудобства: например, чтобы дать процессу http-сервера возможность слушать порт 80, приходилось запускать его с правами суперпользователя и надеяться на качество кода http-сервера, который должен как можно раньше после занятия порта "сбросить" привилегии до статуса обычного пользователя.
Но "правило порта 1023" в FreeBSD уже давно не более чем дефолт. sysctl net.inet.ip.portrange.reservedhigh
определяет максимальный номер "привилегированного" порта, по умолчанию содержит значение 1023, которое можно поменять. Модуль ядра mac_portacl, будучи загруженным, по умолчанию дублирует эту защиту (sysctl security.mac.portacl.port_high
тоже равен 1023), поэтому после его загрузки "традиционную" защиту можно отключить, выставив sysctl net.inet.ip.portrange.reservedhigh=0
. При этом непривилегированные процессы по-прежнему не имеют права занимать порты ниже 1024, если им не разрешить этого явно и выборочно. Например:sysctl security.mac.portacl.rules=uid:88:tcp:80
Такое правило разрешает процессу пользователя с UID=88 (непривилегированному) занимать порт 80, если он свободен. Никаких прав суперпользователя при этом процесс не получает.
В FreeBSD 8.0 и новее модуль mac_portacl
можно загрузить в любой момент, так как подсистема MAC (mandatory access control) включена в ядро по умолчанию (options MAC
в конфигурации ядра). В более ранних версиях может потребоваться включение этой опции и пересборка ядра. А вообще этот модуль доступен, начиная с версии 5.1-RELEASE (2003), в стабильной ветке с 5.3-RELEASE (2004) и документирован в Handbook и в man-странице mac_portacl(4).
(В более ранних версиях системы обеспечить обработку непривилегированным процессом запросов, приходящих на порт с номером до 1023, можно так: ipfw fwd 127.0.0.1,8080 tcp from any to $myip 80
(или to me 80
). При этом процесс запускается на порту 8080, а пакеты к нему доставляет ядерная часть ipfw, подменяя служебную информацию в сокете так, что приложение считает, что запрос изначально пришел в порт 8080. Ответные пакеты также обрабатываются ядром "прозрачно" для приложения и всё работает.)