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

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
User
проходил мимо

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

Непрочитанное сообщение User » 2008-04-27 21:58:44

Убил выходные, но так и не получилось.
Решил разобраться с 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.
Ну вот собственно и вопрос: как сделать редирект на прокси и при этом получить контроль над выходящим трафиком с внутреннего интерфейса?

Хостинговая компания 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-04-27 22:43:29

Странно, я всегда сам прописывал keep state для необходимых правил. Наверное это умолчание в основном конфиге указывается.
Ну вот собственно и вопрос: как сделать редирект на прокси и при этом получить контроль над выходящим трафиком с внутреннего интерфейса?
Я плохо с ним знаком. Не в курсе.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Daywalker
ст. сержант
Сообщения: 326
Зарегистрирован: 2007-03-11 22:28:45
Откуда: г. Котельники, МО
Контактная информация:

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

Непрочитанное сообщение Daywalker » 2008-04-27 22:53:50

dikens3 писал(а):Странно, я всегда сам прописывал keep state для необходимых правил. Наверное это умолчание в основном конфиге указывается.
В 7-ой версии Фри добавилось у pf к каждому правилу flags S/SA keep state по умолчанию. (Если я правильно помню прочитанные изменения)
http://blog.volobuev.su - Блог о системном и сетевом администрировании.

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

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

Непрочитанное сообщение dikens3 » 2008-04-27 23:11:44

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

Гость
проходил мимо

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

Непрочитанное сообщение Гость » 2008-04-27 23:27:04

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

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

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

Непрочитанное сообщение Dog » 2008-04-28 1:02:54

В 7-ке pf подогнан под версию из OpenBSD 4.1, там действительно keep state по умолчанию везде включен - см. список новшеств в 7-ке на официальном сайте FreeBSD и список новшеств файрвола соответствующей версии на офф. сайте OpenBSD. Лечится директивой no state.
Oh my God, they killed init! Bastards!

User
проходил мимо

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

Непрочитанное сообщение User » 2008-04-28 1:19:07

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

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

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

Непрочитанное сообщение Dog » 2008-04-28 1:25:56

Извиняюсь, я действительно неправ - криво просмотрел первый пост, наверно пора спать ложиться :)
Да, действительно для rdr директива no state не срабатывает. В данном случае лучше наверно будет поискать ответ на вопрос на ресурсах, посвященных OpenBSD - в 7-ке пока по pf'у документация не шибко подогнана до актуального состояния.
Oh my God, they killed init! Bastards!

User
проходил мимо

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

Непрочитанное сообщение User » 2008-04-28 14:59:37

Еще одно наблюдение.
Как написано в мане по 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 все равно создаются записи в таблице состояния.

Covax
мл. сержант
Сообщения: 131
Зарегистрирован: 2008-04-27 23:54:31
Откуда: Витебск, Беларусь
Контактная информация:

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

Непрочитанное сообщение Covax » 2008-05-14 23:51:48

Тему я начинал.
В общем, кому интересно, рассказываю как я решил эту проблему.
А проблема заключалась в том, что у меня, да и у многих я думаю, в 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.
Последний раз редактировалось Covax 2008-05-20 17:51:57, всего редактировалось 1 раз.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35070
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-19 22:39:03

публикуй.
зайди в раздел авторов на сайте - там всё написано.
Убей их всех! Бог потом рассортирует...

Осторожный
проходил мимо

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"
Последний раз редактировалось Alex Keda 2008-05-23 10:58:04, всего редактировалось 1 раз.
Причина: [code][/code] - для кого?

Covax
мл. сержант
Сообщения: 131
Зарегистрирован: 2008-04-27 23:54:31
Откуда: Витебск, Беларусь
Контактная информация:

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

Непрочитанное сообщение Covax » 2008-05-23 14:04:41

Осторожный писал(а):

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

# ядро
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" это для примера, если правила будут в другом файле.

