BSDPORTAL.RU

На этом сайте обсуждаются вопросы использования ОС FreeBSD
 Портал  •  Статьи  •  Форум  •  Wiki  •  Поиск  •  FAQ  •  Обои  •   Официальная документация  •  Новые темы 

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Пн 23 янв, 2006 6:59 pm 
Не в сети
Newsmaker
Аватара пользователя

Зарегистрирован: Вт 08 фев, 2005 3:25 pm
Сообщения: 135
Откуда: Донецк
Начало как у всех: прошу с полпинка не пинать ногами :)
Это мой первый опыт написания статьи не для себя - так что жжду любой критики и поправок.

Настройка VPN-сервера с ведением статистики, шейпингом и фильтрацией.

Для начала: данная статья не претендует на роль полноценного руководства или панацеи на все случаи жизни, посему все вопросы и пожелания по исправлению и дополнению статьи шлем на shulik@ua.fm.

Итак - приступим. В работе нам понадобится: 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


Далее смотрим в sql.conf и правим:
Код:
driver="rlm_sql_mysql"
server="localhost"
login="login_k_mysql"
password="pass_k_mysql"


Осталось поправить clients.conf, задав для клиента 127.0.0.1 secret:
Код:
secret=MyOwnSecret


Кроме того нужно создать в mysql базу radius'a следующего содержания:
таблица со словарями:
Код:
CREATE TABLE `dictionary` (
  `id` int(10) NOT NULL auto_increment,
  `Type` varchar(30) default NULL,
  `Attribute` varchar(64) default NULL,
  `Value` varchar(64) default NULL,
  `Format` varchar(20) default NULL,
  `Vendor` varchar(32) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица с клиентами самого радиуса (вместо нее пользуем файлы)
Код:
CREATE TABLE `nas` (
  `id` int(10) NOT NULL auto_increment,
  `nasname` varchar(128) default NULL,
  `shortname` varchar(32) default NULL,
  `ipaddr` varchar(15) default NULL,
  `type` varchar(30) default NULL,
  `ports` int(5) default NULL,
  `secret` varchar(60) default NULL,
  `community` varchar(50) default NULL,
  `snmp` varchar(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица для клиентских сессий:
Код:
CREATE TABLE `radacct` (
  `RadAcctId` bigint(21) NOT NULL auto_increment,
  `AcctSessionId` varchar(32) NOT NULL default '',
  `AcctUniqueId` varchar(32) NOT NULL default '',
  `UserName` varchar(64) NOT NULL default '',
  `Realm` varchar(64) default '',
  `NASIPAddress` varchar(15) NOT NULL default '',
  `NASPortId` int(12) default NULL,
  `NASPortType` varchar(32) default NULL,
  `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctStopTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctSessionTime` int(12) default NULL,
  `AcctAuthentic` varchar(32) default NULL,
  `ConnectInfo_start` varchar(32) default NULL,
  `ConnectInfo_stop` varchar(32) default NULL,
  `AcctInputOctets` int(12) default NULL,
  `AcctOutputOctets` int(12) default NULL,
  `CalledStationId` varchar(10) NOT NULL default '',
  `CallingStationId` varchar(10) NOT NULL default '',
  `AcctTerminateCause` varchar(32) NOT NULL default '',
  `ServiceType` varchar(32) default NULL,
  `FramedProtocol` varchar(32) default NULL,
  `FramedIPAddress` varchar(15) NOT NULL default '',
  `AcctStartDelay` int(12) default NULL,
  `AcctStopDelay` int(12) default NULL,
  PRIMARY KEY  (`RadAcctId`),
  KEY `UserName` (`UserName`),
  KEY `FramedIPAddress` (`FramedIPAddress`),
  KEY `AcctSessionId` (`AcctSessionId`),
  KEY `AcctUniqueId` (`AcctUniqueId`),
  KEY `AcctStartTime` (`AcctStartTime`),
  KEY `AcctStopTime` (`AcctStopTime`),
  KEY `NASIPAddress` (`NASIPAddress`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица для проверяемых параметров:
Код:
CREATE TABLE `radcheck` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `UserName` varchar(64) NOT NULL default '',
  `Attribute` varchar(32) NOT NULL default '',
  `op` char(2) NOT NULL default '',
  `Value` varchar(253) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `UserName` (`UserName`(32))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица для проверяемых параметров групп:
Код:
CREATE TABLE `radgroupcheck` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `GroupName` varchar(64) NOT NULL default '',
  `Attribute` varchar(32) NOT NULL default '',
  `op` char(2) NOT NULL default '',
  `Value` varchar(253) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `GroupName` (`GroupName`(32))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица для возвращаемых параметров групп:
Код:
CREATE TABLE `radgroupreply` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `GroupName` varchar(64) NOT NULL default '',
  `Attribute` varchar(32) NOT NULL default '',
  `op` char(2) NOT NULL default '',
  `Value` varchar(253) NOT NULL default '',
  `prio` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `GroupName` (`GroupName`(32))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица для возвращаемых параметров:
Код:
CREATE TABLE `radreply` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `UserName` varchar(64) NOT NULL default '',
  `Attribute` varchar(32) NOT NULL default '',
  `op` char(2) NOT NULL default '',
  `Value` varchar(253) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `UserName` (`UserName`(32))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

таблица соответствия пользователей и групп:
Код:
CREATE TABLE `usergroup` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `UserName` varchar(64) NOT NULL default '',
  `GroupName` varchar(64) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `UserName` (`UserName`(32))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

И сразу же заведем тестового пользователя:
Код:
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:
Код:
pptp0:
   set link type pptp

И radius.conf:
Код:
acct 127.0.0.1 MyOwnSecret
auth 127.0.0.1 MyOwnSecret

Добавляем в rc.conf строку:
Код:
mpd_enable="YES"

и запускаем mpd.

Теперь нужно его проверить. Чтобы проще было вести отладку - добавим в /etc/syslog.conf:
Код:
!mpd
*.*      /var/log/mpd.log

И передергиваем syslog.
Идем за клиентскую машинку и проверяем подключение по впн.

Если все прошло удачно - идем дальше, иначе ищем ошибку.

Далее нужно клиентов из внутренней сети с внутренними ip-адресами выпустить в инет. Для этого у нас есть несколько путей: воспользоваться связками ipfw+natd или ipfw+ng_nat, но мы пойдем по пути использования pf.

В /etc/rc.conf добавляем:
Код:
pf_enable="YES"
pf_rules="/etc/pf.rules"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""

Файлик pf.rules:
Код:
ext_ip="19х.1хх.хх.хх" # внешний ip-адрес сервера
int_if="rl1" # интерфейс смотрящий в локалку
int_net_vpn="xx.yy.zz.ff" # внутренняя VPN-сеть
local_net="..." # внутрення локалка
int_ip="..." # внутренний ип в локалке

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 { 25 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 привычно добавляем:
Код:
firewall_enable="YES"
firewall_script="/etc/ipfw.sh"

ipfw.sh:
#!/bin/sh

fwcmd="/sbin/ipfw"

${fwcmd} -f flush
${fwcmd} -f flush pipe
${fwcmd} -f flush queue

${fwcmd} pipe 1 config bw 512Kbit/s queue 50 # для обжимки трафа пользуемся pipe'ами
${fwcmd} pipe 2 config bw 512Kbit/s queue 50

${fwcmd} add pipe 1 ip from <vpn_net> to any in # вгоняем траф в пайпы
${fwcmd} add pipe 2 ip from any to <vpn_net> out

${fwcmd} add tee 100 ip from <vpn_net> to any in # копируем траф в divert-socket для netams.
${fwcmd} add tee 100 ip from any to <vpn_net> out

В netams для нас важны разделы:
Код:
service data-source 1
type ip-traffic
source tee 100

service storage 1
type mysql
user mysql_login # с правами создания БД, хотя бы на момент первого запуска
password mysql_pass
host localhost

service monitor 1
monitor to storage 1
monitor unit VPN

unit net name VPN ip <vpn-net> acct-policy ip


Теперь видимо все. Жду отзывы и пожелания на указанное выше мыло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт 24 янв, 2006 11:47 am 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: Чт 23 окт, 2003 12:31 pm
Сообщения: 559
думаю хорошее начало...
со стороны группы переводчиков/авторов статей пожелания по исправлениям/внесению изменений будут?
redbeard если до конца недели конкретных рекомендация по дополнения не возникнет то оформляй в wiki


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт 24 янв, 2006 12:15 pm 
Не в сети
Модератор

Зарегистрирован: Чт 26 май, 2005 12:37 pm
Сообщения: 271
Откуда: Ekaterinburg
вчера прочитал, Минздрав одобрил.

_________________
With shadowed face for the coming centuries


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн 13 мар, 2006 11:09 am 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 21 янв, 2004 8:35 pm
Сообщения: 82
Цитата:
Минздрав одобрил.
он может и одобрил, а я вот не одобрил :) почему?
Цитата:
При сборке freeradius обязательно указываем поддержку mysql.
но при этом MySQL в списке установки указан _после_ FreeRADIUS! а т.к. порты соблюдают зависимости то MySQL будет установлен _до_ сборки FreeRADIUS и его последующая установка попросту сорвется, что смутит читателя данного HOWTO, IMO... не смотрел, но у нетамса кажется тоже в зависимостях мускул есть...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср 19 апр, 2006 1:46 pm 
Не в сети

Зарегистрирован: Ср 19 апр, 2006 1:36 pm
Сообщения: 9
Откуда: Челябинск
Сори за серость, НО где шейпинг то??????

Меня как раз интересует как на MPD организовать шейпинг, знаю что родными средствами MPD это не сделать и есть патчи


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт 20 апр, 2006 9:31 am 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 21 янв, 2004 8:35 pm
Сообщения: 82
Grigorjev Michael писал(а):
Сори за серость, НО где шейпинг то??????
man ipfw, man dummynet, а потом смотри в сторону ip-up ip-down скриптов... кажись так их зовут... ну или какие там скрипты mpd вызывает при поднятии/опускании интерфеса... кидаешь каждый поднятый линк в pipe и вот он, шейпинг...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт 20 апр, 2006 2:53 pm 
Не в сети

Зарегистрирован: Ср 19 апр, 2006 1:36 pm
Сообщения: 9
Откуда: Челябинск
snark про IPFW я вкурсе и ад и даун скриптов тоже, я думал есть другое решение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт 21 апр, 2006 9:18 am 
Не в сети
Аватара пользователя

Зарегистрирован: Ср 21 янв, 2004 8:35 pm
Сообщения: 82
другого увы нет... какие то фичи в xpppd или как его, не помню :( были, но про шейпинг они или нет - точно не скажу...

вообще статья хорошая, но вот порядок установки... он мя чесно говоря смущает... ну да критиковать всегда легче...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Яндекс.Метрика