Настройка pf

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

Настройка pf

Непрочитанное сообщение princeps » 2008-03-17 18:45:41

Коллеги, возникла необходимость настроить 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, может что-то пропустил или недостаточно оптимально сделал. Может что добавить нужно.
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

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

Непрочитанное сообщение dikens3 » 2008-03-17 22:17:57

Сам один раз написал фаер на 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. И статью лучше не надо, по ссылке много чего уже есть, а нового ты ничего не скажешь.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

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

Непрочитанное сообщение princeps » 2008-03-17 22:43:29

dikens3 писал(а): Выставляй везде quick, будет работать как в ipfw.
Если б я хотел, чтоб было как в ipfw, я б поставил ipfw :).
dikens3 писал(а):# Отключаем pf для локального интерфейса set skip on lo# Нормализация всего входящего трафикаscrub in all
Учту, спасибо.
dikens3 писал(а): И статью лучше не надо, по ссылке много чего уже есть, а нового ты ничего не скажешь.
Ммм, вот по ipfw тоже до хрена всего написано, а все-таки сатьей Лиса пользуются же люди. Главное достоинство - что она проста и понятна для новичков, копипастишь и все работает - нет необходимости pass any to any. Ну, это я так думаю. Кто-нибудь еще как считает, нужна ли подобная статья про pf?
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

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

Непрочитанное сообщение dikens3 » 2008-03-17 23:26:20

Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Dog
лейтенант
Сообщения: 723
Зарегистрирован: 2006-09-21 10:34:36
Откуда: Kharkiv, Ukraine
Контактная информация:

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

Непрочитанное сообщение Dog » 2008-03-18 14:32:50

dikens3 писал(а):Выставляй везде quick, будет работать как в ipfw. И статью лучше не надо, по ссылке много чего уже есть, а нового ты ничего не скажешь.
А смысл превращать pf в ipfw? У этих файрволов совершенно разный дзен, который прохавать желательно :)
quick имеет необходимость ставить для того что требует максимальной скорости: ssh, dns, tftf и им подобным. Все остальное - пусть топает по правилам, которые ужесточаются по мере прохождения файрвола. Применяется последнее из подходящих правил, по ходу цепочки можно сколь угодно гибкие конструкции делать.
Oh my God, they killed init! Bastards!

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

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

Непрочитанное сообщение princeps » 2008-03-18 15:27:28

Dog писал(а):А смысл превращать pf в ipfw?
Вот и я о том же.
Dog писал(а):У этих файрволов совершенно разный дзен
Приведенный выше конфиг канает под дзен pf?
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

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

Непрочитанное сообщение dikens3 » 2008-03-18 17:04:36

princeps писал(а):
Dog писал(а):А смысл превращать pf в ipfw?
Вот и я о том же.
Dog писал(а):У этих файрволов совершенно разный дзен
Приведенный выше конфиг канает под дзен pf?
Вот блин наехали ещё. Я вроде не говорил что PF нужно использовать именно так. На мой взгляд так проще делать переход с ipfw. По крайней мере правила научишься составлять, pfctl изучишь, nat, глобальные настройки и т.п.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Dog
лейтенант
Сообщения: 723
Зарегистрирован: 2006-09-21 10:34:36
Откуда: Kharkiv, Ukraine
Контактная информация:

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

Непрочитанное сообщение Dog » 2008-03-18 21:19:27

princeps писал(а):Приведенный выше конфиг канает под дзен pf?
Откуда ж я знаю? Дзен - его нельзя объяснить или продемонстрировать, его только постичь можно - на то он и дзен :)
dikens3 писал(а):Вот блин наехали ещё. Я вроде не говорил что PF нужно использовать именно так. На мой взгляд так проще делать переход с ipfw. По крайней мере правила научишься составлять, pfctl изучишь, nat, глобальные настройки и т.п.
Зачем же сразу так близко с сердцу принимать? Я просто личное мнение о файрволах высказал, насколько это дело воспринимаю.
Сам в свое время с ipfw на pf переходил, намучился, долго не мог прохавать глубинного смысла прохода правила до конца цепочки, потом вперло. А вот объяснить на пальцах - не могу. Все понимаю, а сказать не могу - оправдываю ник :)
Oh my God, they killed init! Bastards!

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

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

