From: Vit <artemrts@ukr.net.>
Newsgroups: email
Date: Mon, 15 Jul 2009 14:31:37 +0000 (UTC)
Subject: Раздача Интернета через VPN (mpd) с ограничением траффика по пользователям средствами PF
В этой статье хочу описать как я настроил vpn-сервер для раздачи Инета
на базе mpd5.3 в связке с пакетным фильтром PF с ограничением трафика.
Почему именно такая конструкция? Просто мне необходимо было решение
раздачи интернета пользователям с шифрованием, и плюс ограничивать и
приоретизировать трафик дабы всем хватало. Можно было использовать
функции mpd для "нарезки" канала, но мне не хотелось заморачиваться с
радиусом и т.д. Поэтому было принято решение строить из того з чем умею
работать :-). В PF будем использовать такие фичи как anchors и Packet
Tagging (Policy Filtering).
Разжевывать каждый параметр не буду, поэтому читающий должен иметь некий
опыт работы в сетевом администрировании в общем и во FreeBSD в
частности.
Настройка vpn будет показана на примере виртуальной машины на базе
VMWare, на которой я всю эту систему отрабатывал.
1.5. Для бересборки ядра редактируем GENERIC. Его я переименовал в MYGENERIC1.
Понятное дело, что каждый сам должен править конфиг под свое железо, я приведу
только то что необходимо для работы.
В базовую систему не включен код MPPC compression, поэтому нужно его добавить.
Сам код и инструкция что куда копировать находятся на сайте http://www.mavhome.dp.ua/MPPC/
1.6. Далее делаем пересборку мира и ядра.
Из /usr/src/makefile:
# 1. 'd /usr/src' (or to the directory containing your source tree).
# 2. 'make buildworld'
# 3. 'make buildkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC).
# 4. 'make installkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC).
# [steps 3. & 4. can be combined by using the "kernel" target]
# 5. 'reboot' (in single user mode: boot -s from the loader prompt).
# 6. 'mergemaster -p'
# 7. 'make installworld'
# 8. 'make delete-old'
# 9. 'mergemaster' (you may wish to use -U or -ai).
# 10. 'reboot'
# 11. 'make delete-old-libs' (in case no 3rd party program uses them anymore)
Более подробно про обновление системы смотрим здесь
2. Устанвливаем MPD
Ставим из портов.
cd /usr/ports/net/mpd5
make
make install clean
Нам понадобиться 2 конфига в /usr/local/etc/mpd5 следующего содержания:
а) mpd.conf
startup:
# configure mpd users
#set user foo bar admin
#set user foo1 bar1
# configure the console
#set console self 127.0.0.1 5005
#set console open
# configure the web server
#set web self 172.16.1.1 5006
#set web open
#
default:
load pptp_server
pptp_server:
set ippool add pool1 192.168.1.2 192.168.1.10
# Create clonable bundle template named B
create bundle template B
set iface up-script /usr/local/etc/mpd5/if-up.sh
set iface down-script /usr/local/etc/mpd5/if-down.sh
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
set ipcp ranges 192.168.1.1/32 ippool pool1
set ipcp dns 172.16.1.1
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
set bundle enable compression
set bundle enable crypt-reqd
set ccp yes mppc
set mppc yes compress e40 e56 e128 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 disable pap chap eap
set link enable chap chap-msv1 chap-msv2 chap-md5
# We can use use RADIUS authentication/accounting by including
# another config section with label 'radius'.
# load radius
set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation.
set link mtu 1460
set link mru 1460
# Configure PPTP
set pptp self 172.16.1.1
# Allow to accept calls
set pptp disable windowing
set link enable incoming
в) Скрипты, которые будут запускаться при старте и шатдауне интерфейсов ng
if-up.sh
#!/bin/sh
echo "nat on le0 tag from_$4 tagged from_$4 -> le0" | pfctl -a mpd-nat/$4 -f -;
echo "pass out quick on le0 inet tagged from_$4 queue $4_up" | pfctl -a ext_if-out/$4 -f -;
echo "pass in quick on $1 inet from $1:peer $4 to any tag from_$4 queue $4_down" | pfctl -a ng-in/$4 -f -;
if-down.sh
#!/bin/sh
pfctl -a mpd-nat/$4 -F all;
pfctl -a ext_if-out/$4 -F all;
pfctl -a ng-in/$4 -F all;
set skip on lo
set loginterface le0
set ruleset-optimization basic
set block-policy return
set limit { states 20000 frags 20000 }
set timeout {adaptive.start 15000 adaptive.end 45000}
set state-policy if-bound
scrub on $ext_if all random-id min-ttl 128 reassemble tcp fragment reassemble
scrub on $int_if all
Для работы системы необходимо записать ЛогинПароль и назначаемый
клиенту IP-адрес в mpd.secret. В файле pf.conf сразу надо забить очереди
с нужными ограничениями для даного IP-адреса.
5. Проверяем, что получилось.
5.1. Нам понадобиться утилита pftop. Устанавливаем, как всегда, из портов:
cd /usr/ports/sysutils/pftop
make
make install clean
rehash
Ниже приведу результаты вывода команды pfctl, демонстрирующие, что
правила для NAT и фильтрации загрузились правильно с помощью якорей.
pfctl -a ext_if-out/192.168.1.2 -sr
pass out quick on le0 inet all flags S/SA keep state queue 192.168.1.2_up tagged from_192.168.1.2
pfctl -a mpd-nat/192.168.1.2 -sn
nat on le0 inet all tag from_192.168.1.2 tagged from_192.168.1.2 -> 10.0.10.182
pfctl -a ng-in/192.168.1.2 -sr
pass in quick on ng0 inet from 192.168.1.2 to any flags S/SA keep state queue 192.168.1.2_down tag from_192.168.1.2
После того, как клиент отключился, все правила удаляются.
6. Выводы.
Какие вижу минусы?
Необходимость прописывать в конфиге pf.conf очереди для всех
пользователей, и они не дожны удаляться. Тоже касается и mpd.secret.
Думаю написать скриптик, запустив который, будет запрашиваться IP-адрес,
ширина канала, логинпароль и назначаемый mpd IP-адрес, а далее скрипт
будет записывать введенные данные в соответствующие места
конфиграционных файлов.
При большом кол-ве пользователей большое кол-во правил для фаервола, что
может снизить производительность.
794 Прочтений • [Раздача Интернета через VPN (mpd) с ограничением траффика по пользователям средствами PF (freebsd vpn mpd limit traffic pf firewall)] [08.05.2012] [Комментариев: 0]