From: Alexander Shulikov <shulik at ua.fm>
Date: Mon, 25 Jun 2006 14:31:37 +0000 (UTC)
Subject: Настройка VPN-сервера с ведением статистики, шейпингом и фильтрацией
Оригинал: http://wiki.bsdportal.ru/doc:vpn
Для начала: данная статья не претендует на роль полноценного
руководства или панацеи на все случаи жизни, посему все вопросы и
пожелания по исправлению и дополнению статьи шлем на
Итак - приступим. В работе нам понадобится: FreeBSD 6.0-RELEASE (можно
и другую :) ), mpd, freeradius, netams, mysql, поддержка в ядре или в
виде модулей IPFW, IPDIVERT, PF, NETGRAPH. Рекомендуется включить
поддержку этих компонентов в ядро. Поэтому открываем конфигурационный
файл вашего ядра и добавляем, если не хватает, туда следующее:
options NETGRAPH # собственно поддержка netgraph
options NETGRAPH_PPP # поддержка PPP в netgraph
options NETGRAPH_PPTPGRE # поддержка gre-туннелирования
options IPFIREWALL # включаем поддержку ipfw
options IPFIREWALL_DEFAULT_TO_ACCEPT # политика по умолчанию - ACCEPT
options IPDIVERT # включаем divert-сокеты (понадобится для статистики)
Что касается pf - то я оставил его в виде модуля. Если хотите включить
в ядро - /sys/conf/NOTES вам поможет.
Теперь установим такие пакеты, как freeradius, mpd, mysql и netams.
Коротко:
cd /usr/ports/net-mgmt/netams
make clean
make
make install
make clean
При сборке freeradius обязательно указываем поддержку mysql.
cd /usr/ports/net/freeradius
make clean
make
make install
make clean
cd /usr/ports/net/mpd
make clean
make
make install
make clean
cd /usr/ports/databases/mysql50-server
make clean
make
make install
make clean
Теперь необходимо отконфигурировать установленный софт. MySQL
конфигурим по вкусу - задавая пароли рута и прослушку портов или ее
отсутствие. Затем нужно настроить freeradius. Для начала идем в
/usr/local/etc/raddb/ и переименовываем все файлики из `*.samples' в
`*'. Открываем radiusd.conf. В нем правим следующие настройки:
log_stripped_names=yes # Логируем атрибут User-Name если он найден в запросе
log_auth=yes # Логируем запросы аутентификации
log_auth_badpass=yes # Если пароль неверен - пишем его в Лог
log_auth_goodpass=no # верные пароли незачем писать в лог
Проверяем чтобы была раскоментарена строчка:
$INCLUDE ${confdir}/sql.conf
В секции authorize комментарим
files
и удаляем комментарий с
sql
В секции accounting также снимаем комментарий с sql
INSERT INTO `radcheck` VALUES (1,'user_test','Password','==','qwerty');
INSERT INTO `radreply` VALUES (1,'user_test','Framed-IP-Address',':=','192.168.1.3');
INSERT INTO `radreply` VALUES (1,'user_test','Framed-IP-Netmask',':=','255.255.255.255');
INSERT INTO `radreply` VALUES (1,'user_test','Framed-Protocol',':=','PPP');
По сути ААА готова к использованию. Добавляем в /etc/rc.conf строки:
radiusd_enable="YES"
mysql_enable="YES"
и стартуем скриптами из /usr/local/etc/rc.d/
Проверим радиус на работоспособность:
radtest user_test qwerty 127.0.0.1 0 MyOwnSecret
В результате должны получить что-то вида:
Sending Access-Request of id 189 to 127.0.0.1:1812
User-Name = "user_test"
User-Password = "qwerty"
NAS-IP-Address = localhost
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=189, length=38
Framed-IP-Address = 192.168.1.3
Framed-IP-Netmask = 255.255.255.255
Framed-Protocol = PPP
Это говорит о том, что радиус работает верно. Если нет - смотрим что
он кричит в /var/log/radiusd.log
Пришло время настроить mpd. Смело идем в /usr/local/etc/mpd/ и убираем
из имен конфигов samples. Открываем mpd.conf и пишем туда:
default:
load pptp0
pptp0:
new -i ng0 pptp0 pptp0
load pptp_all
pptp_all:
set ipcp ranges 192.168.1.1/32 10.0.0.0/24
set iface disable on-demand
set bundle disable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
set link keep-alive 60 180
set ipcp yes vjcomp
set ipcp dns 192.168.1.1 # или любой другой доступный DNS
# set bundle enable compression # обязательно проверяем, чтобы это было выключено.
# иначе будем долго искать, почему пинги идут, но ничего не грузится
set pptp enable incoming
set pptp disable originate
# set pptp self 172.16.101.2 # если нужно - задаем ip для открытия 1723 порта. по умолчанию - все
set radius timeout 10
set radius config /usr/local/etc/mpd/radius.conf
set radius retries 3
set bundle enable radius-acct
set bundle enable radius-auth
set ipcp yes radius-ip
Нужно заметить, что для примера создан всего лишь один pptp линк. В
реале их нужно создать столько, сколько вам необходимо одновременных
pptp-туннелей. Создаем mpd.links:
Теперь нужно его проверить. Чтобы проще было вести отладку - добавим в
/etc/syslog.conf:
!mpd
*.* /var/log/mpd.log
И передергиваем syslog. Идем за клиентскую машинку и проверяем
подключение по впн.
Если все прошло удачно - идем дальше, иначе ищем ошибку.
Далее нужно клиентов из внутренней сети с внутренними ip-адресами
выпустить в инет. Для этого у нас есть несколько путей:
воспользоваться связками ipfw+natd или ipfw+ng_nat, но мы пойдем по
пути использования pf.
nat on rl0 from $int_net_vpn to any -> $ext_ip # собсно NAT
pass quick on lo0 all # разрешаем все на lo0
pass quick from $ext_ip to any # Разрешаем траф
pass quick from any to $ext_ip # на внешнем ip
pass quick from $int_net_vpn to any # разрешаем любой траф
pass quick from any to $int_net_vpn # по впн-сети
block in quick on $int_if proto { tcp udp } from $local_net to $int_ip port { 2
5 110 143 3128 3306 } # блокируем платные сервисы из локалки
pass in quick on $int_if from $local_net to $int_ip
block in all # все осальное блокируем по умолчанию
Все. Теперь трафик должен ходить в инет. Осталось организовать
логирование трафика через netams. Приведу лишь коротки отрывки
конфигов - так как на сайте netams.com есть хорошая документация на
русском языке с примерами настройки netams. В rc.conf привычно
добавляем: