URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 83160
[ Назад ]

Исходное сообщение
"PF и динамически создаваемые интерфейсы."

Отправлено GHopper , 02-Дек-08 12:41 
Здравствуйте!

# uname -a
FreeBSD gh_gate.home 7.0-RELEASE FreeBSD 7.0-RELEASE #4: Mon Dec  1 23:15:46 UTC 2008     ghopper@gh_gate.home:/usr/src/sys/i386/compile/gh_kernel  i386
#

Ядро соброно с PF. Правила написаны и все чудесно работает. Машиня является шлюзом для локальной сети: два провайдера (PPPOE, PPTP) и некоторое кол-во клиентов (PPTP). Всеми подключениями разруливает mpd5.

Проблема в том, что при старте системы имеются только четыре интерфейса - два до провайдера, один в локалку и lo. На них правила pf вешаются без проблем. А вот если мне при старте пытаться подсовывать ему правила на ngX-интерфейсы (которые создает mpd), то PF вообще игнорирует весь файл с правилами (замечу, что на ipfw такой маневр проходил). Собственно вопрос - как добавлять/удалять правила к уже имеющимся в PF?

В ipfw можно было легко манипулировать правилами путем добавления под любым порядковым номером и удаления любого порядкового номера. В PF есть возможность динамического изменения таблиц и макросов, но как добавлять сами правила?

Короче хочу выслушать вашу точку зрения по данному вопросу.

P.S. еще хотелось бы узнать как быть с резолвингом доменных имен в процессе загрузки? Есть решения?


Содержание

Сообщения в этом обсуждении
"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 04-Дек-08 04:58 
Для ответа на вопрсо нужен всего-навсего хоть какой-то опыт работы с PF. Базовые функции добавить/удалить правила. Неужели нету таких? Куда подевался народ с форума??? Ко всем хочу...

"PF и динамически создаваемые интерфейсы."
Отправлено reader , 04-Дек-08 12:53 
>Для ответа на вопрсо нужен всего-навсего хоть какой-то опыт работы с PF.
>Базовые функции добавить/удалить правила. Неужели нету таких? Куда подевался народ с
>форума??? Ко всем хочу...

http://www.opennet.me/base/sec/pf_extended.txt.html#top3


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 04-Дек-08 13:03 
>>Для ответа на вопрсо нужен всего-навсего хоть какой-то опыт работы с PF.
>>Базовые функции добавить/удалить правила. Неужели нету таких? Куда подевался народ с
>>форума??? Ко всем хочу...
>
>http://www.opennet.me/base/sec/pf_extended.txt.html#top3

Хех... много раз читал это подзаголовок, но считал, что это модные фишки, до которых мне еще рано )
Спасибо, добрый человек!


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 05-Дек-08 15:23 

# cat pf.conf
icmp_types="{echoreq, unreach}"

block all

pass out from self to any keep state

pass quick inet proto icmp all icmp-type $icmp_types
#pass in inet proto tcp from 192.168.0.0/24 to any port = ssh flags S/SA keep state
anchor goodguys


# pfctl -f /etc/pf.conf


# echo "pass in proto tcp from 192.168.0.2 to any port 22" | pfctl -a goodguys:ssh -f -


# pfctl -a goodguys:ssh -sr
pass in inet proto tcp from 192.168.0.0/24 to any port = ssh flags S/SA keep state

Теперь с другой машины (из 192.168.0.0/24)


# ssh ghopper@192.168.0.1
ssh: connect to host 192.168.0.1 port 22: Connection timed out

Короче ситуация такая - основные правила выполняются (из pf.conf), в якоря новые правила записываются. Проблема в том, что правила из якорей не читаются (хотя, если их запиать в основное правило, то они отлично работают). Вот такая загагулина. Кто-нибудь подскажет что-нибудь дельное по данной проблеме?

P.S. ядро:


# cat /usr/src/sys/i386/conf/gh_kernel
...
# PF
device          pf
device          pflog
device          pfsync

options         ALTQ
options         ALTQ_CBQ                # Class Bases Queuing (CBQ)
options         ALTQ_RED                # Random Early Detection (RED)
options         ALTQ_RIO                # RED In/Out
options         ALTQ_HFSC               # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ               # Priority Queuing (PRIQ)
options         ALTQ_NOPCC              # Required for SMP build
##

