Страница 1 из 1

Настройка pf

Добавлено: 2008-03-17 18:45:41
princeps
Коллеги, возникла необходимость настроить pf на freebsd. Я раньше работал с ipfw, с pf не знаком вообще, а мне в свое время очень помогла статья лисяры про ipfw http://www.lissyara.su/?id=1127. Так вот, я решил перевести конфиги из этой статьи на pf. Попутно напишу аналог этой статьи для pf - чтоб новичкам было удобно не запутаться. В общем, получился следующий ниже файлик. Комментарии в нем пусть не удивляют - они как раз с прицелом на статью.

Код: Выделить всё

# сначала определяем макросы и списки
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
Собственно, все вроде работает, но поскольку я не спец по pf, может что-то пропустил или недостаточно оптимально сделал. Может что добавить нужно.

Re: Настройка pf

Добавлено: 2008-03-17 22:17:57
dikens3
Сам один раз написал фаер на PF, но помню, что правила не имеющие quick срабатывают не сразу!!!
quick
Если пакет соответствует правилу с ключевым словом quick, то данное правило считается последним и к пакету немедленно применяется действие action. (Т.е. если у всех правил будет высталена опция quick, то мы будем иметь дело с брандмауэром в котором первое правило выигрывает.)
http://house.hcn-strela.ru/BSDCert/BSDA ... pcs02.html
Правила фильтра состоят из критерия и действия, которое надо предпринять, если пакет соответствует критерию. Действие может быть или block или pass. Правила применяются по очереди от первого к последнему, при этом последнее правило выигрывает если только не встретится ключеве слово quick. Таким образом, если в самом начале конфигурационного файла задано правило «пропускать все пакеты», или «отбрасывать все пакеты», то это ни что иное, как политика по умолчанию — именно это правило будет применено к пакету, который не соответствует ни одному правилу ниже по ходу файла.
Как думаешь, какое действие будет для пакетов на lo, исходя из твоего конфига и процитированного выше?

Код: Выделить всё

# Разрешаем весь траффик по петле
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
Последнее правило выиграет? Ага... :-)

От меня:

Код: Выделить всё

# Отключаем pf для локального интерфейса
set skip on lo

# Нормализация всего входящего трафика
scrub in all
P.S. Выставляй везде quick, будет работать как в ipfw. И статью лучше не надо, по ссылке много чего уже есть, а нового ты ничего не скажешь.

Re: Настройка pf

Добавлено: 2008-03-17 22:43:29
princeps
dikens3 писал(а): Выставляй везде quick, будет работать как в ipfw.
Если б я хотел, чтоб было как в ipfw, я б поставил ipfw :).
dikens3 писал(а):# Отключаем pf для локального интерфейса set skip on lo# Нормализация всего входящего трафикаscrub in all
Учту, спасибо.
dikens3 писал(а): И статью лучше не надо, по ссылке много чего уже есть, а нового ты ничего не скажешь.
Ммм, вот по ipfw тоже до хрена всего написано, а все-таки сатьей Лиса пользуются же люди. Главное достоинство - что она проста и понятна для новичков, копипастишь и все работает - нет необходимости pass any to any. Ну, это я так думаю. Кто-нибудь еще как считает, нужна ли подобная статья про pf?

Re: Настройка pf

Добавлено: 2008-03-17 23:26:20
dikens3

Re: Настройка pf

Добавлено: 2008-03-18 14:32:50
Dog
dikens3 писал(а):Выставляй везде quick, будет работать как в ipfw. И статью лучше не надо, по ссылке много чего уже есть, а нового ты ничего не скажешь.
А смысл превращать pf в ipfw? У этих файрволов совершенно разный дзен, который прохавать желательно :)
quick имеет необходимость ставить для того что требует максимальной скорости: ssh, dns, tftf и им подобным. Все остальное - пусть топает по правилам, которые ужесточаются по мере прохождения файрвола. Применяется последнее из подходящих правил, по ходу цепочки можно сколь угодно гибкие конструкции делать.

Re: Настройка pf

Добавлено: 2008-03-18 15:27:28
princeps
Dog писал(а):А смысл превращать pf в ipfw?
Вот и я о том же.
Dog писал(а):У этих файрволов совершенно разный дзен
Приведенный выше конфиг канает под дзен pf?

Re: Настройка pf

Добавлено: 2008-03-18 17:04:36
dikens3
princeps писал(а):
Dog писал(а):А смысл превращать pf в ipfw?
Вот и я о том же.
Dog писал(а):У этих файрволов совершенно разный дзен
Приведенный выше конфиг канает под дзен pf?
Вот блин наехали ещё. Я вроде не говорил что PF нужно использовать именно так. На мой взгляд так проще делать переход с ipfw. По крайней мере правила научишься составлять, pfctl изучишь, nat, глобальные настройки и т.п.

Re: Настройка pf

Добавлено: 2008-03-18 21:19:27
Dog
princeps писал(а):Приведенный выше конфиг канает под дзен pf?
Откуда ж я знаю? Дзен - его нельзя объяснить или продемонстрировать, его только постичь можно - на то он и дзен :)
dikens3 писал(а):Вот блин наехали ещё. Я вроде не говорил что PF нужно использовать именно так. На мой взгляд так проще делать переход с ipfw. По крайней мере правила научишься составлять, pfctl изучишь, nat, глобальные настройки и т.п.
Зачем же сразу так близко с сердцу принимать? Я просто личное мнение о файрволах высказал, насколько это дело воспринимаю.
Сам в свое время с ipfw на pf переходил, намучился, долго не мог прохавать глубинного смысла прохода правила до конца цепочки, потом вперло. А вот объяснить на пальцах - не могу. Все понимаю, а сказать не могу - оправдываю ник :)

