IRCNow

На рабочей станции, где вы являетесь единственным пользователем, вы можете использовать очень простой файл /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