На рабочей станции, где вы являетесь единственным пользователем, вы можете использовать очень простой файл /etc/pf.conf: set skip on lo0 # don't filter localhost packets ext_if = "em0" # replace em0 with your external interface set block-policy drop # by default, drop packets. You can also set block-policy reject set loginterface $ext_if # log that interface block all # block all traffic by default pass in inet proto icmp icmp-type 8 code 0 # icmp packets pass in inet proto icmp icmp-type 3 code 4 # icmp needfrag (MTU) pass in inet6 proto ipv6-icmp icmp6-type {2 128} keep state pass out all # pass all outgoing traffic Это разрешит трафик ICMP (полезно для диагностики сети) при блокировке всех других входящих подключений. (Как правило, последнее правило определяет действие.) Обычно я не делаю белый список по IP-адресам, потому что были времена, когда нужно было получить доступ к системе с другого IP-адреса. Я также избегаю использование отпечатка ОС, потому что, хотя она доступна, она не на 100% точна. Чтобы загрузить набор правил после его редактирования, выполните: $ doas pfctl -f /etc/pf.conf Чтобы отключить брандмауэр (полезно для диагностики сети), выполните: $ doas pfctl -d Чтобы включить снова: $ doas pfctl -e Для сервера вы, как минимум, хотите разрешить входящие ssh-пакеты: set skip on lo0 # don't filter localhost packets ext_if = "em0" # my external interface is em0 set block-policy drop # by default, drop packets. You can also set block-policy reject set loginterface $ext_if # log that interface pass in proto tcp from 192.168.1.1 to port ssh pass in inet proto icmp icmp-type 8 code 0 # icmp packets pass in inet proto icmp icmp-type 3 code 4 # icmp needfrag (MTU) pass in inet6 proto ipv6-icmp icmp6-type {2 128} keep state pass out all # pass all outgoing traffic Замените 192.168.1.1 на ваш IP. Как правило, ваши серверы также должны принимать входящие соединения http и https. Это необходимо для работы веб-сервера, а также для получения правильно подписанного SSL-сертификата. Как тут /etc/pf.conf: set skip on lo0 # don't filter localhost packets ext_if = "em0" # my external interface is em0 set block-policy drop # by default, drop packets. You can also set block-policy reject set loginterface $ext_if # log that interface pass in proto tcp from 192.168.1.1 to port ssh pass in inet proto icmp icmp-type 8 code 0 # icmp packets pass in inet proto icmp icmp-type 3 code 4 # icmp needfrag (MTU) pass in inet6 proto ipv6-icmp icmp6-type {2 128} keep state pass in proto tcp to port {http https} pass out all # pass all outgoing traffic