devchaos
рядовой
Сообщения: 17
Зарегистрирован: 2008-06-10 2:58:21
Контактная информация:

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

Непрочитанное сообщение devchaos » 2008-06-12 0:13:09

Сделал как тут написано. Вопрос такой. Как можно проверить что оно работает? Посмотреть например как в ipfw pipe show?
И еще. Ежели канал полудуплексный как быть? Подскажите конфигом. Не асинхронный а именно в одну строну.
count altq делать перед divert в натд?
Высокоскоростной Интернет. Коцюбинское, Беличи. http://www.cagg.org.ua

Covax
мл. сержант
Сообщения: 131
Зарегистрирован: 2008-04-27 23:54:31
Откуда: Витебск, Беларусь
Контактная информация:

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

Непрочитанное сообщение Covax » 2008-06-12 2:06:38

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

devchaos
рядовой
Сообщения: 17
Зарегистрирован: 2008-06-10 2:58:21
Контактная информация:

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

Непрочитанное сообщение devchaos » 2008-06-12 2:17:23

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

Covax
мл. сержант
Сообщения: 131
Зарегистрирован: 2008-04-27 23:54:31
Откуда: Витебск, Беларусь
Контактная информация:

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

Непрочитанное сообщение Covax » 2008-06-12 14:03:49

Так а смысл тогда использовать ipfw. Лучше всё на pf делать.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2008-06-12 14:22:40

некоторые закрученые конструкции без divert сделать нельзя
поэтому если у вас divert токо для ната что бы юзеры в нет ходили
то есть смысл все перевести на pf/ipfilter

devchaos
рядовой
Сообщения: 17
Зарегистрирован: 2008-06-10 2:58:21
Контактная информация:

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

Непрочитанное сообщение devchaos » 2008-06-12 17:04:16

Вопрос с полудуплексным каналом остался )
Высокоскоростной Интернет. Коцюбинское, Беличи. http://www.cagg.org.ua

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2008-06-12 17:12:35

ммм
опишите ситуацию что бы было более понятно
что там как
и в чем сложности
или вы еще ничего не делали?=)))

devchaos
рядовой
Сообщения: 17
Зарегистрирован: 2008-06-10 2:58:21
Контактная информация:

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

Непрочитанное сообщение devchaos » 2008-06-12 17:27:01

Как в примере

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 (
И еще. Если необходимо разделить поровну на всех канал без приоритетов как сделать?
Высокоскоростной Интернет. Коцюбинское, Беличи. http://www.cagg.org.ua

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2008-06-12 17:47:15

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

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, какие у них возможности, и какой лучше использовать в той или иной ситуации, пример разных топологий и их реализации фаерами

devchaos
рядовой
Сообщения: 17
Зарегистрирован: 2008-06-10 2:58:21
Контактная информация:

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

Непрочитанное сообщение devchaos » 2008-06-12 18:38:22

Затем что шлюз обслуживает около 500 пользователей ipfw+natd. Простои недопустимы все "прикручивается" на рабочую машину.
Зачем? altq показался более гибким и монументальным нежели dummynet. dummynet не давал желаемого результата.

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

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

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

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

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

Непрочитанное сообщение paradox » 2008-06-12 18:53:04

красиво разрисовали
теперь точно так же
что вы хотите от пулудуплексного
каким образом его порезать и по какому правилу


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

devchaos
рядовой
Сообщения: 17
Зарегистрирован: 2008-06-10 2:58:21
Контактная информация:

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

Непрочитанное сообщение devchaos » 2008-06-12 19:06:19

Полудуплексный канал нужно точно также приоритезировать.
2 интерфейса. em0 - к ней подключен радиомост аплинкера
nve0 - локальная сеть.
на pf перейдем если altq справится с поставленной задачей лучше чем dummynet, правила нужно будет переписать только и с ними пока вопросов небыло кроме самого altq.
Высокоскоростной Интернет. Коцюбинское, Беличи. http://www.cagg.org.ua