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

Помогите приручить pf

Добавлено: 2008-04-27 21:58:44
User
Убил выходные, но так и не получилось.
Решил разобраться с pf, т.к. появилась необходимость в использовании altq.
Сразу, знание ipfw, сыграло злую шутку из-за включенного по умолчанию keep state во всех правилах pf. В слествии этого не работают все примеры нарытые в инете. Быстрое курение манов по pf не спасло. Более тщательное курение манов дало заветный ключ no state (который не описывается отдельно в опциях управления состоянием и только один раз упоминается в тексте и при беглом просмотре просто не заметен) и то, что при входящем пакете, если для него есть запись в таблице состоаний, то он сразу пропускается минуя все правила. Т.е. по-умолчанию если клиент инициализирует соединение, то пакет попадает под правило:

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

pass in on $int_if from $net to any
Делается запись в таблице состояний и теперь даже исходящий в локалку трафик будет идти через это правило, т.е. на правиле:

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

pass out on $int_if from any to $net
будет 0.
Такой вариант не дает возможность резать исходящий к клиенту трафик.
Использование no state дало контроль над исходящими пакетами внутреннего интерфеса и применения к нему altq.
Всё заработало, причем довольно хорошо.
Радость от работы закончиласть когда редиректом завернул весь http трафик на squid. Опять таки в манах есть упоминание того, что nat, binat и rdr также содержат keep state по-умолчанию. Т.е. опять получется так, что при редиректе на squid делается запись в таблицу состояния и весть траф от прокси идет через входящее правило на внутреннем интерфейсе. И вот тут засада: в rdr нету опций отключения keep state.
Ну вот собственно и вопрос: как сделать редирект на прокси и при этом получить контроль над выходящим трафиком с внутреннего интерфейса?

Re: Помогите приручить pf

Добавлено: 2008-04-27 22:43:29
dikens3
Странно, я всегда сам прописывал keep state для необходимых правил. Наверное это умолчание в основном конфиге указывается.
Ну вот собственно и вопрос: как сделать редирект на прокси и при этом получить контроль над выходящим трафиком с внутреннего интерфейса?
Я плохо с ним знаком. Не в курсе.

Re: Помогите приручить pf

Добавлено: 2008-04-27 22:53:50
Daywalker
dikens3 писал(а):Странно, я всегда сам прописывал keep state для необходимых правил. Наверное это умолчание в основном конфиге указывается.
В 7-ой версии Фри добавилось у pf к каждому правилу flags S/SA keep state по умолчанию. (Если я правильно помню прочитанные изменения)

Re: Помогите приручить pf

Добавлено: 2008-04-27 23:11:44
dikens3
Тогда это только для TCP.

Re: Помогите приручить pf

Добавлено: 2008-04-27 23:27:04
Гость
dikens3 писал(а):Странно, я всегда сам прописывал keep state для необходимых правил.
Так это да. Но тут ключевое слово необходимых. А необходимы они только для выпуска пакета в мир.
Daywalker писал(а):В 7-ой версии Фри добавилось у pf к каждому правилу flags S/SA keep state по умолчанию. (Если я правильно помню прочитанные изменения)
Я тоже это нашёл, правда после дня ломания головы и пытания понять логику работы фаервола.

Re: Помогите приручить pf

Добавлено: 2008-04-28 1:02:54
Dog
В 7-ке pf подогнан под версию из OpenBSD 4.1, там действительно keep state по умолчанию везде включен - см. список новшеств в 7-ке на официальном сайте FreeBSD и список новшеств файрвола соответствующей версии на офф. сайте OpenBSD. Лечится директивой no state.

Re: Помогите приручить pf

Добавлено: 2008-04-28 1:19:07
User
Dog писал(а):В 7-ке pf подогнан под версию из OpenBSD 4.1, там действительно keep state по умолчанию везде включен - см. список новшеств в 7-ке на официальном сайте FreeBSD и список новшеств файрвола соответствующей версии на офф. сайте OpenBSD. Лечится директивой no state.
В rdr нет опции no state.

