Здравствуйте!
# 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. Базовые функции добавить/удалить правила. Неужели нету таких? Куда подевался народ с форума??? Ко всем хочу...
>Для ответа на вопрсо нужен всего-навсего хоть какой-то опыт работы с PF.
>Базовые функции добавить/удалить правила. Неужели нету таких? Куда подевался народ с
>форума??? Ко всем хочу...
>>Для ответа на вопрсо нужен всего-навсего хоть какой-то опыт работы с PF.
>>Базовые функции добавить/удалить правила. Неужели нету таких? Куда подевался народ с
>>форума??? Ко всем хочу...
>
>http://www.opennet.me/base/sec/pf_extended.txt.html#top3Хех... много раз читал это подзаголовок, но считал, что это модные фишки, до которых мне еще рано )
Спасибо, добрый человек!
# 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 pfsyncoptions 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
>[оверквотинг удален]
>
>
># 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 goodguysecho "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
>
>
>[оверквотинг удален]
>>#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 интерфейса? Ведь это разные клиенты, поэтому при подключении/отключении каждого из них нужно соответственно добавлять/удалять правила? Кол-во клиентов заранее неизвестно.
>[оверквотинг удален]
>>>
>>>
>
>действительно, если указывать
>
>echo "pass in proto tcp from 192.168.0.2 to any port 22" |
>pfctl -a goodguys -f -
>
>то все работает. Хотя в документации создают правило, а потом к нему
>именованные подправила пихают (через ":").помоему это не подправило, а другой якорь будет
>Тогда вопрос - как мне на якорь goodguys повесить правила отдельно для
>ng3 и ng4 интерфейса? Ведь это разные клиенты, поэтому при подключении/отключении
>каждого из них нужно соответственно добавлять/удалять правила? Кол-во клиентов заранее неизвестно.
>делайте несколько якорей с условиями.
по поводу добавлять/удалять, если я правильно понял, то изменения правил в якоре происходит путем перезаписи всех правил в нем.
>[оверквотинг удален]
>помоему это не подправило, а другой якорь будет
>
>>Тогда вопрос - как мне на якорь 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 (второй провайдер). Сейчас получается, что пакеты выходят из разных интерфейсов (в соответствии с таблицей маршрутизации), а приходят всегда на какой-то один...
>[оверквотинг удален]
>>>
>>
>>делайте несколько якорей с условиями.
>>по поводу добавлять/удалять, если я правильно понял, то изменения правил в якоре
>>происходит путем перезаписи всех правил в нем.
>
>совершенно правильно! При добавлении правила в якорь все имеющиеся в нем правила
>удаляются. Это не очень хорошо. Отсюдого вопрос - как в якорь
>добавить несколько правил? Причем может так получиться, что одно правило мне
>нужно добавить сейчас, а другое потом.а чем не устраивает : прочитать | изменить | записать ?
а если актуальные правила хранятся и в файле, на случай перезагрузки/выключения, то и того проще.
>
>И еще такой момент:
>
>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, хоть и отправляете через разных провайдеров
>[оверквотинг удален]
>>В данном правиле ip-отправителя заменяется на ip ng0-интерфейса. А как быть, если
>>у меня два интерфейса до провайдера и мне в одном случае
>>нужно подставлять ip-адрес (первый провайдер) ng0-интерфейса, а в другом ng1 (второй
>>провайдер). Сейчас получается, что пакеты выходят из разных интерфейсов (в соответствии
>>с таблицей маршрутизации), а приходят всегда на какой-то один...
>
>от вас пакеты уходит через разные интерфейсы, а ответы возвращаются на один?
>
>по моему это возможно , только если вы натите исходящие одним ip,
>хоть и отправляете через разных провайдеров1. "а чем не устраивает : прочитать | изменить | записать ?" А как это сделать? Допустим, в якоре имеется три правила. Нужно добавить еще одно. В скрипте читаю все правила в переменную, добавляю свое правило и строю конструкцию
echo $str | /sbin/pfctl -a "anchor/ng2" -f -
Как-то это не совсем то, о чем я думал... Как отделять одно правило от другого в $str?2. "по моему это возможно , только если вы натите исходящие одним ip, хоть и отправляете через разных провайдеров". ip, присваеваемый проначеным пакетам прописывается в правилах nat. Отсюда проблема - как присвоить ip интерфейса, с которого уходит пакет, а не ip, прописанный в правиле nat?
>[оверквотинг удален]
>
>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}
если правила будут отличатся только ip адресом, посмотрите в сторону таблиц
>[оверквотинг удален]
>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
>[оверквотинг удален]
>
># 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 прописал загрузку якорей для каждого из из поднимаемых интерфейсов. Т.е. сделал то, что вы и советуете.
А теперь у меня новые грабил! Если раньше правила не грузились, то теперь правила грузятся, но правила якорей игнорируются.
так и не победил проблему, но вот набрел на ветку форума (http://www.opennet.me/openforum/vsluhforumID10/2561.html), в которой рекомендуется для загрузки правил с несуществующими интерфейсами использовать скобки, т.е. вместо
int_if = "ng0"
нужно писать
int_if = "(ng0)"Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных условия пока не могу - дома все. Кто-нибудь в курсе, насколько реален этот пример?
Так оно и есть. и в документации то ж написано
http://www.openbsd.org/faq/pf/example1.html>[оверквотинг удален]
>int_if = "ng0"
>
>нужно писать
>
>int_if = "(ng0)"
>
>
>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>реален этот пример?
>[оверквотинг удален]
>>int_if = "ng0"
>>
>>нужно писать
>>
>>int_if = "(ng0)"
>>
>>
>>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>>реален этот пример?это на тот случай, когда у интерфейса ip меняется
>[оверквотинг удален]
>>>нужно писать
>>>
>>>int_if = "(ng0)"
>>>
>>>
>>>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>>>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>>>реален этот пример?
>
>это на тот случай, когда у интерфейса ip меняетсяНе помогает пишет о синтаксической ошибке pf.conf, на все правила, где присутствует (ng0) :)). Че делатьто?
>[оверквотинг удален]
>>>>
>>>>
>>>>Полистал докуменатцию по этому вопросу - нету такого вообще. Проверить в реальных
>>>>условия пока не могу - дома все. Кто-нибудь в курсе, насколько
>>>>реален этот пример?
>>
>>это на тот случай, когда у интерфейса ip меняется
>
>Не помогает пишет о синтаксической ошибке pf.conf, на все правила, где присутствует
>(ng0) :)). Че делатьто?Вот примерное использование скобок
pppoe_if="ng0"
...
nat on $pppoe_if ... -> ($pppoe_if)
...
pass in log on $pppoe_if from ($pppoe_if) to ....
...а нужны они если меняется ip на интерфейсе ну и еще там для чего то