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