Re: Помогите приручить pf

Добавлено: 2008-04-28 1:25:56
Dog
Извиняюсь, я действительно неправ - криво просмотрел первый пост, наверно пора спать ложиться :)
Да, действительно для rdr директива no state не срабатывает. В данном случае лучше наверно будет поискать ответ на вопрос на ресурсах, посвященных OpenBSD - в 7-ке пока по pf'у документация не шибко подогнана до актуального состояния.

Re: Помогите приручить pf

Добавлено: 2008-04-28 14:59:37
User
Еще одно наблюдение.
Как написано в мане по pf rdr с параметром pass сразу пропускает пакет и делает ему keep state. Если ключегого слова pass нет, то пакет попадает в фильтры, но уже с измененным, согласно rdr, адресом назначения. Т.е. если было

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

192.168.0.10:12345 -> 10.10.10.10:80
то на фильтры попадёт

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

192.168.0.10:12345 -> 192.168.0.1:3128
Зная это прописал правило:

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

pass in on $int_if inet proto tcp from $net to $squid_ip port $squid_port no state
И на самом деле правило стало работать, НО даже при наличии опции no state все равно создаются записи в таблице состояния.

Re: Помогите приручить pf

Добавлено: 2008-05-14 23:51:48
Covax
Тему я начинал.
В общем, кому интересно, рассказываю как я решил эту проблему.
А проблема заключалась в том, что у меня, да и у многих я думаю, в FreeBSD ALTQ сразу ассоциируется с PF (благодаря интернету, наверное). Именно поэтому при возникновении необходимости в ALTQ, имея рабочий и настроенный ipfw, я полез копаться в PF. Но, как говорится: "А ларчик то просто открывался!". Настроенный ipfw переводится на работу с ALTQ за несколько минут. Теперь по порядку:
Естественно надо ядро с поддержкой ALTQ, а именно:

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

options		ALTQ
options		ALTQ_CBQ
options		ALTQ_RED
options		ALTQ_RIO
options		ALTQ_HFSC
options		ALTQ_CDNR
options		ALTQ_PRIQ
options		ALTQ_NOPCC #нужен для для SMP
options		ALTQ_DEBUG
PF для добавления очередей ALTQ (ipfw сам не умеет):

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

device		pf #обязательно
device		pflog #остальное по желанию
device		pfsync
Правим /etc/rc.conf и добавляем:

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

pf_enable="YES"
pf_rule="/etc/pf.conf"
В /etc/pf.conf только включаем altq и прописываем очереди.

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

altq on fxp1 bandwidth 1000Kb priq queue {def_out, http_out, game_out}
  queue def_out priority 1 priq(default red)
  queue http_out priority 2 priq(red)
  queue game_out priority 5 priq(red)

altq on fxp0 bandwidth 1000Kb cbq queue {def_in, admin_in, buh_in, usr_in, server_in}
  queue def_in bandwidth 10Kb cbq(default borrow red)
  queue admin_in bandwidth 32Kb cbq(red)
  queue buh_in bandwidth 32Kb cbq(red)
  queue usr_in bandwidth 414Kb cbq(borrow red) {internet_in, game_in}
  queue internet_in bandwidth 286Kb cbq(borrow red)
  queue game_in bandwidth 128Kb priority 5 cbq(borrow red)
  queue server_in bandwidth 512Kb cbq(borrow red)
Пример тестовый, подробно описывать не буду, примеров с описанием множество.
Ну и теперь надо завернуть в очереди трафик из ipfw. При настроенном ipfw, делается это очень удобно через конструкцию count

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

ipfw add 1 count altq game_out all from any to any 8112 out via $ext_if
ipfw add 2 count altq game_in all from any 8112 to any out via int_if
Ну и т.д. Все, кто не попал в очередь идут в дефолтную.

