Как стать автором
Обновить

Учет VPN сессий в PoPToP PPTP сервере под FreeBSD 6.3

Жил-был маленький сервер под FreeBSD 6.3 и выполнял он всякие разные функции, в том числе и функцию VPN сервера для того чтобы измученые отдыхом сотрудники могли удаленно подключится к корпоративной сетке и наконец-то поработать. :)
Сначала количество сотрудников было небольшим и все всех устраивало. Со временем, когда уже значительная доля сотрудников обзавелась vpn аккаунтами встал вопрос учета этих самых подключений.
В качестве VPN сервера крутился PoPToP cо следующими конфигами:

/usr/local/etc/pptpd.conf
options /etc/ppp/options.pptpd

/usr/local/etc/pptpd.conf
proxyarp
+MSChap-V2 mppe-128 mppe-stateless
nodefaultroute
logfile /var/log/vpn.log
ms-dns 192.168.7.1
auth


/usr/local/etc/ppp.conf
pptp:
enable dns
enable nat
enable proxy
set ifaddr 192.168.7.1 192.168.7.241-254 255.255.255.0 # ИП сервера Пул адресов Маска
set dns 192.168.7.1 # адрес DNS
set timeout 300 #таймаут простоя до разрыва соединения
enable MSChapV2 # протокол по которому шифруемся
set nbns 192.168.7.1 # WINS


/usr/local/etc/ppp.secret
Формат файла
логин пароль ип адрес или диапазон из выделенного адресного пространства (см ppp.conf)
test test 192.168.7.240-192.168.7.242
test1 test123 192.168.7.245


Если кто хочет установить так же, установка проста до безобразия:
cd /usr/ports/net/poptop
make install clean

Ну и для автозапуска демона добавить в /etc/rc.conf
pptpd_enable="YES"

На этом сервере также висит связка АМР (Apache, МуSQL, PHP).
Поэтому было решено пойти по пути наименьшего сопротивления. Так как бешенный прирост в кол-ве VPN пользователей не ожидается то было решено не переделывать все (Я уже слышу выкрики из зала по поводу mpd+Radius и т.д.), а просто создать базу в мускуле и заносить данные о сессииях туда. А уж написать веб-обвязку на пхп для манипулирования этими данными не составит труда.

Создаем базу
Базу назовем к примеру vpn
В ней 2 таблички
users и sessions
Назаначение полей, я думаю, прозрачно.
Создаем пользователя для базы
например логин- vpn, пасс- vpn с правом доступа только с локалхоста.
Скрипт создания базы — vpn.sql
CREATE DATABASE `vpn` ;
USE `vpn`;

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(15) DEFAULT NULL,
`nick` varchar(20) DEFAULT NULL,
`username` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`time` time DEFAULT NULL,
`online` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9;

CREATE TABLE `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(15) DEFAULT NULL,
`nick` varchar(20) DEFAULT NULL,
`date` date DEFAULT NULL,
`time` time DEFAULT NULL,
`uptime` time DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=86;


Скриптыдобавления информации
В папке /etc/ppp
создаем следующие файлики которые будут вызывать наши скрипты.
За подробностями man ppp. ;)

ppp.linkup
pptp:
! sh -c "/etc/ppp/vpn_up.sh USER HISADDR"


ppp.linkdown
pptp:
! sh -c "/etc/ppp/vpn_down.sh USER HISADDR UPTIME"


А вот и сами скрипты:
Не забудте дать права на исполнение!
vpn_up.sh
#!/bin/sh
if [ `mysql -uvpn -pvpn vpn -e "SELECT * FROM users WHERE nick='$1'"`="" ]
then
mysql -uvpn -pvpn vpn -e "INSERT into users (id, ip, nick, date, time, online) Values('Null', '$2', '$1', '`date -j +%F`', '`date -j +%T`', '1')"
else
mysql -uvpn -pvpn vpn -e "UPDATE users SET online='1', date='`date -j +%F`', time='`date -j +%T`', ip='$2' WHERE nick='$1'"
fi


vpn_down.sh
#!/bin/sh
mysql -uvpn -pvpn vpn -e "INSERT into sessions (id, ip, nick, date, time, uptime) Values('Null', '$2', '$1', '`date -j +%F`'
mysql -uvpn -pvpn vpn -e "UPDATE users SET online='0' WHERE nick='$1'"


Вот так мы заполучили все данные о сессиях (логин, выданый ип, время окончания сессии, длительность сессии) + табличку мониторинга пользователей. Все пользователи заводятся в базе автоматом, потом достаточно лишь заполнить ФИО «username» к логину пользователя «nick».

А по поводу веб обвязки, я уж не буду приводить свой пример сюда, так кан он совершенно не годится для публикации, там не ни защиты от скульинклюда, ни дизайна. Сделана топорно за 2 часа и чисто для внутреннего пользования. PHP я только начинаю осваивать. Тут уж сами, кто на что горазд.
Ну если сильно надо могу и выложить.
Смысл данного поста показать методику заноса данных о сессиях поптопа в мускуль.

ЗЫ. Сильно ногами не пинать, любая конструктивная критика только приветствуется.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.