пля, туго (((, ну да лан поехали...
Да и я не увидел термина сбрасывания прав Есть "switch to minimal privs and change our user id", но переводиться оно по другому.
Bind стартует под рутом (у которого нет ограничений), и потом переключается под простого пользователя, у которого гораздо меньше прав. Доходит надеюсь - было много, стало мало, то есть он сбрасывает права (привилегированного пользователя до уровня простого). Надеюсь щас ферштеен )))
Теперь о преблеме
Итак, в системе есть привилегированные порты. Привилегированными портами называеются порты, которые лежат в диапазоне
net.inet.ip.portrange.reservedlow...net.inet.ip.portrange.reservedhigh. Ессно, что в этот диапазон входит порт 53. С этим ясно.
В целях безопасности слушающие сокеты на портах такого рода может создавать только пользователь root, любого другого система пошлет лесом с ошибкой (при создании) - нет прав. С этим тоже разобрались.
Идем далее, уже к практической части. Бинд, с каким-то интервалом (а может еще каким-то образом. искать в исходниках не хочу) проверяет на всех IP-адресах ли он повесил слушающие сокеты (или проверяет, действительны ли они, ну там не выключен ли интерфейс или еще че...). Если нет, то создает/удаляет. Едем далее...
Старт системы:
1. Стартует bind, вешает сокеты на все доступные айпишники. Сбрасывает права. линк пппое в дауне в этот момент.
2. Поднимается канал пппое, присваиваются айпишники, все ок.
3. Через некоторое время bind делает проверку на предмет - все ли айпишники я прослушиваю. Если нет, то создает.
Но так как у него уже нет прав создавать прослушивающие сокеты на 53 порту, то он обламывается и вытекает эта проблема. Так же в логах можно увидить вот такие строки:
Код: Выделить всё
29-Dec-2011 20:43:34.282 network: could not listen on UDP socket: permission denied
29-Dec-2011 20:43:34.308 network: creating IPv4 interface ng0 failed; interface ignored
29-Dec-2011 21:43:34.283 network: could not listen on UDP socket: permission denied
29-Dec-2011 21:43:34.283 network: creating IPv4 interface ng0 failed; interface ignored
29-Dec-2011 22:43:34.284 network: could not listen on UDP socket: permission denied
29-Dec-2011 22:43:34.284 network: creating IPv4 interface ng0 failed; interface ignored
Вот эта фигня и заставила найти решение. оно было найдено в использовании модуля mac_portacl.
Что делаем:
Ессно, подгружаем модуль. И в sysctl.conf пишем следующее:
Код: Выделить всё
net.inet.ip.portrange.reservedlow=0
net.inet.ip.portrange.reservedhigh=0
security.mac.portacl.rules=uid:53:udp:53,uid:53:tcp:53
После чего все работает. Надеюсь щас-то понятно как оно происходит, итак разжевал.