Для удобства ставим pftop и радуемся работе ALTQ в ifpw.

Re: Помогите приручить pf

Добавлено: 2008-05-19 22:39:03
Alex Keda
публикуй.
зайди в раздел авторов на сайте - там всё написано.

Re: Помогите приручить pf

Добавлено: 2008-05-23 7:36:13
Осторожный

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

# ядро
device      pf #обязательно
device      pflog
#device      pfsync # pfsync не нужен

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

# rc.conf
pf_enable="YES"
# это не нужно # pf_rule="/etc/pf.conf"
# а логи если поставили, то надо включить
pflog_enable="YES"

Re: Помогите приручить pf

Добавлено: 2008-05-23 14:04:41
Covax
Осторожный писал(а):

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

# ядро
device      pf #обязательно
device      pflog
#device      pfsync # pfsync не нужен

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

# rc.conf
pf_enable="YES"
# это не нужно # pf_rule="/etc/pf.conf"
# а логи если поставили, то надо включить
pflog_enable="YES"
Я жутко извиняюсь, но это к чему? Проблему это не решит ни как, а в смысле написанного я очень сомневаюсь.
1. То ,что device pf обязательно я говорил.
2. device pflog нужен только если хотим логировать пакеты, но не обязателен.
3. А вот device pfsync может быть нужен в определённых случаях.
4. pf_rule="/etc/pf.conf" это для примера, если правила будут в другом файле.

Re: Помогите приручить pf

Добавлено: 2008-06-12 0:13:09
devchaos
Сделал как тут написано. Вопрос такой. Как можно проверить что оно работает? Посмотреть например как в ipfw pipe show?
И еще. Ежели канал полудуплексный как быть? Подскажите конфигом. Не асинхронный а именно в одну строну.
count altq делать перед divert в натд?

Re: Помогите приручить pf

Добавлено: 2008-06-12 2:06:38
Covax
devchaos писал(а):Как можно проверить что оно работает? Посмотреть например как в ipfw pipe show?
Установи pftop, там всё красиво показывается.
devchaos писал(а): ...count altq делать перед divert в натд?
В очередь надо загонять исходящий к клиентам трафик. Т.е. после nat, т.к. до него dst-ip будет ip сервера.

Re: Помогите приручить pf

Добавлено: 2008-06-12 2:17:23
devchaos
1. А можно ли заворачивать трафик не через ipfw а через pf при этом пусть работает natd + фильтрация в ipfw?
2. Если канал полудуплексный (радио) как быть?

Re: Помогите приручить pf

Добавлено: 2008-06-12 14:03:49
Covax
Так а смысл тогда использовать ipfw. Лучше всё на pf делать.

Re: Помогите приручить pf

Добавлено: 2008-06-12 14:22:40
paradox
некоторые закрученые конструкции без divert сделать нельзя
поэтому если у вас divert токо для ната что бы юзеры в нет ходили
то есть смысл все перевести на pf/ipfilter

Re: Помогите приручить pf

Добавлено: 2008-06-12 17:04:16
devchaos
Вопрос с полудуплексным каналом остался )

Re: Помогите приручить pf

Добавлено: 2008-06-12 17:12:35
paradox
ммм
опишите ситуацию что бы было более понятно
что там как
и в чем сложности
или вы еще ничего не делали?=)))

Re: Помогите приручить pf

Добавлено: 2008-06-12 17:27:01
devchaos
Как в примере

pf.conf

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

int_if="nve0"
ext_if="em0"

altq on $ext_if bandwidth 26Mb priq queue {def_out, game_out}
queue def_out priority 1 priq(default red)
queue game_out priority 5 priq(red)

altq on $int_if bandwidth 26Mb cbq queue {def_in, game_in}
queue def_in bandwidth 16Mb cbq(default borrow red)
queue game_in bandwidth 10Mb priority 7 cbq(borrow red)
Начало rc.firewall

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

ipfw add 30 divert natd all from any to any via em0
ipfw add 32 count altq game_out all from any to any 27015 out via em0
ipfw add 33 count altq game_in all from any 27015 to any out via nve0
Это для дуплексного канала.
Теперь хочу сделать для полудуплексного(wi-fi)

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

="nve0"
ext_if="em0"

altq on $ext_if bandwidth 26Mb priq queue {def_out, game_out, def_in, game_in}
queue def_out priority 1 priq(default red)
queue game_out priority 5 priq(red)
queue def_in priority 1 priq(red)
queue game_in priority 5 priq(red)
Так правильно? Но ведь ифейс всеравно $ext_if (
И еще. Если необходимо разделить поровну на всех канал без приоритетов как сделать?

Re: Помогите приручить pf

Добавлено: 2008-06-12 17:47:15
paradox

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

ipfw add 30 divert natd all from any to any via em0
ipfw add 32 count altq game_out all from any to any 27015 out via em0
ipfw add 33 count altq game_in all from any 27015 to any out via nve0
это и pf умеет
зачем вам два фаервола? если вы в одном неможете разобраться

ext_if2 назовите
невижу проблемы

разделить на всех - это на кого?
на всех у кого уникальный порт
на всех у кгого уникальный айпи
на всех кто у группе по маске айпи
итд
=)
учите pf
где то статья была на русском
нужно поискать


pf это не только очереди
это еще и фаервол

-----------------
ps: нужна статья для всех новичков, о том какие фаеры есть в bsd, какие у них возможности, и какой лучше использовать в той или иной ситуации, пример разных топологий и их реализации фаерами

Re: Помогите приручить pf

Добавлено: 2008-06-12 18:38:22
devchaos
Затем что шлюз обслуживает около 500 пользователей ipfw+natd. Простои недопустимы все "прикручивается" на рабочую машину.
Зачем? altq показался более гибким и монументальным нежели dummynet. dummynet не давал желаемого результата.

"ext_if2 назовите
невижу проблемы"
Какая разница как назвать ведь приоритеты будут только в одну сторону работать в таком случае. Хоть канал и полудуплексный но может и передавать/принимать пакеты. Или я неправильно вкуривал ман по pf, приоритеты работают только на исходящий трафик. Нужно на 2х ифейсах прикрутить приоритеты в исходящем направлении.

"разделить на всех - это на кого?"
На каждого пользователя внутри сети. По айпи адресу локальному. Можно по маске по аналогии как для dummynet.

Собсно вот полня задача.
Есть 3 группы пользователей. 3 таблицы с айпишнегами соответственно.
Есть один пайп с пропускной способностью 26Mb
Есть 3 очереди с weight 50, 40, 10 которые в пайпе общем.
Каждый пользователь из соответсвующей таблицы попадает в свою очередь и поулчает свой приоритет.
Все тоже самое только на altq нужно сделать. Для полнодуплексного канала понятно, примеров море. C полудуплексным как?

Re: Помогите приручить pf

Добавлено: 2008-06-12 18:53:04
paradox
красиво разрисовали
теперь точно так же
что вы хотите от пулудуплексного
каким образом его порезать и по какому правилу


насчет ipfw+natd
я же говорю
если это тупо трансляция для ната
что бы пользователи ходили в нет с локальной сети
то лучше сразу в pf
altq кстати с самого рождения был для pf
это его потом в ipfw добавили - возможность я имею ввиду

Re: Помогите приручить pf

Добавлено: 2008-06-12 19:06:19
devchaos
Полудуплексный канал нужно точно также приоритезировать.
2 интерфейса. em0 - к ней подключен радиомост аплинкера
nve0 - локальная сеть.
на pf перейдем если altq справится с поставленной задачей лучше чем dummynet, правила нужно будет переписать только и с ними пока вопросов небыло кроме самого altq.