Re: Настройка pf

Добавлено: 2008-03-19 9:08:17
princeps
Вот ты, Dog, раз переходил, как считаешь, стоит писать подобную статью для новичков? И что все-таки по поводу конфига - имеет он право на жизнь?

Re: Настройка pf

Добавлено: 2008-03-19 12:42:53
Dog
2princeps: Работает - значит имеет. :)

Статья в любом случае нужна, кому-нибудь да пригодится. Но кто ее писать будет?
Лично я лучше чем в примере вот этого пособия не напишу, а тупо переписывать не вижу смысла. Поэтому рекомендую к прочтению указанный источник.

Re: Настройка pf

Добавлено: 2008-03-20 19:42:08
voider
хорошая статейка , правльно прально пора уже переходить на pf :) а консерваторы пусть нервно курят в сторонке :)

Re: Настройка pf

Добавлено: 2008-03-20 19:56:23
Dog
Не согласен. Если инструмент себя оправдывает - то смысла его менять нет никакого. Тем более что у ipfw есть фичи, которых в pf нет и пока вряд-ли предвидится: divert, например. А учитывая что в 7-ке на него наконец-то нормальный nat прикрутили, что он теперь с таблицами умеет работать, пакеты помечать... В общем, если хватает его возможностей - работать с ним еще и работать. Особенно если система с netgraph'ом повязана.
Хотя pf-овская логика ИМХО гибче и мощней. Во всяком случае после того как я на этот файрвол перешел у меня не было нужды использовать особенности ipfw.

Re: Настройка pf

Добавлено: 2008-03-20 23:58:07
voider
Dog писал(а):Не согласен. Если инструмент себя оправдывает - то смысла его менять нет никакого. Тем более что у ipfw есть фичи, которых в pf нет и пока вряд-ли предвидится: divert, например. А учитывая что в 7-ке на него наконец-то нормальный nat прикрутили, что он теперь с таблицами умеет работать, пакеты помечать... В общем, если хватает его возможностей - работать с ним еще и работать. Особенно если система с netgraph'ом повязана.
Хотя pf-овская логика ИМХО гибче и мощней. Во всяком случае после того как я на этот файрвол перешел у меня не было нужды использовать особенности ipfw.
эт с каго перепугу нету diverta v pf ? он отродясь там :) нат встроен в файвол :)

Re: Настройка pf

Добавлено: 2008-03-21 1:10:30
romzes
такое только в режиме тестирования приемлимо:

Код: Выделить всё

# Разрешаем изнутри все что угодно
pass on $int_if from any to any
например, если кто-то в сети заразится спам-трояном, внешний ip быстро попадет во всевозможные dnsbl...
к тому же, внутри сети тоже кулхацкеры попадаються, а такое правило откроет ему все порты на шлюзе..

Re: Настройка pf

Добавлено: 2008-03-21 2:04:51
romzes
а ну и еще:

Код: Выделить всё

pass out on $ext_if from $ext_addr to any
в подобных правилах полезно писать так:

Код: Выделить всё

pass out on $ext_if from $ext_if to any
будут подставляться все ip интерфейса $ext_if, а если алиасы не нужно подставлять, тогда:

Код: Выделить всё

pass out on $ext_if from $ext_if:0 to any

ну а если совсем дотошно прицепиться к предыдущему правилу :mrgreen: , тогда делаем

Код: Выделить всё

pass out modulate state
и тогда фильтруем только входящий трафик подразумевая "пакет должен быть обработан (направлен он нам или транзитом), а кто заслуживает эту обработку - пускай решают на кордоне..." в этом подходе свой дзэн :wink:

Re: Настройка pf

Добавлено: 2008-03-21 8:49:00
Dog
voider писал(а):эт с каго перепугу нету diverta v pf ? он отродясь там :) нат встроен в файвол :)
А я не о nat'е говорил, а о возможности перенаправлять пакеты в divert socket. В 7-ке для nat'а это уже на фиг не требуется, а фича иногда бывает очень нужной.

Re: Настройка pf

Добавлено: 2008-03-21 10:37:25
princeps
Господа, не начинайте обсуждать достоинства pf и ipfw, об этом уже много раз говорили.
2 Romzes: спасибо за дельные советы
romzes писал(а):такое только в режиме тестирования приемлимо:

Код: Выделить всё
# Разрешаем изнутри все что угодно
pass on $int_if from any to any


например, если кто-то в сети заразится спам-трояном, внешний ip быстро попадет во всевозможные dnsbl...
к тому же, внутри сети тоже кулхацкеры попадаються, а такое правило откроет ему все порты на шлюзе..
Согласен. Но для маленьких сетей (а я думаю, новички не настраивают фаервол в больших сетях) сойдет. Там в статье Лиса есть второй конфиг посложней, я его тоже собираюсь переделать под pf, как руки дойдут.

Re: Настройка pf

Добавлено: 2008-03-24 0:45:38
voider
Dog писал(а):
voider писал(а):эт с каго перепугу нету diverta v pf ? он отродясь там :) нат встроен в файвол :)
А я не о nat'е говорил, а о возможности перенаправлять пакеты в divert socket. В 7-ке для nat'а это уже на фиг не требуется, а фича иногда бывает очень нужной.
для этого есть rdp в pf