есть проблема на
FreeBSD unlim.ENERGOPOLUS0.LOCAL 7.1-RELEASE FreeBSD 7.1-RELEASE #0: Thu Jan 1 14:37:25 UTC 2009 root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
все бы хорошо, да pf не стартует из init при загрузке системыон ругаеться на то, что в правиле присутствует не проинициализированный интерфейс
Ругни можно увидеть в выводе dmesg -a ниже по постучасти конфига /etc/pf.conf:
...
ext_if_ppp="tun0" # PPPoE over NIC in MB to MODEM Dynamic IP from TTN
...## Если напишем nat pass ... то пакеты не будут проверяться, а будут натиться и$
## выпускаться
## если будет еще и кип стейт то будут и впускаться с флагом уст-го соед.
## Но мы не пишем здесь keep state оно идет уже по умолчанию в freebsd>7.0
## Открываем нат дляnat pass on $ext_if_ppp from $ironws to any -> ($ext_if_ppp)
nat pass on $ext_if_ppp from $direktorws to any -> ($ext_if_ppp)
nat pass on $ext_if_ppp from $astalavistaws to any -> ($ext_if_ppp)...
## Разрешаем нашему серверу ходить в Интернет
## разрешаем весь исходящий трафик с локальной машины В Интернет
## через ppp интерфейс и входящий с флагом установленного соединенияpass out on $ext_if_ppp from $ext_if_ppp to any keep state
...Далее в конфиге как вы понимаете также используеться инт. $ext_if_ppp
вывод dmesg -a:
sk0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=b<RXCSUM,TXCSUM,VLAN_MTU>
ether 00:0f:38:6a:ae:b0
inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (none)
status: no carrier
\M-N\M-A: not found
Starting pflog.
Mar 20 10:12:34 pflogd[396]: NSSWITCH(nss_method_lookup): winbind, passwd, endpwent, not found
Mar 20 10:12:34 pflogd[396]: [priv]: msg PRIV_OPEN_LOG received
Enabling pf.
No ALTQ support in kernel
ALTQ related functions disabled
no IP address found for tun0
/etc/pf.conf:90:
could not parse host specificationpfctl:
Syntax error in config file: pf rules not loadedNo ALTQ support in kernel
ALTQ related functions disabled
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled
Starting PPP profile:
ttn
Mar 20 10:12:39 su: NSSWITCH(nss_method_lookup): winbind, group, setgrent, not found
Mar 20 10:12:39 su: NSSWITCH(nss_method_lookup): winbind, group, getgrent_r, not found
Mar 20 10:12:39 su: NSSWITCH(nss_method_lookup): winbind, group, endgrent, not found
Loading /lib/libalias_cuseeme.so
Loading /lib/libalias_ftp.so
Loading /lib/libalias_irc.so
Loading /lib/libalias_nbt.so
Loading /lib/libalias_pptp.so
Loading /lib/libalias_skinny.so
Loading /lib/libalias_smedia.so
.
Enabling pf. after ppp started
No ALTQ support in kernel
ALTQ related functions disabled
WARNING: attempt to net_add_domain(netgraph) after domainfinalize()
no IP address found for tun0
/etc/pf.conf:90:
could not parse host specificationpfctl:
Syntax error in config file: pf rules not loadedNo ALTQ support in kernel
ALTQ related functions disabled
Additional routing options:
IP gateway=YES
.
Starting devd.Продолжим:
Что удалось выяснить:
1. если разобраться со скриптами инициализации, то pf стартует перед ppp
/etc/rc.d/pf:
#!/bin/sh
#
# $FreeBSD: src/etc/rc.d/pf,v 1.16.6.1 2008/11/25 02:59:29 kensmith Exp $
## PROVIDE: pf
# REQUIRE: FILESYSTEMS netif pflog pfsync
# BEFORE: routing
# KEYWORD: nojail. /etc/rc.subr
...2. ppp
/etc/rc.d/pf:
#!/bin/sh
#
# $FreeBSD: src/etc/rc.d/ppp,v 1.13.2.3.2.1 2008/11/25 02:59:29 kensmith Exp $
## PROVIDE: ppp
# REQUIRE: netif isdnd
# KEYWORD: nojail. /etc/rc.subr
...
ppp_poststart()
{
# Re-Sync ipfilter and pf so they pick up any new network interfaces
#
echo "Enabling pf. after ppp started"
pfctl -F all > /dev/null 2>&1
pfctl -f /etc/pf.conf
if ! pfctl -s info | grep -q "Enabled" ; then
pfctl -e
fi
}
...Как видно из /etc/rc.d/ppp есть такой метод ppp_poststart() в котором происходит включение pf после старта ppp - но он тоже не помогает
Вот отрывочек из dmesg -a: Enabling pf. after ppp started
Enabling pf. after ppp started
No ALTQ support in kernel
ALTQ related functions disabled
WARNING: attempt to net_add_domain(netgraph) after domainfinalize()
no IP address found for tun0
/etc/pf.conf:90:
could not parse host specificationpfctl:
Syntax error in config file: pf rules not loadedNo ALTQ support in kernel
ALTQ related functions disabled
Additional routing options:
IP gateway=YESполучаем туже беду
no IP address found for tun0
/etc/pf.conf:90:
could not parse host specificationpfctl:
Syntax error in config file: pf rules not loadedПолучаеться, что как то оно все таки должно работать, но не фига, только вручную после включения Через pfctl -f /etc/pf.conf начинает работать PF
3. Также погуглив нашел предложения
Взять определения в круглые скобки ()
например:
ext_if_ppp="(tun0)" # PPPoE over NIC in MB to MODEM Dynamic IP from TTN
- НЕ ПОМОГЛОВзять в скобки в каждом месте, где используться инт
например:
pass out on ($ext_if_ppp) from ($ext_if_ppp) to any keep state
- НЕ ПОМОГЛО4. Суть вопроса я надеюсь ясна как правильно решить данную проблему, чтобы pf нормально загружался при минимуме изменений в системных сценариях ?
ответа так и не дождавшись ;)результат нешл сам
правда вчера тоже читал сам но ни как не мог понять и не получалось
вообще-то обидно, что не понял но заработало след.образом
ругалось на эту строчку и только
хотя вчера мне (может) показалось что ругалось на все где был $ext_if_ppp
pass out on $ext_if_ppp from $ext_if_ppp to any keep stateрешение
pass out on $ext_if_ppp from ($ext_if_ppp) to any keep state
люди может кто понял все именно все относительно расставления таких () скобокподелитесь пожалуйста, думаю не раз еще пригодиться ;)
>[оверквотинг удален]
>
>
>pass out on $ext_if_ppp from ($ext_if_ppp) to any keep state
>
>
>
>люди может кто понял все именно все относительно расставления таких () скобок
>
>
>поделитесь пожалуйста, думаю не раз еще пригодиться ;)Со скобками вроде всё просто. Вот цитата из man (5) pf.conf
Host name resolution and interface to address translation are done
at ruleset load-time. When the address of an interface (or host
name) changes (under DHCP or PPP, for instance), the ruleset must
be reloaded for the change to be reflected in the kernel. Sur-
rounding the interface name (and optional modifiers) in parentheses
changes this behaviour. When the interface name is surrounded by
parentheses, the rule is automatically updated whenever the inter-
face changes its address. The ruleset does not need to be
reloaded. This is especially useful with nat.Даже при пословном переводе (забивая на правила английского) становится понятно:
Разрешение имени хоста и трансляция интерфейса в адрес выполняются во время загрузки набора правил. Когда адрес интерфейса (или имя хоста) изменяется ( например при DHCP или РРР) набор правил должен быть перезагружен для того чтобы изменение отразилось в ядре. Взятие имени интерфейса в круглые скобки изменяет это поведение. Когда имя интерфейса берётся в круглые скобки, то правило обновляется автоматически когда интерфейс меняет адрес. Это особенно полезно при использовании NAT.
То есть чтобы динамически конфигурируемый интерфейс можно было указывать в правилах - его нужно взять в круглые скобки.
Я согласен с цитатой из man(5) pf.confСпасибо за перевод, кстати понятный.
Но тут по моему мнению не хватает ясности с тем где необходимо использовать скобки, а где нет.
Вот пример моего конфиг файла:
###########################################################################
## ЗАДАЕМ ПАРАМЕТРЫ (МАКРОСЫ) БРЭНДМАУЭРА #################################
###########################################################################int_if="sk0" # NIC Marvell PCI (1000) Local Area Network 192.168.0.2
ext_if="rl0" # NIC in MB (100) to MODEM
ext_if_ppp="tun0" # PPPoE over NIC in MB to MODEM Dynamic IP from TTN## разрешенные типы icmp сообщений.
## Первое необходимо для работы UNIX traceroute (для win tracert этого
## не требуется), а второе нужно когда пытаемся коннектиться
## к хосту, который в дауне.
allowed_icmp_types="{ echoreq, unreach}"## Cписок немаршрутизируемых адресов, с которых к нам
## будут долбиться на внешний интерфейс, а мы их будем заботливо писать в лог.
non_route_nets_inet="{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4 }"trusted_lan="192.168.0.0/24" #Наша локальная сеть
astalavistaws="192.168.0.119"
ironws="192.168.0.101"
direktorws="192.168.0.46"
opennat="{" $astalavistaws $ironws $direktorws "}"##--options
# тем, кто лезет туда куда не нужно вежливо сообщаем что нельзя
set block-policy return# изменяем время для состояния установленного tcp соединения,
# которое по-умолчанию черезчур большое (24часа)
set timeout { frag 10, tcp.established 3600 }# не проверяем на lo0
set skip on lo0# перед тем, как отправить фрагментированный пакет дальше
# сначала дожидаемся всех его частей
scrub in all
###########################################################################
## СЕКЦИЯ NAT and RDR #####################################################
############################################################################# ВНИМАНИЕ!!! Все проверяеться нормально сначала проверка потом нат
## Открываем нат для
nat on $ext_if_ppp from $opennat to any -> ($ext_if_ppp)# nat pass on $ext_if_ppp from $ironws to any -> ($ext_if_ppp)
# nat pass on $ext_if_ppp from $direktorws to any -> ($ext_if_ppp)
# nat pass on $ext_if_ppp from $astalavistaws to any -> ($ext_if_ppp)
################################################################################
## СЕКЦИЯ правила фильтрации ###################################################
################################################################################## антиспуфинг
## Что означает : сбрасывать все входящие пакеты с
## адресом отправителя равным нашему
antispoof log quick for $ext_if_ppp # включает простейший# умников, которые лезут на внутренний интерфейс с любых сетей
# отличных от 192.168.0.0/24
block drop in log quick on $ext_if_ppp from $non_route_nets_inet to any# пишем тех, кто ломится к нам на 25 порт. Облегчает работу по
# определению зараженных компов в локальной сети
block drop in log quick on $int_if from !$int_if:network to any# хорошее начало любых правил :-P
# Правда! (см. [7])
block all## Разрешаем нашему серверу ходить в Интернет
## разрешаем весь исходящий трафик с локальной машины В Интернет
## через ppp интерфейс и входящий с флагом установленного соединения
pass out on $ext_if_ppp from ($ext_if_ppp) to any keep state## Разрешаем нашему серверу работать с сетью. иницировать соед-я только ему, пропускать
## инициированые
pass out on $int_if from ($int_if) to $trusted_lan keep state
# после freebsd 7.0. keep state подставляеться по умолчанию
# т.е. пропускаються назад ответы (пакеты с установленным соединением)
# ICMP (PINGing) Пинг из локальной сети в Интернет
pass out on $ext_if_ppp proto icmp from $trusted_lan icmp-type $allowed$# ICMP (PINGign) Пинг сервера из локальной сети
pass in on $int_if proto icmp from $trusted_lan icmp-type $allowed_icmp$# Доступ к прокси Squid из локальной сети 100%
pass in on $int_if proto tcp from $trusted_lan to $int_if port 3128 kee$# SSH из локальной сети 100%
pass in log on $int_if proto tcp from $trusted_lan to $int_if port 22 k$# Статистика LightSquid для локальной сети, расположенного в локальном каталоге$
# сервера Apache и работающего на 80 порту
pass in log on $int_if proto tcp from $trusted_lan to $int_if port 80 k$Самое интересное, что исправив в одном месте:
pass out on $ext_if_ppp from ($ext_if_ppp) to any keep stateСтало работать!
Вопрос почему тогда не ругаеться в других правилах,
где также используеться не проинициализированный интерфейс:здесь:
nat on $ext_if_ppp from $opennat to any -> ($ext_if_ppp)
antispoof log quick for $ext_if_ppp # включает простейший
block drop in log quick on $ext_if_ppp from $non_route_nets_inet to any
pass out on $ext_if_ppp proto icmp from $trusted_lan icmp-type $allowed...т.е.
1. я так понимаю, что нужно сделать наверное это один раз всего
всмысле взять в скобку интерфейс, в правиле, на которое он ругаеться, и все остальные проигнорируються, т.е. нормально подгрузятьсялибо
2. есть другой прикол
вот как бы что интересно ;)
Там где у вас "on $ext_if_ppp" имеется ввиду сам интерфейс, а для, например, правил ната "-> ($ext_if_ppp)" имеется ввиду именно его адрес, который в вашем случае должен быть динамическим.