OpenBSD-фаервол PF для Mac OS X заплесневел

— по кр. мере, в его текущем состоянии (Yosemite, El Capitan).

Будучи пользователем Mac OS X (“not only, but also”) довольно долгое время, я, конечно, в курсе попыток разработчиков Apple укомплектовать OS X пакетным фильтром — firewall’ом. Они сделали подход к FreeBSD’шному ipfw, но довольно быстро отказались от него, хотя, его останки всё ещё в системе (даже в El Capitan), как можно видеть, набрав в терминале

sysctl net.inet.ip.fw

Теперь, вместо него, они пытаются использовать PF, у которого и без того достаточно непростой путь развития, лучше всего описываемый термином “форк”. PF для FreeBSD и для OpenBSD — это вполне себе “форки”. Во FreeBSD 10.2 используется PF из OpenBSD 4.5. Причём, они весьма заметно разошлись. Если меня спросят, какой из вариантов я предпочёл бы, то, скорее, OpeBSD’шный, но, вообще, не могу не отметить, что он стал более сложным, чем кто-либо мог это ждать в самом начале. Синтаксис правил для NAT/routing, к примеру, очень разнится.

Так вот, возвращаясь к Mac OS X. Я не знаю номер версии OpenBSD, которую они выбрали как основу, но я могу вас заверить, что и в Yosemite, и в El Capitan она слишком устаревшая, поломанная и покрытая плесенью. Вы должны понимать, что эта версия PF содержит баги, которые в первоисточнике были устранены давным-давно, и в ней отсутствуют некоторые давно уже не новые возможности. Например:

  • Не работает  TCP modulate state, можете даже не терять время:
     % cat -n pf-modulate.conf 
         1    pass all
         2    pass out on lo0 proto tcp from any to any port 22 modulate state
     % sudo pfctl -ef pf-modulate.conf
    ...
     % nc -w 1 127.0.0.1 22        
     % nc -w 1 127.0.0.1 22
     % 
     % head -n1 pf-modulate.conf | sudo pfctl -f -
    ...
     % sudo pfctl -s r 2>/dev/null
    pass all flags S/SA keep state
     % nc -w 1 127.0.0.1 22                       
    SSH-2.0-OpenSSH_6.9
     % nc -w 1 127.0.0.1 22
    SSH-2.0-OpenSSH_6.9
     % 
    
  • Странно работает логирование пакетов. Я бы сказал, что иногда происходит залипание опции, так что не получается отключить логирование для некоторых правил, но на тек. момент у меня нет готовых примеров.
  • Совместная комбинация route-to и nat не даст вам желаемого результата. Хотя она работает той же FreeBSD 10.2 (да и возможно 10.1), правда, там есть один нюанс. 😉 Ну и, понятное дело, в свежих релизах OpenBSD с этим вообще никаких проблем, правда синтаксис там отличается кардинально.
  • (self) и всё тому подобное в скобочках — мануал утверждает, что “

    Surrounding the interface name (and optional modifiers) in parentheses changes this behaviour.

    ”, но в действительности это не работает. Если настройки интерфейсов изменились, вам придётся перезагрузить  pfctl -f набор правил.

 

UPD.(2016-08): Да, так и есть — pf в Mac OS X базируется на версии из OpenBSD 2008-о года.

InEnglish