Техническое задание
- VPN-сервер в качестве интернет-шлюза, не требующий установки дополнительного ПО для Windows-клиентов.
- Подсчет трафика, журналирование посещенных адресов.
- Выборочное блокирование определенных адресов, портов. Редирект на локальную страницу по нарушении доступа или истечении трафика.
- Опционально – шейпер.
при установке FreeBSD 8.0:
/ 1024
swap 302
/var 1024-5000
/tmp 730
/usr 12000-~
– включил доступ по SSH;
– font – IBM 866;
– keymap – Russia KOI8-R
– saver:-Daemon;
– screenmap – KOI8-R to IBM 866;
– ttys -KOI8-R;
– IP-адрес – 192.168.11.222.
Распакуем порты с DVD-диска: # sysinstall
здесь “Configure” > “Distributions” > “Ports” > “Ok”.
Затем таким же образом ставим MySQL (на DVD – релиз mysql-server-5) и добавляем строчку mysql_enable=”YES” в /etc/rc.conf
Далее, чтобы постоянно загружались модулем ipfw_nat.ko и ng_car.ko в /boot/loader.conf добавляем:
1 2 3 |
ng_car_load="YES" ipfw_nat_load="YES" accf_http_load="YES" |
(accf_http понадобится в будущем для Апача)
Установим из портов abills – версия 0.41 уже поддерживает mpd5 (по зависимостям установятся perl и freeradius – отмечайте опцию MY_SQL):
# cd /usr/ports/net/abills
# make install clean
Создаем пользователя для абиллса:
# mysql -u root -p
1 2 3 4 5 6 7 8 9 10 |
use mysql; INSERT INTO user (Host, User, Password) VALUES ('localhost','abills', password('sqlpassword')); INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Index_priv, Alter_priv, Lock_tables_priv, Create_tmp_table_priv) VALUES ('localhost','abills','abills','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y'); CREATE DATABASE abills; flush privileges; |
и загружаем таблицы в базу:
# mysql -D abills < /usr/local/abills/abills.sql
Изменяем строки в /usr/local/abills/libexec/config.pl:
1 2 3 4 5 6 7 8 9 |
#DB configuration $conf{dbhost}='localhost'; $conf{dbname}='abills'; $conf{dbuser}='abills'; $conf{dbpasswd}='sqlpassword'; $conf{ADMIN_MAIL}='info@your.domain'; $conf{USERS_MAIL_DOMAIN}="your.domain"; # используется для шифрования паролей администраторов и пользователей. $conf{secretkey}="test12345678901234567890"; |
И добавляем строку
1 |
$conf{mpd_filters}=1; |
Вносим в cron периодические процессы /etc/crontab
1 2 3 |
*/5 * * * * root /usr/local/abills/libexec/billd -all 1 0 * * * root /usr/local/abills/libexec/periodic daily 1 1 * * * root /usr/local/abills/libexec/periodic monthly |
При установке mpd5 не забываем поставить галочку на NG_CAR
# cd /usr/ports/net/mpd5
# make install clean
После установки:
# cd /usr/local/etc/mpd5
# cp mpd.conf.sample mpd.conf и приводим конфиг к такому виду (разобраться несложно):
mpd.conf:(нажмите, чтобы развернуть)
1 2 3 4 5 6 |
startup: # configure mpd users set user admin PASSWD admin # configure the console set console self 127.0.0.1 5005 set console open |
default:
load pptp_server
pptp_server:
create bundle template B
set ipcp ranges 10.10.10.254/32 10.10.10.0/24
set iface up-script “/usr/local/abills/libexec/linkupdown mpd up”
set iface down-script “/usr/local/abills/libexec/linkupdown mpd down”
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp dns 8.8.8.8
set bundle enable compression
set bundle disable multilink
set ccp yes mppc
set mppc yes compress e40
set mppc yes compress e56
set mppc yes compress e128
set mppc yes compress stateless
create link template L pptp
set link action bundle B
set link disable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
set link keep-alive 10 60
set link mtu 1400
set link mru 1400
set pptp self 192.168.11.222
set link enable incoming
set pptp disable windowing
load radius
radius:
set radius server localhost PASSWD 1812 1813
set radius retries 3
set radius timeout 3
set radius me 127.0.0.1
set auth acct-update 30
set auth enable radius-auth
set auth enable radius-acct
set radius enable message-authentic
НЕ ЗАБЫВАЕМ про отступы, mpd ОЧЕНЬ не любит их отсутствие!
Теперь правим конфиги радиуса:
# cd /usr/local/etc/raddb
файл users
1 2 |
DEFAULT Auth-Type = Accept Exec-Program-Wait = "/usr/local/abills/libexec/rauth.pl" |
файл acct_users:(нажмите, чтобы развернуть)
1 2 |
DEFAULT Acct-Status-Type == Start Exec-Program = "/usr/local/abills/libexec/racct.pl" |
DEFAULT Acct-Status-Type == Alive
Exec-Program = “/usr/local/abills/libexec/racct.pl”
DEFAULT Acct-Status-Type == Stop
Exec-Program = “/usr/local/abills/libexec/racct.pl”
в файл clients.conf прописываем пароль для доступа к радиус-серверу, тот что мы указывали в mpd.conf
1 2 3 |
client 127.0.0.1 { secret = PASSWD } |
В файле radiusd.conf необходимо создать функции для преавторизации и поставторизации в секции ‘modules’
1 2 3 4 5 6 |
exec pre_auth { wait = yes program = "/usr/local/abills/libexec/rauth.pl pre_auth" input_pairs = request output_pairs = config } |
exec post_auth {
wait = yes
program = “/usr/local/abills/libexec/rauth.pl post_auth”
input_pairs = request
output_pairs = config
}
Закомментируем использование модулей ‘chap’ и добавим ‘pre_auth’ в разделе ‘authorize’
1 2 3 4 5 6 7 8 9 10 11 12 13 |
authorize { preprocess # chap # counter # attr_filter # eap # suffix files # etc_smbpasswd # sql mschap pre_auth } |
Для оповещения о неавторизированых пользователях. Внесите в секцию ‘post-auth’
1 2 3 4 5 |
post-auth { Post-Auth-Type REJECT { post_auth } } |
Создаем словарь для mpd5 – dictionary.mpd:
1 |
VENDOR mpd 12341 |
ATTRIBUTE mpd-rule 1 string mpd
ATTRIBUTE mpd-pipe 2 string mpd
ATTRIBUTE mpd-queue 3 string mpd
ATTRIBUTE mpd-table 4 string mpd
ATTRIBUTE mpd-table-static 5 string mpd
ATTRIBUTE mpd-filter 6 string mpd
ATTRIBUTE mpd-limit 7 string mpd
ATTRIBUTE mpd-input-octets 8 string mpd
ATTRIBUTE mpd-input-packets 9 string mpd
ATTRIBUTE mpd-output-octets 10 string mpd
ATTRIBUTE mpd-output-packets 11 string mpd
ATTRIBUTE mpd-link 12 string mpd
ATTRIBUTE mpd-bundle 13 string mpd
ATTRIBUTE mpd-iface 14 string mpd
ATTRIBUTE mpd-iface-index 15 integer mpd
ATTRIBUTE mpd-input-acct 16 string mpd
ATTRIBUTE mpd-output-acct 17 string mpd
ATTRIBUTE mpd-drop-user 154 integer mpd
в файле dictionary добавляем строку:
1 |
$INCLUDE dictionary.mpd |
Добавляем необходимые модули perl:
# cd /root
# perl -MCPAN -e shell
1 2 3 4 5 6 7 8 9 |
install DBI install DBD::mysql install Digest::MD5 install Digest::MD4 install Crypt::DES install Digest::SHA1 install Bundle::libnet install Time::HiRes quit |
Добавляем в систему Апач:
# echo apache22_enable=\”YES\” >> /etc/rc.conf
# mkdir /var/log/httpd
# touch /var/log/httpd/abills-error.log
# cd /usr/ports/www/apache22
# make
# make install
После установки:
# /usr/local/abills/misc/sslcerts.sh apache
# echo “Include /usr/local/abills/misc/apache/abills_httpd.conf” >> /usr/local/etc/apache22/httpd.conf
Настраиваем AbbilS.
Заходим на https://your.host:9443/admin/
Логин/пароль – abills/abills.
Выбираем русский язык.

Теперь нужно сконфигурировать сервер доступа NAS
идем “Система-Сервер доступа”. Настройки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ID 1 IP 127.0.0.1 Название: NAS Radius NAS-Identifier: Описание: Тип: mpd5:MPD 5.xx Авторизация: SQL External Accounting: Alive (sec.): 60 Отключено: :Управление: IP:PORT: 127.0.0.1:5005 (тот, что настраивали в mpd.conf) Пользователь: admin (тот, что настраивали в mpd.conf) Пароль: PASSWD (тот, что настраивали в mpd.conf) RADIUS Параметры (,) |
Теперь в строчке со вновь добавленным NAS нажимаем IP POOLS, чтобы добавить серверу доступа пул адресов, которые будут выдаваться клиентам при подключении к VPN-серверу:
1 2 3 4 |
Название: first FIRST IP: 10.10.10.1 Количество: 253 Приоритет: 0 |
Теперь настроим хотя бы один тарифный план: Система -> Internet -> Тарифные планы -> Добавить
Тут настраиваем по вкусу, при этом указываем пул-адресов (IP Pool).
RADIUS Parameters (,) – это собственно и есть параметры передаваемые радиусом системе ng_car.
Сюда для примера добавим:
1 2 |
mpd-limit+="in#1=all rate-limit 1024000 192000 384000", mpd-limit+="out#1=all rate-limit 1024000 192000 384000" |
где первая цифра (rate-limit) собственно ограничение скорости при закачке
вторая – (normal burst) – какую полосу отдать за 1 секунду;
третья – (extended burst) за первые полторы секунды.
Теперь добавим пользователя Клиенты -> Логины -> Добавить
Затем привязываем к нему тарифный план. Далее исходя из тарифного плана (предоплата/постоплата) смотрим, нужно ли ему для успешной авторизации деньги на счету, и если нужны, то добавляем. Далее активируем пользователя.
Проверяем, может ли пользователь авторизироваться в радиусе:
radtest testuser testpassword 127.0.0.1:1812 0 PASSWD 0 127.0.0.1
если ему выдался ИП и т.д., то все ок.
Для логирования mpd, добавляем следующее в /etc/syslog.conf
!mpd
*.* /var/log/mpd.log
Создаем файл и даем права
# touch /var/log/mpd.log
# chmod 600 /var/log/mpd.log
Настраиваем соединение с провайдером:
Вносим в rc.conf:
1 2 |
mpd_enable="YES" radiusd_enable="YES" |
# Запуск дозвона до провайдера при загрузке
# “prov” – название профиля в ppp.conf
ppp_enable=”YES”
ppp_mode=”ddial”
ppp_profile=”prov”
/etc/ppp/ppp.conf:(нажмите, чтобы развернуть)
1 2 3 4 5 6 7 8 9 10 11 |
#from handbook default: set log Phase tun command prov: set device PPPoE:ed0 # ed0 is my Ethernet device set authname ВАШ_ЛОГИН_У_ПРОВАЙДЕРА set authkey ВАШ_ПАРОЛЬ_У_ПРОВАЙДЕРА set dial enable dns #get nameservers from resolv.conf set login add default HISADDR |
Настроим ipfw и nat
Укажу минимальный набор правил для доступа пользователей в интернет:
ed0 – внешняя сетевая карта
rl0 – внутреняя сетевая карта
192.168.11.0/24 – локальная сеть
МОЙ_БЕЛЫЙ_IP_АДРЕС – Внешний IP-адрес
table(1) – содержит созданные вами пулы адресов
Файрволл по умолчанию – закрытый.
Чтобы работать по SSH установил screen (abills долго собирается на старой машине) и добавил в правила фаервола (/usr/local/scripts/firewall.sh):
1 2 3 4 5 6 7 8 9 10 11 |
ipfw -q -f flush cmd="ipfw add" ipfw nat 100 config if ed0 $cmd 200 allow log ip from any to any via lo0 $cmd 300 allow ip from 192.168.11.0/24 to 192.168.11.0/24 via rl0 $cmd 400 allow ip from 'table(1)' to 'table(1)' $cmd nat 100 ip from 'table(1)' to any $cmd nat 100 ip from any to МОЙ_БЕЛЫЙ_IP_АДРЕС ipfw table 1 add 10.10.10.0/24 $cmd 1000 allow tcp from any to me 22 in via rl0 keep-state $cmd 1100 permit log ip from any to any |
и в /etc/rc.conf добавляем:
1 2 3 |
firewall_enable="YES" firewall_logging="YES" firewall_script="/usr/local/scripts/firewall.sh" |