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

Исходное сообщение
"Скрипты для обновления правил PF при подключении VPN-клиента"

Отправлено SHRDLU , 06-Мрт-08 12:14 
Что-то я всю голову уже сломал, не соображу, как сделать...
В общем, имеем 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 при подключении VPN-клиента"
Отправлено Xela , 06-Мрт-08 12:57 
в PF есть такое понятие как таблицы. Добавлять в них правила можно динамически:
pfctl -t имятаблицы -T add IPадрес



"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 06-Мрт-08 13:10 
>в 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

С одной стороны, не очень тривиально, с другой стороны - достаточно просто... это я к тому, что недоумеваю, почему с утра не нашел НИ ОДНОГО готового примера на эту тему... или я какую-то чушь придумал? Прокомментируйте, если нетрудно...


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено Xela , 06-Мрт-08 13:46 
Очень хороший вариант. Мне -- нравится.

"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 06-Мрт-08 18:20 
>Очень хороший вариант. Мне -- нравится.

Спасибо за похвалу, но к сожалению, это не работает... пока разбираюсь, в чем дело


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 07-Мрт-08 09:01 
В общем, фигня какая-то. Непонятно. Скрипт правило к якорю добавляет -

# 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


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 12-Мрт-08 07:11 
Наконец-то удалось победить. Проблема оказалась в объявлении якоря. Заработало, когда написал так:

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 данный вопрос описан недостаточно чётко, коли возникают разночтения...


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено artemrts , 13-Апр-09 12:52 
>[оверквотинг удален]
>#!/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 не производит :-(.


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 13-Апр-09 13:02 
>  Скажите, а у вас 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
#


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено artemrts , 13-Апр-09 13:22 
>[оверквотинг удален]
>#
># 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?


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 13-Апр-09 13:31 
>Можете показать свой mpd.conf?

да пожалуйста...

startup:

default:
        load pptp_server0

pptp_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


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено borin , 28-Фев-11 14:01 
>[оверквотинг удален]
> 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 интерфейсов используется и как с нагрузкой на процессор?


"Скрипты для обновления правил PF при подключении VPN-клиента"
Отправлено SHRDLU , 09-Мрт-11 08:17 
> Подскажите сколько 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 при подключении VPN-клиента"
Отправлено Mick , 09-Дек-10 17:56 
Думаю проще так:
Два файла конфигов 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 при подключении VPN-клиента"
Отправлено SHRDLU , 10-Дек-10 08:04 
> Думаю проще так:
> Два файла конфигов 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* существенно больше одного?