options         NETGRAPH
options         NETGRAPH_BPF
options         NETGRAPH_BRIDGE
options         NETGRAPH_DEVICE
options         NETGRAPH_ECHO
options         NETGRAPH_EIFACE
options         NETGRAPH_ETHER
options         NETGRAPH_IFACE
options         NETGRAPH_KSOCKET
options         NETGRAPH_L2TP
options         NETGRAPH_MPPC_ENCRYPTION
options         NETGRAPH_NETFLOW
options         NETGRAPH_ONE2MANY
options         NETGRAPH_PPP
options         NETGRAPH_PPPOE
options         NETGRAPH_PPTPGRE
options         NETGRAPH_SOCKET
options         NETGRAPH_TCPMSS
options         NETGRAPH_TEE
options         NETGRAPH_TTY
options         NETGRAPH_VJC
#options         NETGRAPH_IPFW
#options         NETGRAPH_NAT

## ipfw options
#options IPFIREWALL
#options IPFIREWALL_VERBOSE
#options IPFIREWALL_VERBOSE_LIMIT=1000
#options IPDIVERT
#options DUMMYNET


"PF и динамически создаваемые интерфейсы."
Отправлено reader , 14-Дек-08 13:33 
>[оверквотинг удален]
>
>
 
># pfctl -f /etc/pf.conf
>

>
>
 
># echo "pass in proto tcp from 192.168.0.2 to any port 22"
>| pfctl -a goodguys:ssh -f -
>

>

вы же указали
anchor goodguys

echo "pass in proto tcp from 192.168.0.2 to any port 22" | pfctl -a goodguys -f -

>[оверквотинг удален]
>#options         NETGRAPH_NAT
>
>## ipfw options
>#options IPFIREWALL
>#options IPFIREWALL_VERBOSE
>#options IPFIREWALL_VERBOSE_LIMIT=1000
>#options IPDIVERT
>#options DUMMYNET
>
>


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 31-Дек-08 16:48 
>[оверквотинг удален]
>>#options         NETGRAPH_NAT
>>
>>## ipfw options
>>#options IPFIREWALL
>>#options IPFIREWALL_VERBOSE
>>#options IPFIREWALL_VERBOSE_LIMIT=1000
>>#options IPDIVERT
>>#options DUMMYNET
>>
>>

действительно, если указывать


echo "pass in proto tcp from 192.168.0.2 to any port 22" | pfctl -a goodguys -f -

то все работает. Хотя в документации создают правило, а потом к нему именованные подправила пихают (через ":").
Тогда вопрос - как мне на якорь goodguys повесить правила отдельно для ng3 и ng4 интерфейса? Ведь это разные клиенты, поэтому при подключении/отключении каждого из них нужно соответственно добавлять/удалять правила? Кол-во клиентов заранее неизвестно.

"PF и динамически создаваемые интерфейсы."
Отправлено reader , 01-Янв-09 20:21 
>[оверквотинг удален]
>>>
>>>
>
>действительно, если указывать
>
 
>echo "pass in proto tcp from 192.168.0.2 to any port 22" |
>pfctl -a goodguys -f -
>

>то все работает. Хотя в документации создают правило, а потом к нему
>именованные подправила пихают (через ":").

помоему это не подправило, а другой якорь будет

>Тогда вопрос - как мне на якорь goodguys повесить правила отдельно для
>ng3 и ng4 интерфейса? Ведь это разные клиенты, поэтому при подключении/отключении
>каждого из них нужно соответственно добавлять/удалять правила? Кол-во клиентов заранее неизвестно.
>

делайте несколько якорей с условиями.
по поводу добавлять/удалять, если я правильно понял, то изменения правил в якоре происходит путем перезаписи всех правил в нем.


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 02-Янв-09 15:51 
>[оверквотинг удален]
>помоему это не подправило, а другой якорь будет
>
>>Тогда вопрос - как мне на якорь goodguys повесить правила отдельно для
>>ng3 и ng4 интерфейса? Ведь это разные клиенты, поэтому при подключении/отключении
>>каждого из них нужно соответственно добавлять/удалять правила? Кол-во клиентов заранее неизвестно.
>>
>
>делайте несколько якорей с условиями.
>по поводу добавлять/удалять, если я правильно понял, то изменения правил в якоре
>происходит путем перезаписи всех правил в нем.

совершенно правильно! При добавлении правила в якорь все имеющиеся в нем правила удаляются. Это не очень хорошо. Отсюдого вопрос - как в якорь добавить несколько правил? Причем может так получиться, что одно правило мне нужно добавить сейчас, а другое потом.

И еще такой момент:


echo "nat on ng0 from 192.168.1.2 to any -> (ng0)" | /sbin/pfctl -a "nat_pptp_client_anchor/ng2" -f -

В данном правиле ip-отправителя заменяется на ip ng0-интерфейса. А как быть, если у меня два интерфейса до провайдера и мне в одном случае нужно подставлять ip-адрес (первый провайдер) ng0-интерфейса, а в другом ng1 (второй провайдер). Сейчас получается, что пакеты выходят из разных интерфейсов (в соответствии с таблицей маршрутизации), а приходят всегда на какой-то один...


