Код: Выделить всё
# сначала определяем макросы и списки
ext_if = "rl0" # внешний интерфейс
int_if = "em0" # внутренний интерфейс
ext_addr = "222.222.222.222" # внешний IP адрес машины
int_addr = "192.168.0.9" # внутренний IP машины
int_net = "192.168.0.0/24" # Внутренняя сеть
#home_ip = "111.111.111.111" # Мой домашний айпи. Будем давать
# ему доступ по ssh.
ftp_ip = "192.168.0.8" # Адрес фтп-сервера в локальной сети.
table <pri_nets> { 10.0.0.0/8, 172.16.0.0/12, 0.0.0.0/8, 169.254.0.0/16 }
# В этой таблице я определил частные сети, которых не бывает в интернете,
# соответственно, не должно появляться на нашем внешнем интерфейсе.
# Обратите внимание, что тут нет 192.168.0.0/16, т.к. в некоторых случаях
# запросы из нашей локальной сети не пройдут.
# Сначала идут правила НАТ
# включаем нат на внешнем интерфейсе
nat on $ext_if from $int_net to any -> ($ext_if)
# Подключающихся по фтп отправляем за нат.
# Я специально сделал только одно правило с пробросом за НАТ,
# чтоб не перегружать конфиг. По аналогии с ним можно сделать почту, сайт и т.п.
# Также надо иметь в виду, что одного этого правила будет недостаточно, нужно
# будет также создать правило фидьтрации, разрешающее прохождение ftp-трафика
rdr on $ext_if proto tcp from any to $ext_addr port { 20, 21 } -> $ftp_ip
# Теперь правила фильтрации.
# Схема прохождения такая: Приоритет правил увеличивается сверху вниз, если не
# стоит ключевого слова quick.
# Сначала закрываем все
block all
# Разрешаем весь траффик по петле
pass on lo0 from any to any
# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0
block from any to 127.0.0.0/8
block from 127.0.0.0/8 to any
# Рубим на внешнем интерфейсе частные сети
# Поскольку это частные сети, им неоткуда взяться на внешнем интерфейсе
block in on $ext_if from any to <pri_nets>
# поскольку мы не включили в таблицу <pri_nets> подсеть 192.168.0.0/24
# для пакетов, приходящих от нее на внешний интерфейс создадим отдельное правило
block in on $ext_if from any to 192.168.0.0/24
# Мультикастовые рассылки
block in on $ext_if from any to 240.0.0.0/4
# Широковещательные icmp
block in log on $ext_if proto icmp from any to 255.255.255.255
block out log on $ext_if proto icmp from any to 255.255.255.255
# рубим траффик к частным сетям через внешний интерфейс
# заметьте - это правило отличаются от того что было выше!
# именно ради этого правила из таблицы была исключена подсеть 192.168.0.0/24
block out on $ext_if from <pri_nets> to any
# Мультикастовые рассылки
block out on $ext_if from 240.0.0.0/4 to any
# разрешаем весь исходящий траффик (серверу-то в инет можно? :))
pass out on $ext_if from $ext_addr to any
# разрешаем DNS снаружи (нам же надо узнавать IP по именам машин?)
pass on $ext_if proto udp from any port 53 to any
# разрешаем UDP (для синхронизации времени - 123 порт)
pass on $ext_if proto udp from any to any port 123
# разрешаем ftp снаружи на внутренний фтп-сервер.
# Без этого правила проброс фтп за нат, определенный в правилах ната,
# работать не будет.
pass in on $ext_if proto tcp from any to $ftp_ip
# открываем снаружи 22 порт. По аналогии с этим правилом можно открыть
# smtp/pop/imap, http и все что угодно, что крутится на этой машине.
# Не буду их писать, чтоб не перегружать конфиг.
pass on $ext_if proto tcp from any to $ext_addr port 22
# Разрешаем изнутри все что угодно
pass on $int_if from any to any