pf и группировка интерфейсов

Нужно объединить несколько tun'ов (tun0, tun1, ... tun20) в одно правило. Где-то прочёл, что можно использовать так
[code]
pass on tun ..
[/code]
но не работает. Как всё-таки правильно прописать?

Аватар пользователя paranoik

Макросы предлагаю попробовать

1) Теоретическая часть (много текста!)
Цитата:
"Макросы это определяемые пользователем переменные, которые могут содержать IP адреса, номера портов, названия интерфейсов, и т.д. Макросы уменьшают запутанность правил PF и могут сделать поддержку правил более проще.
Имена макросов должны начинаться с буквы и могут содержать цифры, буквы и символы подчёркивания. Имена макросов не могут содержать такие слова, как pass, out, или queue.

ext_if = "fxp0"

block in on $ext_if from any to any

Это правило создаст макрос, под названием ext_if. Когда обращаются к макросу, после того, как он был создан, перед его именем стоит знак $.

Также макросы могут развёртываться в списки

friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"

Макросы могут быть заданы рекурсивно. Используется следующий синтаксис:

host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"

Макрос $all_hosts теперь развёртывается в 192.168.1.1, 192.168.1.2. "
взято отсюда: http://www.openbsd.org/faq/pf/ru/macros.html
2) Как это можно применить на практике (мои скромные мысли, много текста):
Сделаем
sudo vi /etc/pf.conf
чтобы отредактировать самый важный файл.
Добавим две строчки, строчка первая, фактически - комментарий, но настоятельно рекомендую
комментировать все изменения в важных конфигурационных файлах, итак первая стока:
### dobavim macros dlya tun-interfeisov
а следующей строкой добавим наш макрос, в котором определим все нужные нам туннельные интерфейсы (в приведённом ниже примере первые пять туннельных интерфейсов) в одной переменной, итак, вторая строка:
all_tuns="{ tun0 tun1 tun2 tun3 tun4 }"
И, о дивное чудо, теперь переменная $all_tuns будет развёртываться в указанные туннельные устройста, в каждое из пяти упомянутых!
Для примера: заблокируем всё для этих пяти интерфейсов:
block in on $all_tuns from any to any
сия строчка заблокирует всё для входа tun0, tun1, tun2, tun3 и, конечно же, tun4.
Как изменять макросы? Вопрос риторический, как кому удобнее, а уж возможностей для редактирования макросов предостаточно, сам предпочитаю вручную править конфигурационный файл (да, именно волшебной командой
sudo vi /etc/pf.conf
грешен, не без того).
Однако иногда пользуюсь и чудесной утилитой pfctl с ключом -D.
Для примера: предположим, нужно добавить шестое туннельное устройство, стало быть редактирования макроса не избежать, делаем так:
pfctl -D all_tuns="{ tun0 tun1 tun2 tun3 tun4 tun5 }"
И в наш макрос добавилось ещё одно (шестое по счёту) туннельное устройство.
3) Вместо эпилога
Почему я использую макросы? Потому что могу!
Это удобно(имхо), макросы "и как ими пользоваться" - прекрасно документированная тема, это экономит время и нервы!
Чтобы не быть голословным, прилагаю ссылки на документацию (на русском) о макросоводстве в пакетфильтроведении:
http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html#pf-pf.conf-macro
http://www.openbsd.org/faq/pf/ru/macros.html
С уважением и скажите, это то, что вы спрашивали?

Аватар пользователя skeletor

Про макросы я

Про макросы я знаю, но у меня иногда доходит до 20 tun'ов. И не очень удобно добавлять каждый раз.
Про заметку спасибо.
Кстати, макрос pfctl -D ... добавляет только в текущие загруженные правила, а не в конфиг. То есть при ребуте все tun'ы, добавленные таким образом исчезнут. Или я неправ?

Аватар пользователя Mitsik

Да

Да исчезнут.

Насколько я понял вам лучше всего использовать группы интерфейсов:
В файлы hostname.tun0 ….. hostname.tun99
Внести строчку group asdf

inet 10.10.10.10 255.0.0.0
group asdf

Тогда в правилах можно будет ссылаться не на $дофига_тунов, а на группу в которой они состоят
Примерно вот так:

pass in on asdf from any to any

кстати говоря название группы не более 15 символов и не должны заканчиваться цифрами.

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

- Cloned interfaces are members of their interface
family group. For example, a PPP interface such
as ppp0 is a member of the ppp interface family
group.
- The interface(s) the default route(s) point to
are members of the egress interface group.

Аватар пользователя skeletor

Вот как раз это

Вот как раз это и читал. Спасибо, ещё раз посмотрю правила внимательнее.