From: Vitaliy Yermistov <vantooatukrdotnet>
Newsgroups: email
Date: Mon, 07 Aug 2006 14:31:37 +0000 (UTC)
Subject: Ограничение пропускной способности каналов при реализации VPN сервера на базе MPD
Часто VPN сервер используется как часть биллинговой системы провайдера
для предоставления доступа в Интернет пользователям локальной сети.
При этом зачастую возникает необходимость ограничения пропускной способности
канала, причем скорость передачи данных должна отличатся индивидуально для каждого
пользователя. В данной статье я хочу предложить свой способ решения данной
задачи.
Самыми распространенными являются следующие ситуации:
1. Биллинговая система основана на протоколе AAA Radius.
2. Биллинговая система ведет учет трафика с помощью других программных средств,
либо вообще не нуждается в подсчете объема переданной и принятой информации.
В первом случае наиболее целесообразно, на мой взгляд, подключить к Radius
словарь MPD:
Файл необходимо разместить в папке, в которой хранятся словари вашего Radius,
и внести имя файла dictionary.mpd в список используемых словарей. Далее необходимо
заставить Radius передавать необходимые параметры (ACL) MPD. В данной статье мы не
будем детально рассматривать этот способ, так как он подробно описан в документации MPD,
которую Вы можете найти в папке /usr/local/share/doc/mpd. Скажу только, что работает
он хорошо, его я и предпочитаю использовать.
Однако в случае, если биллинговая система не предусматривает использования сервера
Radius, а источником имени пользователя и пароля служит стандартный файл mpd.secret
(например, если провайдер небольшой), то в качестве альтернативы я хочу предложить
следующий выход (сразу оговорюсь, что ниже представленные скрипты Вы можете использовать
исключительно на свой страх и риск, и претензии в случае неправильной работы системы
автором статьи не принимаются).
Подразумевается, что у Вас уже имеется, сконфигурированный и работающий VPN сервер на MPD,
если нет, то воспользуйтесь статьями, по этой теме.
Добавьте в файл mpd.conf следующие строки:
set iface up-script /usr/local/etc/mpd/shaping/up.sh
set iface down-script /usr/local/etc/mpd/shaping/down.sh
Не забываем сделать отступы табуляциями в начале строк!
Если конфиги Вашего MPD лежат не в папке /usr/local/etc/mpd/, то измените эти строки,
и все последующие вхождения /usr/local/etc/mpd/ на свой путь к конфигам.
Создаем папку, в которой будут хранится наши файлы:
Это собственно файл, в котором необходимо указать пропускную способность входящего и
исходящего каналов для каждого пользователя. Имена пользователей должны совпадать с именами
в файле mpd.secret. Направление потока (входящий, исходящий) принимаются относительно сервера.
Примеры указания значений скорости передачи: 32Kbit/s 6Mbit/s 24KBytes/s 4MBytes/s, будьте
внимательны, если неправильно указать значение, то пользователь получит неограниченный канал.
Все символы, следующие за символом "#" игнорируются, игнорируются также лишние пробелы,
табуляции и пустые строки.
########################### parse.awk ##################################
BEGIN { FS = "#" }
{ if ( $1 != "" ) print $1 }
if [ "$incom" = "" ]; then
incom="32Kbit/s"
echo $(date '+%Y-%m-%d %H:%M:%S')" Incomming bandwidth for user [$username] are not determined, I set it to 32Kbit/s" >> shaper.log
fi
# Если значение ширины входящего канала для данного пользователя не указано,
# то используется значение 32Kbit/s, в этом случае создается запись в
# файле /usr/local/etc/mpd/shaping/shaper.log, проверяйте этот файл время от времени.
if [ "$outcom" = "" ]; then
outcom="32Kbit/s"
echo $(date '+%Y-%m-%d %H:%M:%S')" Outcomming bandwidth for user [$username] are not determined, I set it to 32Kbit/s" >> shaper.log
fi
# Та же проверка и для исходящего канала
ipfw pipe $(echo 30$intnum) config bw $incom
ipfw pipe $(echo 31$intnum) config bw $outcom
ipfw add $(echo 30$intnum) pipe $(echo 30$intnum) all from any to any in via $1
ipfw add $(echo 31$intnum) pipe $(echo 31$intnum) all from any to any out via $1
ipfw add $(echo 32$intnum) allow all from any to any via $1
Этот скрипт вызывается MPD при установлении соединения с хостом пользователя
и добавляет правила IPFW, ограничивающие пропускную способность каналов.
В Вашей системе должен работать IPFW, для этого скомпилируйте ядро с опциями:
options IPFIREWALL # ОБЯЗАТЕЛЬНО! Сам IPFW
options IPFIREWALL_VERBOSE # Поддержка логирования
options IPFIREWALL_FORWARD # Поддержка перенаправления пакетов
options IPFIREWALL_VERBOSE_LIMIT=100 # Ограничение кол-ва лог-записей
options IPFIREWALL_DEFAULT_TO_ACCEPT # Обязательно для начинающих!
options DUMMYNET # ОБЯЗАТЕЛЬНО! Формирователь трафика
options IPDIVERT # Скорее всего понадобится для NAT
Этот скрипт вызывается MPD при разрыве соединения с хостом пользователя,
здесь удаляются правила, созданные предыдущим скриптом (IPFW позволяет создавать
множество правил под одним номером, и если их не удалять, то вывод команд
ipfw show и ipfw pipe show засоряется старыми правилами).
При добавлении своих правил IPFW не используйте номера с 30000 по 32999,
они используются данной системой, думаю остальных 62535 номеров Вам должно хватить :-)
Не забываем сделать скрипты исполняемыми:
chmod 774 up.sh
chmod 744 down.sh
Вот, собственно, и все, перезапускаем MPD и проверяем работу системы. Удачи!
1219 Прочтений • [Ограничение пропускной способности каналов при реализации VPN сервера на базе MPD (mpd vpn pptp freebsd shaper limit speed bandwidth radius traffic)] [08.05.2012] [Комментариев: 0]