— по кр. мере, в его текущем состоянии (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