"PF и динамически создаваемые интерфейсы."
Отправлено reader , 03-Янв-09 14:47 
>[оверквотинг удален]
>>>
>>
>>делайте несколько якорей с условиями.
>>по поводу добавлять/удалять, если я правильно понял, то изменения правил в якоре
>>происходит путем перезаписи всех правил в нем.
>
>совершенно правильно! При добавлении правила в якорь все имеющиеся в нем правила
>удаляются. Это не очень хорошо. Отсюдого вопрос - как в якорь
>добавить несколько правил? Причем может так получиться, что одно правило мне
>нужно добавить сейчас, а другое потом.

а чем не устраивает : прочитать | изменить | записать ?
а если актуальные правила хранятся и в файле, на случай перезагрузки/выключения, то и того проще.
>
>И еще такой момент:
>

 
>echo "nat on ng0 from 192.168.1.2 to any -> (ng0)" | /sbin/pfctl -a "nat_pptp_client_anchor/ng2" -f -
>

>В данном правиле ip-отправителя заменяется на ip ng0-интерфейса. А как быть, если
>у меня два интерфейса до провайдера и мне в одном случае
>нужно подставлять ip-адрес (первый провайдер) ng0-интерфейса, а в другом ng1 (второй
>провайдер). Сейчас получается, что пакеты выходят из разных интерфейсов (в соответствии
>с таблицей маршрутизации), а приходят всегда на какой-то один...

от вас пакеты уходит через разные интерфейсы, а ответы возвращаются на один?
по моему это возможно , только если вы натите исходящие одним ip, хоть и отправляете через разных провайдеров


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 03-Янв-09 16:44 
>[оверквотинг удален]
>>В данном правиле ip-отправителя заменяется на ip ng0-интерфейса. А как быть, если
>>у меня два интерфейса до провайдера и мне в одном случае
>>нужно подставлять ip-адрес (первый провайдер) ng0-интерфейса, а в другом ng1 (второй
>>провайдер). Сейчас получается, что пакеты выходят из разных интерфейсов (в соответствии
>>с таблицей маршрутизации), а приходят всегда на какой-то один...
>
>от вас пакеты уходит через разные интерфейсы, а ответы возвращаются на один?
>
>по моему это возможно , только если вы натите исходящие одним ip,
>хоть и отправляете через разных провайдеров

1. "а чем не устраивает : прочитать | изменить | записать ?" А как это сделать? Допустим, в якоре имеется три правила. Нужно добавить еще одно. В скрипте читаю все правила в переменную, добавляю свое правило и строю конструкцию


echo $str | /sbin/pfctl -a "anchor/ng2" -f -

Как-то это не совсем то, о чем я думал... Как отделять одно правило от другого в $str?

2. "по моему это возможно , только если вы натите исходящие одним ip, хоть и отправляете через разных провайдеров". ip, присваеваемый проначеным пакетам прописывается в правилах nat. Отсюда проблема - как присвоить ip интерфейса, с которого уходит пакет, а не ip, прописанный в правиле nat?


"PF и динамически создаваемые интерфейсы."
Отправлено reader , 03-Янв-09 21:38 
>[оверквотинг удален]
>
>1. "а чем не устраивает : прочитать | изменить | записать ?"
>А как это сделать? Допустим, в якоре имеется три правила. Нужно
>добавить еще одно. В скрипте читаю все правила в переменную, добавляю
>свое правило и строю конструкцию
>
 
>echo $str | /sbin/pfctl -a "anchor/ng2" -f -
>

>Как-то это не совсем то, о чем я думал... Как отделять одно
>правило от другого в $str?

добавление ниже имеющихся, с сохранением в файле, что-то типа:
один раз создаем файл с текущими правилами:
pfctl -a anchor -sr > /путь/к/файлу

а потом только:
echo "добавляемое правило" | awk '{print $0}' /путь/к/файлу - | pfctl -a anchor -f - | pfctl -a anchor -sr > /путь/к/файлу


>
>2. "по моему это возможно , только если вы натите исходящие одним
>ip, хоть и отправляете через разных провайдеров". ip, присваеваемый проначеным пакетам
>прописывается в правилах nat. Отсюда проблема - как присвоить ip интерфейса,
>с которого уходит пакет, а не ip, прописанный в правиле nat?
>

-> {ng0}


"PF и динамически создаваемые интерфейсы."
Отправлено reader , 03-Янв-09 21:47 
если правила будут отличатся только ip адресом, посмотрите в сторону таблиц

