pf не срабатывает перечисление отрицаний

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
kabachok
мл. сержант
Сообщения: 148
Зарегистрирован: 2009-01-20 2:13:18
Откуда: msk.ru
Контактная информация:

pf не срабатывает перечисление отрицаний

Непрочитанное сообщение kabachok » 2010-08-12 16:24:50

Друзья, образовалась проблема.

Есть правило для заворачивания трафика на прозрачный Squid

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

rdr on $int_if inet proto tcp from $ip_lan to !172.17.32.0/24 port { 80, 8080 } -> 127.0.0.1 port 3128
трафик идущий в 32 подсеть заворачивать не нужно. Это работает.

Далее я добавляю еще одно отрицание:

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

rdr on $int_if inet proto tcp from $ip_lan to { !172.17.32.0/24, !172.17.11.0/24 } port { 80, 8080 } -> 127.0.0.1 port 3128
и весь трафик идет на Squid, т.е. отрицания не срабатывают никакие. Как быть? Точнее почему не работает?
Мы стены ломаем силой ума. © Кирпичи.

Хостинговая компания 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/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/


Аватара пользователя
kabachok
мл. сержант
Сообщения: 148
Зарегистрирован: 2009-01-20 2:13:18
Откуда: msk.ru
Контактная информация:

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение kabachok » 2010-08-12 16:38:54

Благодарствую.

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

table <no_proxy> { !172.17.32.0/24, !172.17.11.0/24 }
rdr on $int_if inet proto tcp from $ip_lan to <no_proxy> port { 80, 8080 } -> 127.0.0.1 port 3128
Работает, но всё же не понятно почему не срабатывает просто отрицание.
Мы стены ломаем силой ума. © Кирпичи.

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

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение Larva » 2010-08-12 16:40:59

полагаю что список в этом месте rdr использоват нельзя, не уверен.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение terminus » 2010-08-12 16:48:33

Изображение

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

{ !172.17.32.0/24, !172.17.11.0/24 } = !(172.17.32.0/24 and 172.17.11.0/24)
как в пф записать операцию AND? так - () ?

короче по булевой алгебре операция НЕ 172.17.32.0/24 ИЛИ НЕ 172.17.11.0/24 логически преобразуется в НЕ (172.17.32.0/24 И 172.17.11.0/24). Это то, что вы хотели?

---

_http://ru.wikipedia.org/wiki/Булева_алгебра
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

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

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение Larva » 2010-08-12 16:50:19

как src_addr, dst_addr можно использовать

Адрес источника или назначения пакета. Возможные варианты:

* Просто одиночный адрес IPv4, или IPv6
* Сеть в формате CIDR
* Полностью разрешённое доменное имя (FQDN), которое будет разрешено через DNS при загрузке правила. Все адреса соответствующие данному имени будут помещены в данное правило.
* Имя интерфейса или группы. Все адреса закреплённые за интерфейсом будут подставлены в правило.
* Имя интерфейса, за которым идёт /netmask (например /24). Ко всем адресам закреплённым за данным интерфейсом, будет добавлена данная сетевая маска, и полученные сети CIDR будут добавлены в данное правило.
* Имя сетевого интерфейса или группы, взятое в круглые скобки (...). Данное правило будет автоматически меняться при смене адреса закреплённого за интерфейсом. Это может быть полезно, например, для DHCP клиентов.
*

Имя сетевого интерфейса, за которым идёт один из следующих модификаторов:

:network
Замещается сетью CIDR закреплённой за данным интерфейсом
:broadcast
Замещается широковещательным адресом закреплённым за данным интерфейсом
:peer
Замещается адресом партнёра для point-to-point интерфейса.

Кроме того, за именем интерфейса или за любым из перечисленных выше модификаторов, может следовать модификатор :0, указывающий на то, что нас не интересуют алиасы, т.е. дополнительные адреса, котрые можно добавить к сетевому интерфейсу (см. Раздел 6.15, «Знание как и когда устанавливать или удалять алиасы сетевого интерфейса»). Например: fxp0:network:0.
* Таблица
* Любая из приведённых выше конструкций с символом отрицания — !.
* Перечень конструкций с использованием списка.
* Ключевое слово any, означающее все адреса.
* Ключевое слово all, которое является эквивалентом конструкции from any to any.

pimlab
прапорщик
Сообщения: 477
Зарегистрирован: 2007-10-09 11:31:03

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение pimlab » 2010-08-13 13:50:54

kabachok писал(а):
Далее я добавляю еще одно отрицание:

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

rdr on $int_if inet proto tcp from $ip_lan to { !172.17.32.0/24, !172.17.11.0/24 } port { 80, 8080 } -> 127.0.0.1 port 3128
и весь трафик идет на Squid, т.е. отрицания не срабатывают никакие. Как быть? Точнее почему не работает?
а у вас тут вроде четыре правила получилось. два на под сеть и два на порт. поэтому одно из правил на под сеть всегда не срабатывало. в общем вы смотрели что в итоге получалось

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

pfctl -sn

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

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение lem » 2010-08-13 16:52:37

kabachok писал(а):Друзья, образовалась проблема.

...
Далее я добавляю еще одно отрицание:

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

rdr on $int_if inet proto tcp from $ip_lan to { !172.17.32.0/24, !172.17.11.0/24 } port { 80, 8080 } -> 127.0.0.1 port 3128
и весь трафик идет на Squid, т.е. отрицания не срабатывают никакие. Как быть? Точнее почему не работает?
эта строка развернется в 2 строки

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

rdr on $int_if inet proto tcp from $ip_lan to !172.17.32.0/24 port { 80, 8080 } -> 127.0.0.1 port 3128
rdr on $int_if inet proto tcp from $ip_lan to !172.17.11.0/24 port { 80, 8080 } -> 127.0.0.1 port 3128
в результате сработает только последняя
http://91.192.71.196/BSDCert/BSDA-course/apcs02.html

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

Re: pf не срабатывает перечисление отрицаний

Непрочитанное сообщение lem » 2010-08-13 17:00:47

еще точнее - последняя строка развернется еще и по портам
то есть сработает для всех адресов кроме сетки 172.17.11.0/24 и только по порту 8080