Страница 1 из 1
pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-12 16:24:50
kabachok
Друзья, образовалась проблема.
Есть правило для заворачивания трафика на прозрачный 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, т.е. отрицания не срабатывают никакие. Как быть? Точнее почему не работает?
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-12 16:31:10
Larva
попробуй использовать таблицу
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-12 16:38:54
kabachok
Благодарствую.
Код: Выделить всё
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
Работает, но всё же не понятно почему не срабатывает просто отрицание.
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-12 16:40:59
Larva
полагаю что список в этом месте rdr использоват нельзя, не уверен.
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-12 16:48:33
terminus
Код: Выделить всё
{ !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/Булева_алгебра
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-12 16:50:19
Larva
как 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.
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-13 13:50:54
pimlab
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, т.е. отрицания не срабатывают никакие. Как быть? Точнее почему не работает?
а у вас тут вроде четыре правила получилось. два на под сеть и два на порт. поэтому одно из правил на под сеть всегда не срабатывало. в общем вы смотрели что в итоге получалось
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-13 16:52:37
lem
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
Re: pf не срабатывает перечисление отрицаний
Добавлено: 2010-08-13 17:00:47
lem
еще точнее - последняя строка развернется еще и по портам
то есть сработает для всех адресов кроме сетки 172.17.11.0/24 и только по порту 8080