Непрочитанное сообщение princeps » 2008-03-19 9:08:17

Вот ты, Dog, раз переходил, как считаешь, стоит писать подобную статью для новичков? И что все-таки по поводу конфига - имеет он право на жизнь?
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Аватара пользователя
Dog
лейтенант
Сообщения: 723
Зарегистрирован: 2006-09-21 10:34:36
Откуда: Kharkiv, Ukraine
Контактная информация:

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

Непрочитанное сообщение Dog » 2008-03-19 12:42:53

2princeps: Работает - значит имеет. :)

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

Аватара пользователя
voider
лейтенант
Сообщения: 830
Зарегистрирован: 2008-02-21 20:35:03
Откуда: msk

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

Непрочитанное сообщение voider » 2008-03-20 19:42:08

хорошая статейка , правльно прально пора уже переходить на pf :) а консерваторы пусть нервно курят в сторонке :)

Аватара пользователя
Dog
лейтенант
Сообщения: 723
Зарегистрирован: 2006-09-21 10:34:36
Откуда: Kharkiv, Ukraine
Контактная информация:

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

Непрочитанное сообщение Dog » 2008-03-20 19:56:23

Не согласен. Если инструмент себя оправдывает - то смысла его менять нет никакого. Тем более что у ipfw есть фичи, которых в pf нет и пока вряд-ли предвидится: divert, например. А учитывая что в 7-ке на него наконец-то нормальный nat прикрутили, что он теперь с таблицами умеет работать, пакеты помечать... В общем, если хватает его возможностей - работать с ним еще и работать. Особенно если система с netgraph'ом повязана.
Хотя pf-овская логика ИМХО гибче и мощней. Во всяком случае после того как я на этот файрвол перешел у меня не было нужды использовать особенности ipfw.
Oh my God, they killed init! Bastards!

Аватара пользователя
voider
лейтенант
Сообщения: 830
Зарегистрирован: 2008-02-21 20:35:03
Откуда: msk

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

Непрочитанное сообщение voider » 2008-03-20 23:58:07

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

Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-03-21 1:10:30

такое только в режиме тестирования приемлимо:

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

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

Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-03-21 2:04:51

а ну и еще:

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

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:
TMTOWTDI

Аватара пользователя
Dog
лейтенант
Сообщения: 723
Зарегистрирован: 2006-09-21 10:34:36
Откуда: Kharkiv, Ukraine
Контактная информация:

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

Непрочитанное сообщение Dog » 2008-03-21 8:49:00

voider писал(а):эт с каго перепугу нету diverta v pf ? он отродясь там :) нат встроен в файвол :)
А я не о nat'е говорил, а о возможности перенаправлять пакеты в divert socket. В 7-ке для nat'а это уже на фиг не требуется, а фича иногда бывает очень нужной.
Oh my God, they killed init! Bastards!

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

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

Непрочитанное сообщение princeps » 2008-03-21 10:37:25

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

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


например, если кто-то в сети заразится спам-трояном, внешний ip быстро попадет во всевозможные dnsbl...
к тому же, внутри сети тоже кулхацкеры попадаються, а такое правило откроет ему все порты на шлюзе..
Согласен. Но для маленьких сетей (а я думаю, новички не настраивают фаервол в больших сетях) сойдет. Там в статье Лиса есть второй конфиг посложней, я его тоже собираюсь переделать под pf, как руки дойдут.
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Аватара пользователя
voider
лейтенант
Сообщения: 830
Зарегистрирован: 2008-02-21 20:35:03
Откуда: msk

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

Непрочитанное сообщение voider » 2008-03-24 0:45:38

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