Что-то я всю голову уже сломал, не соображу, как сделать...
В общем, имеем mpd5, к нему подключается пользователь, mpd поднимает для него интерфейс ng0. Соответственно, в pf надо для интерфейса добавлять правило, разрешающее весь траффик на этом интерфейсе, что-то типа:pass quick on ng0 all
А когда пользователь отключается, хорошо бы это правило убрать. Так вот как все это сделать "на лету", динамически? Понятно, что через скрипты на поднятие и отключение интерфейсов, но вот что и как написать в самих скриптах - не пойму...
То есть как будет выглядеть скрипт для добавления нового правила в существующую конфигурацию pf, и самое главное - для удаления этого правила из списка правил pf, так, чтобы не порушить остальные правила и не вырубить остальных подключенных пользователей!
Гуглил с утра - примеров таких скриптов не нашел. Если есть ссылка - ткните носом...Можно, конечно, просто прописать и забыть в pf.conf набор
pass quick on ng0 all
....
pass quick on ng100 allНо это как-то некошерно, и если клиентов не 100 а 10000...
в PF есть такое понятие как таблицы. Добавлять в них правила можно динамически:
pfctl -t имятаблицы -T add IPадрес
>в PF есть такое понятие как таблицы. Добавлять в них правила можно
>динамически:
>pfctl -t имятаблицы -T add IPадресТаблицы работают только с IP-адресами а не с интерфейсами... хотя эта мысль уже пришла мне в голову.
Сейчас пытаюсь извратиться с помощью якорей, вроде, должно работать:В /etc/pf.conf
anchor ng-intВ mpd.conf:
# Add PF rules to ng*
set iface up-script /usr/local/etc/mpd5/if-up.sh
set iface down-script /usr/local/etc/mpd5/if-down.sh/usr/local/etc/mpd5/if-up.sh
#!/bin/sh
echo "pass quick on $1 all" | pfctl -qa ng-int:$1 -f -/usr/local/etc/mpd5/if-down.sh
#!/bin/sh
pfctl -a ng-int:$1 -F rulesС одной стороны, не очень тривиально, с другой стороны - достаточно просто... это я к тому, что недоумеваю, почему с утра не нашел НИ ОДНОГО готового примера на эту тему... или я какую-то чушь придумал? Прокомментируйте, если нетрудно...
Очень хороший вариант. Мне -- нравится.
>Очень хороший вариант. Мне -- нравится.Спасибо за похвалу, но к сожалению, это не работает... пока разбираюсь, в чем дело
В общем, фигня какая-то. Непонятно. Скрипт правило к якорю добавляет -# pfctl -a ng-int:ng0 -s rules
No ALTQ support in kernel
ALTQ related functions disabled
pass quick on ng0 allно правило не работает, клиент видит только свою машину. Если то же самое правило вписать в основой набор правил, то все Ок. Ни у кого мыслей нет? Вот полный конфиг pf:
#
# Macro
#
ext_if="fxp0"
int_if="sk0"
me_int="10.0.0.1"
#
scrub in all
block all
#
# localhost
#
pass quick on lo0 all
#
# ICMP
#
pass in quick on $ext_if proto icmp keep state
pass in quick on $int_if proto icmp keep state
#
# SSH
#
pass in quick log on $int_if proto tcp from 10.0.0.70 to $me_int port ssh keep state
#
# VPN
#
pass in quick on $ext_if proto tcp from any to port pptp keep state
pass quick proto gre from any to any
anchor ng-int
#
# All out enable
#
pass out on $ext_if all keep state
pass out on $int_if all keep state
Наконец-то удалось победить. Проблема оказалась в объявлении якоря. Заработало, когда написал так:anchor "ng-int/*"
Соответственно, скрипты также несколько изменились:
# less if-up.sh
#!/bin/sh
echo "pass quick on $1 all" | pfctl -a ng-int/$1 -f -# less if-down.sh
#!/bin/sh
pfctl -a ng-int/$1 -F rulesIMHO, в документации по PF данный вопрос описан недостаточно чётко, коли возникают разночтения...
>[оверквотинг удален]
>#!/bin/sh
>echo "pass quick on $1 all" | pfctl -a ng-int/$1 -f -
>
>
># less if-down.sh
>#!/bin/sh
>pfctl -a ng-int/$1 -F rules
>
>IMHO, в документации по PF данный вопрос описан недостаточно чётко, коли возникают
>разночтения...Скажите, а у вас mpd не ругается на if-up скрипт, а то у меня ошибкавылетает
Apr 13 09:27:42 server mpd: mpd.conf:50: Incorrect context for: 'set iface up-script /usr/local/etc/mpd5/if-up.sh'
Сам mpd работает, вот только нужных мне действий с PF не производит :-(.
> Скажите, а у вас mpd не ругается на if-up скрипт,Нет, всё было скопировано с работающих скриптов.
Сейчас используется чуть более "продвинутый" вариант:#!/bin/sh
#
# VPN Interface Up Script
#
# Script is called like this:
#
# script interface proto local-ip remote-ip authname
# $1 $2 $3 $4 $5
#
# Add some rules to firewall
#
echo "block quick on $1 from any to !10.0.0.0/8" > /usr/local/etc/mpd5/$1;
echo "pass quick on $1 all" >> /usr/local/etc/mpd5/$1;
pfctl -a ng-int/$1 -f /usr/local/etc/mpd5/$1;
rm -f /usr/local/etc/mpd5/$1;
#
# Done
#
>[оверквотинг удален]
>#
># Add some rules to firewall
>#
>echo "block quick on $1 from any to !10.0.0.0/8" > /usr/local/etc/mpd5/$1;
>echo "pass quick on $1 all" >> /usr/local/etc/mpd5/$1;
>pfctl -a ng-int/$1 -f /usr/local/etc/mpd5/$1;
>rm -f /usr/local/etc/mpd5/$1;
>#
># Done
>#Всеравно, зараза, ругается Incorrect context for: 'set iface up-script /usr/local/etc/mpd5/if-up.sh'.
Можете показать свой mpd.conf?
>Можете показать свой mpd.conf?да пожалуйста...
startup:
default:
load pptp_server0pptp_server0:
# Define dynamic IP address pool.
set ippool add pool1 10.0.9.3 10.0.9.254# Create clonable bundle template named B
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
# Add PF rules to ng*
set iface up-script /usr/local/etc/mpd5/if-up.sh
set iface down-script /usr/local/etc/mpd5/if-down.sh
set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
set ipcp ranges 10.0.9.2/32 ippool pool1
set ipcp dns 10.0.0.2
set ipcp nbns 10.0.0.18
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
set bundle enable compression
set ccp yes mppc
set mppc yes e40
set mppc yes e128
set mppc yes stateless
# Create clonable link template named L
create link template L pptp
# Set bundle template to use
set link action bundle B
# Multilink adds some overhead, but gives full 1500 MTU.
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
# We can use use RADIUS authentication/accounting by including
# another config section with label 'radius'.
set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation.
set link mtu 1460
# Configure PPTP
set pptp self 10.0.10.202
# Allow to accept calls
set link enable incoming
>[оверквотинг удален]
> anchor "ng-int/*"
> Соответственно, скрипты также несколько изменились:
> # less if-up.sh
> #!/bin/sh
> echo "pass quick on $1 all" | pfctl -a ng-int/$1 -f -
> # less if-down.sh
> #!/bin/sh
> pfctl -a ng-int/$1 -F rules
> IMHO, в документации по PF данный вопрос описан недостаточно чётко, коли возникают
> разночтения...Подскажите сколько ng интерфейсов используется и как с нагрузкой на процессор?
> Подскажите сколько ng интерфейсов используется и как с нагрузкой на процессор?Честно? Не знаю :)))
Очень редко туда заглядываю.
Сейчас вот посмотрел - работают трое, шапка от top ниже:last pid: 89313; load averages: 0.04, 0.06, 0.02 up 28+19:04:09 08:15:45
43 processes: 1 running, 42 sleeping
CPU: 0.0% user, 0.0% nice, 0.2% system, 0.0% interrupt, 99.8% idle
Mem: 23M Active, 266M Inact, 144M Wired, 92K Cache, 110M Buf, 555M Free
Swap: 1996M Total, 1996M Free
Думаю проще так:
Два файла конфигов pf.conf и pf_vpn.conf (во втором добавлено все что касается ng0)
В rc.conf дефолтным прописан pf.conf.
При старте считывается дефолтный, в mpd скриптах добавляем, в up: pfctl -f /etc/pf_vpn.conf, в down: pfctl -f /etc/pf.conf
> Думаю проще так:
> Два файла конфигов pf.conf и pf_vpn.conf (во втором добавлено все что касается
> ng0)
> В rc.conf дефолтным прописан pf.conf.
> При старте считывается дефолтный, в mpd скриптах добавляем, в up: pfctl -f
> /etc/pf_vpn.conf, в down: pfctl -f /etc/pf.confА если интерфейсов ng* существенно больше одного?