"PF и динамически создаваемые интерфейсы."
Отправлено shutdown now , 05-Дек-08 15:33 
>[оверквотинг удален]
>PF?
>
>В ipfw можно было легко манипулировать правилами путем добавления под любым порядковым
>номером и удаления любого порядкового номера. В PF есть возможность динамического
>изменения таблиц и макросов, но как добавлять сами правила?
>
>Короче хочу выслушать вашу точку зрения по данному вопросу.
>
>P.S. еще хотелось бы узнать как быть с резолвингом доменных имен в
>процессе загрузки? Есть решения?

я такую фигню видел, когда пытаешься загрузить правила для pf, а в pf.conf присутствуют  настройки altq для несуществующих в настоящий момент интерфейсов.

можешь, например, так сделать:
# mpd.conf
#
l2tp_server_ext:
# Define dynamic IP address pool.
        set ippool add ext_pool 192.168.1.1 192.168.1.4

# Create clonable bundle template named B1
        create bundle template B1
        set iface disable proxy-arp
        set iface idle 0
        set iface enable tcpmssfix
        set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
        set ipcp ranges 192.168.0.0/32 ippool ext_pool
        set iface up-script /usr/local/etc/mpd5/up.sh
        set iface down-script /usr/local/etc/mpd5/down.sh

а в /usr/local/etc/mpd5/up.sh запихать любые комнады, вроде /sbin/pfctl -Fr -f /etc/pf.conf.pppoe


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 05-Дек-08 16:47 
>[оверквотинг удален]
>
># Specify IP address pool for dynamic assigment.
>        set ipcp ranges 192.168.0.0/32
>ippool ext_pool
>        set iface up-script /usr/local/etc/mpd5/up.sh
>
>        set iface down-script /usr/local/etc/mpd5/down.sh
>
>
>а в /usr/local/etc/mpd5/up.sh запихать любые комнады, вроде /sbin/pfctl -Fr -f /etc/pf.conf.pppoe

На эти грабли я уже наступал. После ребута системы PF запускается, но из pf.conf не загружается ни одного правила. Оставил в pf.conf только правила для физических интерфейсов, а в скрипты mpd прописал загрузку якорей для каждого из из поднимаемых интерфейсов. Т.е. сделал то, что вы и советуете.
А теперь у меня новые грабил! Если раньше правила не грузились, то теперь правила грузятся, но правила якорей игнорируются.


"PF и динамически создаваемые интерфейсы."
Отправлено GHopper , 09-Дек-08 13:06 
так и не победил проблему, но вот набрел на ветку форума (http://www.opennet.me/openforum/vsluhforumID10/2561.html), в которой рекомендуется для загрузки правил с несуществующими интерфейсами использовать скобки, т.е. вместо

int_if = "ng0"

нужно писать

int_if = "(ng0)"

Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных условия пока не могу - дома все. Кто-нибудь в курсе, насколько реален этот пример?


"PF и динамически создаваемые интерфейсы."
Отправлено ingoa , 14-Дек-08 23:14 
Так оно и есть. и в документации то ж написано
http://www.openbsd.org/faq/pf/example1.html

>[оверквотинг удален]
>int_if = "ng0"
>
>нужно писать
>

 
>int_if = "(ng0)"
>

>
>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>реален этот пример?


"PF и динамически создаваемые интерфейсы."
Отправлено shutdown now , 15-Дек-08 01:06 
>[оверквотинг удален]
>>int_if = "ng0"
>>
>>нужно писать
>>
 
>>int_if = "(ng0)"
>>

>>
>>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>>реален этот пример?

это на тот случай, когда у интерфейса ip меняется


"PF и динамически создаваемые интерфейсы."
Отправлено lis , 13-Фев-09 13:57 
>[оверквотинг удален]
>>>нужно писать
>>>
 
>>>int_if = "(ng0)"
>>>

>>>
>>>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>>>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>>>реален этот пример?
>
>это на тот случай, когда у интерфейса ip меняется

Не помогает пишет о синтаксической ошибке pf.conf, на все правила, где присутствует (ng0) :)). Че делатьто?


"PF и динамически создаваемые интерфейсы."
Отправлено odin , 16-Сен-09 22:53 
>[оверквотинг удален]
>>>>
>>>>
>>>>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>>>>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>>>>реален этот пример?
>>
>>это на тот случай, когда у интерфейса ip меняется
>
>Не помогает пишет о синтаксической ошибке pf.conf, на все правила, где присутствует
>(ng0) :)). Че делатьто?

Вот примерное использование скобок
pppoe_if="ng0"
...
nat on $pppoe_if ... -> ($pppoe_if)
...
pass in log on $pppoe_if from ($pppoe_if) to ....
...

а нужны они если меняется ip на интерфейсе ну и еще там для чего то