Биллинговая система NoDeny. Установка



Автор практически уверен в наличии у вас желания все быстро установить, настроить и получить результат. Поэтому данная инструкция предусматривает быструю настройку работоспособного решения, практически не вникая в тонкости. Предполагается, что изучив работу NoDeny на этом решении, в будущем вы приведете систему в оптимальный вид, детально изучив документацию.

Далее рассматривается вариант установки всей системы NoDeny на один сервер. В будущем не составит труда вынести отдельные компоненты на несколько, возможно, географически распределенных.

Все действия выполняются от имени root, что считается не совсем безопасным - опытный админ знает при каких действиях необходимо переключиться на привилегированную запись, а начинающему поначалу будет проще не отвлекаться на тонкости с правами.

Некоторые действия достаточно подробно описаны, поэтому поставить систему могут как опытные администраторы так и начинающие.


По ходу настройки вам придется указывать несколько паролей, при ознакомительной установке можно не менять указанные в примерах, но в боевой рекомендуем взять блокнот и заранее проставить пароли, чтобы избежать путаницы в будущем.

ЛогинПароль в примереКомментарий
root в mysqlhardpass 
bill_www в mysqlhardpass2Под логином bill_www административный интерфейс соединяется с базами биллинга
bill_kernel в mysqlhardpass4Под логином bill_kernel ядро и агенты на том же сервере соединяются с базами биллинга
admin в админке NoDenyhardpass Этот логин используется только на этапе настройки, после чего автоматически удаляется, т.е пароль можно не менять
nodeny в админке NoDeny  Доступ к админке лучше всего организовать двухступенчатым: сначала под общим логином (например, nodeny), потом авторизация под персональным


Общее представление о построении NoDeny:

Рекомендуемая последовательность установки NoDeny:


В качестве операционной системы возьмем FreeBSD версии 6.x или 7.x и установим, например, так.


Устанавливаем MySQL-сервер. Понадобится версия не ниже 5.0:

Команды bash
cd /usr/ports/databases/mysql50-server/
make BUILD_OPTIMIZED=yes WITH_OPENSSL=yes WITH_CHARSET=cp1251
make install clean
После установки:

Команды bash
/usr/local/bin/mysql_install_db
chown -Rv mysql:mysql /var/db/mysql/
Создаем конфигурационный файл из шаблона. Из-за постоянной смены дефолтного местонахождения конфига, спросим у mysqladmin где mysql будет искать конфиг:

Команды bash
mysqladmin

Видим на экране
Default options are read from the following files in the given order:
/etc/my.cnf /usr/local/etc/my.cnf ~/.my.cnf /usr/local/etc/my.cnf
Поэтому:

Команда bash
cp /usr/local/share/mysql/my-huge.cnf /etc/my.cnf
Редактируем конфиг:

Команда bash
ee /etc/my.cnf

- кодировки в cp1251
- отменим резолв в днс-имена т.к если днс будет недоступен, то коннекты будут идти ооочень долго, в серьезной системе мы должны подстраховаться.

Редактирование my.cnf. Секция [mysqld]
default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect="SET NAMES cp1251"
skip-character-set-client-handshake
skip-name-resolve

Стартуем mysql-сервер:

Команда bash
/usr/local/etc/rc.d/mysql-server forcestart

Устанавливаем пароль учетной записи root в mysql:

Команда bash
/usr/local/bin/mysqladmin -u root password 'hardpass'

Автозапуск при старте системы:

Команда bash
echo mysql_enable=\"YES\" >> /etc/rc.conf

Устанавливаем Web-сервер для административного интерфейса, например, apache версии 2.2:

Команды bash
cd /usr/ports/www/apache22/
make install clean
Автозапуск:

Команды bash
echo apache22_enable=\"YES\" >> /etc/rc.conf
echo /sbin/kldload accf_http >> /etc/rc.local
Стартуем без конфигурирования:

Команда bash
apachectl start
Открываем в браузере:

адресная строка в браузере
http://10.0.0.2/
Если не получаем приветствующего сообщения "It works!" - смотрим логи:

Команда bash
tail /var/log/httpd-error.log


Устанавливаем модули perl стандартно из портов:

Команды bash
cd /usr/ports/databases/p5-DBI && make install clean
cd /usr/ports/databases/p5-DBD-mysql && make install clean
cd /usr/ports/security/p5-Crypt-Rijndael && make install clean

Для графического формирования карт необходим модуль p5-Imager:

Команда bash
cd /usr/ports/graphics/p5-Imager && make install clean
Однако на данном этапе его можно не ставить т.к пакет потянет за собой еще несколько модулей. Перенесем это на потом.


Загружаем на сервер архив с системой NoDeny: nodeny_XX.YY.tar.gz. Хотим предостеречь вас от попытки разархивировать nodeny_XX.YY.tar.gz и после этого загрузить полученные файлы на сервер - некоторые программы могут отключить бинарный режим при передаче текстовых файлов, в результате чего содержимое файлов может быть искажено.

Загружаем nodeny_XX.YY.tar.gz по ftp, предварительно запустив ftp-сервер:

Команда bash
ee /etc/inetd.conf
Раскоментируем строку, начинающуюся с «#ftp». Сохраняем изменения.

Команда bash
inetd

Теперь с компьютера, на который получили архив nodeny, запускаем ftp-клиент. Например, под Windows:

Команда Windows
C:\> ftp 10.0.0.2

Вводим логин и пароль.

Команды ftp-программы
binary
put nodeny_XX.YY.tar.gz
quit

Разархивируем и запускаем на выполнения инсталляционный скрипт:

Команды bash
tar -xf nodeny_XX.YY.tar.gz  -C /root
cd /root/nodeny
perl install.pl

Инсталляционный скрипт работает в режиме диалога: задает несколько вопросов, после чего проводит инсталляцию. Вопросы будут двух типов: yes/no, а также просьбы ввести какие-либо данные, например путь. Если ничего не ввести - это будет означать, что вы согласились с данными по умолчанию, например:

[ND Installer] nodeny dir [/usr/local/nodeny]:

Здесь скрипт спрашивает путь к папке, куда будет установлен NoDeny, при этом в квадратных скобках предлагает вариант по умолчанию, т.е. если ничего не вводить, а нажать enter, то будет принят вариант `/usr/local/nodeny`. Если данные будут некорректными, то скрипт может повторить вопрос.

Итак, после запуска инсталляционного скрипта install.pl, получаем вопрос:

[ND Installer] Select the action:
          1) Install
          2) Upgrade
        any) Exit
Your choice :
Поскольку мы инсталлируем, а не обновляем систему - выбираем первый пункт.

[ND Installer] nodeny dir [/usr/local/nodeny]:

- нажимаем enter, т.е принимаем вариант по умолчанию. Если такая папка существует, что возможно, если вы ранее пытались установить систему, тогда скрипт выведет предупреждение:

[ND Installer] /usr/local/nodeny exists. Probably You need to upgrade It. Are you sure NoDeny need to be installed? [y/n]:

т.е. будет задан вопрос действительно ли мы инсталлируем NoDeny, а не пытаемся обновить предыдущую версию. Соглашаемся (`y`). Кстати, на всякий случай скрипт делает бекап этой папки.

[ND Installer] www dir [/usr/local/www/apache22/data]:

- здесь спрашивается расположение корневой папки Web-сервера. На данный момент для apache 2.2 путь `/usr/local/www/apache22/data`, т.е. нажимаем enter ничего не вводя. Если папка не будет найдена, например, если вы используете иной Web-сервер, тогда необходимо смотреть конфиг этого Web-сервера.

[ND Installer] cgi-bin dir [/usr/local/www/apache22/cgi-bin]:

- аналогичный вопрос, касающийся папки cgi-bin.

[ND Installer] mysql server [localhost]:
[ND Installer] mysql root password [hardpass]:
[ND Installer] NoDeny database [bill]:

- на все вопросы отвечаем нажатием на enter, т.е вводим данные по умолчанию.

После этого скрипт создаст базу данных bill, если root-пароль для mysql был введен правильно. Затем, используя вызов утилиты mysql попытается воспроизвести структуру базы данных NoDeny, хранящуюся в файле bill.sql.

Cообщение:
[ND Installer] Database `bill` exists. ALL DATA WILL BE LOST! Continue? [y/n]:

говорит о том, что база данных bill существует и что при продолжении инсталляции все данные будут утеряны. Сообщение может возникнуть, если вы по каким-либо причинам запустили повторно инсталляцию, например, прервали ее предыдущее выполнение, когда БД уже была создана. Т.к. мы действительно инсталлируем NoDeny, а не обновляем его, смело продолжаем - жмем `y`.

[ND Installer] nodeny www user in mysql (`no` - do not create) [bill_www]:

Вопрос о имени mysql-юзера для административного интерфейса. Соглашайтесь с предложенным по умолчанию.

[ND Installer] Password for nodeny www user in mysql [hardpass2]:
[ND Installer] Ip of nodeny www user in mysql [localhost]:

Если такой юзер уже существует (повторный запуск инсталляции) - будет задан вопрос `продолжать y/n`?

[ND Installer] User exists in mysql. Continue? [y/n]:

Аналогичные 3 вопроса (логин, пароль, адрес) будут заданы и для `nodeny kernel user in mysql` - mysql-юзера для ядра NoDeny. Соглашаемся с предложениями по умолчанию.

После этого скрипт создаст структуру папок, скопирует необходимые файлы на их места дислокации, выдаст соответствующие права и сообщит:

NoDeny has been Installed. OK!

Как видим, кроме клавиши `enter` никакие другие не были использованы.


Тестовый вход в Web-интерфейс, открываем в браузере:

http://10.0.0.2/cgi-bin/adm/adm.pl

В результате получаем приглашение залогиниться в системе. Если ранее при создании логина bill_www установили пароль отличный от указанного в примере, то перед приглашением будет выведено сообщение о неудачной попытке соединиться с базой данных - это нормально.

Поскольку в базу не внесено ни одной учетной записи администратора, необходимо залогиниться под системным логином. По умолчанию это логин: admin, а пароль к нему: hardpass. Если залогиниться не удается - читаем здесь и здесь.

После процедуры логина попадаем либо на титульную страницу либо, если при создании логина bill_www указали иной пароль, на страницу изменения настроек системы NoDeny. Во втором случае в окне настроек слева в меню выбираем раздел «Базы Данных», после чего в поле для пароля БД вводим пароль, который указали для юзера bill_www. Заодно устанавливаем «ключ для кодирования паролей в базе данных» на этой же странице. Ставим галочку над кнопкой «сохранить» и нажимаем эту кнопку. Ниже сообщения об успешности записи конфига выводится ссылка «Создать учетную запись администратора», нажимаем ее, сейчас необходимо создать учетную запись суперадминистратора, после чего вернуться к редактированию конфига. Перед созданием читаем о привилегиях администраторов.

Попасть в меню привилегий администраторов также можно через «Операции» → «Привилегии администраторов». Выбираем «Добавить нового», заполняем поля «логин», «пароль» и «имя», выбираем «создать». В меню выбираем «список администраторов» и видим в списке запись единственного администратора, причем в заблокированном состоянии. Выбираем ссылку «привилегии». В появившемся окне нажимаем на ссылку «Отметить все» либо ставим галочки напротив каждой привилегии, попутно читая описание к ней. Напротив «Запрет на изменение личных настроек» галочку не ставим. Запись считается суперадминистративной если стоят галочки напротив «Редактирование настроек NoDeny» и «Редактирование учетных записей администраторов». Тем не менее, все остальные привилегии имеют силу. Признак «суперадминистратор» дает возможность разрулить критические ситуации в биллинге.

Пора прощаться с системным логином - выбираем в верхнем меню «Авторизация» и логинимся под только что созданной записью суперадминистратора.



Безопасность.

Команда bash
ee /usr/local/etc/apache22/httpd.conf


Для включения HTTPS, перемещаем курсор в конец конфига и раскомментируем строку:
строка файла httpd.conf
Include etc/apache22/extra/httpd-ssl.conf

и добавляем такие:

вставляем в файл httpd.conf
<Directory "/usr/local/www/apache22/cgi-bin/adm/">
    SSLRequireSSL
</Directory>

SSLRequireSSL разрешает доступ к /usr/local/www/apache22/cgi-bin/adm/ только по шифрованному соединению (https).

Для работы по протоколу https необходим сертификат, который можно сгенерировать самому:

Команды bash
mkdir /usr/local/etc/apache22/ssl
chmod 700 /usr/local/etc/apache22/ssl
cd /usr/local/etc/apache22/ssl
openssl genrsa -out server.key -rand randfile -des3 2048
здесь будет запрошен пароль для сертификата, вводим `1111`, учитывая, что через несколько шагов от него избавимся.

Команда bash
openssl req -new -x509 -key server.key -out server.crt -days 365
здесь 365 - количество дней работы сертификата.

Избавимся от пароля в сертификате:

Команда bash
openssl rsa -in server.key -out server.key
вводим `1111`.

Команда bash
chmod 400 server.key
Настройка ssl-конфига:

Команда bash
ee /usr/local/etc/apache22/extra/httpd-ssl.conf
Исправляем пути к сертификатам:

Редактируем файл httpd-ssl.conf
SSLCertificateFile "/usr/local/etc/apache22/ssl/server.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/server.key"
Рестартуем apache:
Команда bash
apachectl restart
и открываем в браузере: https://10.0.0.2/

Если не получаем приветствующего сообщения «It works!» - смотрим логи:

Команда bash
tail /var/log/httpd-error.log

Продолжаем настройку NoDeny через Web-интерфейс.

Идем по ссылкам меню «Операции» → «Настройки» → «Группы клиентов» → «Новая группа». На этом этапе необходимо определиться на какие группы стоит условно разделять наших клиентов. Автор настоятельно рекомендует создать группу «Удаленные» для хранения учетных записей, которые разорвали договора. Поскольку такие записи не должны «мешаться под ногами», то при создании группы ставьте галку напротив «Не отображать группу в обычном списке клиентов», а также «При переходе на новый месяц не производить снятие денежных средств».

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

Технические данные по потокам, ip-адресам и т.д. пока можно не трогать - в будущем успеем это сделать.

Автор рекомендуем разделить клиентов по географическим районам. Например, внесем группы «Левобережный 1», «Левобережный 2» и «Левобережный 3». В будущем, возможно, у вас будет каждый отдельно взятый сервер обслуживать свой район. В таком случае будет достаточно указать, что такой-то сервер должен обслуживать такие-то группы клиентов.


В «Операции» → «Настройки» → «Улицы» добавим улицы районов обслуживания, либо любую одну улицу если не терпится побыстрей настроить тарификацию:

«Операции» → «Тарифы». При первом входе в данный пункт меню, будет выведено 100 сообщений о создании 100 тарифов. Количество тарифов указывается в главных настройках, по умолчанию 100. Все тарифы будут свободными, т.е неопределены. О неопределенности тарифа говорит пустое название. Таким образом, достаточно тарифу дать название и его уже можно использовать. Внизу страницы выберите свободный тариф под номером 1. На самом деле, номер тарифа абсолютно неважен, кроме первого, поскольку он будет использоваться по умолчанию, то мы создадим пакет «Заблокирован». Этот тариф мы будем назначать удаленным клиентам. Дело в том, что у любой клиентской записи, даже если она заблокирована, в обязательном порядке имеется пакет тарификации. Для удаленных клиентов мы будем использовать пакет тарификации стоимостью 0 грн (руб, $), а также предоплаченным трафиком 0 мб. Даем тарифу название «Заблокирован» и ставим галки напротив:

- если у клиента выбран данный пакет, то клиент не может заказать автоматическую смену пакета в следующем месяце;
- у клиентов данного пакета почтовый ящик должен быть заблокирован;
- основной тариф. Для удобства тарифы с этим флагом будут идти вначале списка;
- доступ должен быть заблокирован всегда.

В колонке справа ставим галки напротив всех отделов, по умолчанию отдел всего один: «Офис». Сохраняем тариф.

Создадим административный пакет для самих себя: нулевая стоимость, неограниченный трафик, неограниченная скорость. Выбираем второй свободный пакет, даем название, скажем, «АДМИН», предоплаченный трафик направления номер 1 устанавливаем в значение `!` (ставим единственный символ «восклицательный знак»), в поле стоимости превышения вводим 1. В правой колонке ставим галку напротив нашего отдела, сохраняем тариф.

Остальные тарифы пока рано создавать т.к. необходимо подготовить схему по которой будет происходить тарификация трафика, этим займемся когда будем настраивать учет трафика.


Создаем тестового клиента с административным пакетом: «Операции» → «Новый клиент».




Установка ядра NoDeny - файл nodeny.pl, должен быть постоянно запущенным.

Ядро NoDeny соединяется с базами данным своим персональным логином bill_kernel, скрипт инсталляции должен был создать этот логин.

В файле /usr/local/nodeny/nodeny.cfg изменяем параметры соединения с базами данных: пароль и адреса баз данных, если отличаются от указанных в примере. Все остальные параметры конфигурации ядро получит из базы данных после старта.

Перед запуском ядра важно чтобы в БД находился конфигурационный файл. Однако, если все настраивали четко по инструкции, т.е. не меняли переменные NoDeny - значит конфига еще нет в БД. В меню «Операции» → «Настройки» → «Администрирование» изменяем, к примеру, параметр «Название сети» и нажимаем кнопку сохранения.

Запускаем ядро в тестовом режиме:

Команды bash
cd /usr/local/nodeny
perl nodeny.pl -v -nowait

Результат запуска смотрим на экране. В ssh клиенте типа putty в настройках переключаем консоль в режим win 1251 (Cyrillic) т.к. лог ведется в кириллице. Если ядро не прекратило работу с выводом ошибки - все ок, прерываем по Ctrl+C и запускаем в фоновом режиме:

Команды bash
mv rc.d/nodeny.sh /usr/local/etc/rc.d/
/usr/local/etc/rc.d/nodeny.sh


Также лог запуска смотрим в «Платежи» → «Система». На данном этапе пока не интересуемся снятием статистики трафика, ее обработкой и т.д., этим займемся после настройки фаервола, агентов авторизации и доступа.



Установка агентов авторизации и доступа.

Коротко, агент - это скрипт, который выполняет определенные действия для конкретной группы клиентов. Как минимум, нам необходимы два действия: авторизация абонентов, а также регулирование параметров доступа (разрешать/блокировать/шейпить/ограничивать трафик) в зависимости от условий.

Поскольку наша задача настроить все на одном сервере, то настройка агентов значительно упрощается. Детальная информация по агентам понадобится при настройке распределенной системы, в данный момент пропускаем. Заходим в «Операции» → «Настройки» → «Сателлиты» и выбираем в меню слева «Новый сателлит». Появляется шаблон для создания конфигурации сателлита. Сателлит - это сервер, обслуживающий определенный район или группу клиентов. В нашем случае у нас всю сеть будет обслуживать один сервер, поэтому сателлит будет один. В поле «Логин сателлита» вводим «bill_kernel». Остальные параметры нас пока не интересуют - ими займемся когда будем тюнинговать систему либо разделять сеть на сателлиты. Сохраняем конфиг.

Стандартно в /usr/local/nodeny/ копируются следующие файлы:

noserver.pl	- агент доступа
nofire.pl	- скрипт управления фаерволом
nol2auth.pl	- агент L2-авторизации
nocheck.pl	- скрипт проверки настроек
sat.cfg		- конфигурационный файл
nosat.pl	- вспомогательный модуль, используемый агентами
Если при установке мы использовали стандартные пароли, то sat.cfg не трогаем, в противном случае меняем в нем переменную $Db_pw.

Проверим, что мы нигде не ошиблись, запуском:

Команда bash
perl nocheck.pl

После успешного прохождения тестов, запускаем скрипт L2-авторизации если вы собираетесь ее использовать. NoDeny поддерживает и другие виды авторизаций, например, быстро проверить возможность правильной отработки авторизации можете через web-авторизацию в клиентской статистике.

В отладочном режиме:

Команда bash
perl nol2auth.pl -v
либо в фоновом:

Команда bash
perl nol2auth.pl &

Пробуем авторизоваться с помощью программы авторизатора, после чего смотрим в Web-админку в список клиентов - обозначается ли как авторизованная необходимая клиентская запись: возле нее должно выводится изображение ключика определенного цвета в зависимости от режима авторизации. Не забывайте, что ядро должно быть запущено всегда. Без него клиент будет проходить авторизацию, однако в БД он не будет обозначен авторизованным, поскольку ядро проводит дополнительные проверки и может изменить режим авторизации, скажем на «авторизован, но доступ заблокирован по денежной задолженности».

Если авторизация не проходит, а в отладочном режиме nol2auth.pl работает без ошибок, проверяем прохождение пакетов на клиентском интерфейсе:

Команда bash
tcpdump -iem1 -p -n udp port 7723

и выясняем приходят ли пакетики от клиента, а также уходят ли они к нему, причем уходят именно с того адреса на который пришли (если вдруг вы решили поэксперементировать с настройкой системы). Не блокирует ли фаервол эти пакеты?



Установка агента доступа задача посложнее - поскольку он управляет фаерволом, то сперва настроим его.

Команды bash
mv rc.firewall /etc/
ee /etc/rc.firewall

и в одной из первых строк меняем

ifOut='em0'
на имя интерфейса, который смотрит в "сторону интернета".

В предложенном /etc/rc.firewall правила обеспечивают:

- доступ по ssh к серверу;
- доступ к Web-статистике и админке NoDeny по tcp-портам 80 и 443;
- обслуживание DNS-запросов клиентов внутренней сети (предполагается, что на текущем маршрутизаторе запущен DNS-сервер);
- обслуживание l2-авторизации (авторизаторы NoDeny) клиентов внутренней сети;
- отправку трафика в коллектор его учета (правила с divert);
- разрешение доступа в интернет только разрешенных авторизованных клиентов, по требованию агента доступа noserver.pl.

Если сервер не перегружался, т.е. правила не сформированы, то запускаем вручную:

Команда bash
sh /etc/rc.firewall

Если получаем сообщение об ошибке примерно такое:

ipfw: getsockopt(IP_FW_ADD): Invalid argument

- ядро не скомпилировано с опцией IPDIVERT, не страшно - подгрузим как модуль ядра:

Команды bash
kldload ipdivert.ko
sh /etc/rc.firewall

rc.firewall должен запускаться при старте системы, поэтому:

Команда bash
echo firewall_enable=\"YES\" >> /etc/rc.conf


Для трансляции «серых» адресов в «белые» необходим NAT. Будем использовать pf nat:

Команда bash
ee /etc/pf.conf

Вставляем в файл pf.conf
set limit states 128000
set optimization aggressive
nat pass on em0 from 10.0.0.0/8 to any -> em0
nat pass on em0 from 192.168.0.0/16 to any -> em0
Обязательно вместо em0 укажите внешний интерфейс сервера, т.е тот, который смотрит с сторону провайдера. В это же значение должна быть установлена переменная ifOut в файле /etc/rc.firewall!

Команда bash
pfctl -N -f /etc/pf.conf

и если получаем сообщение:

pfctl: /dev/pf: No such file or directory

то подгрузим pf как модуль ядра и добавим в автозагрузку:

Команды bash
kldload pf.ko
pfctl -N -f /etc/pf.conf
pfctl -e
echo pf_load=\"YES\" >> /boot/loader.conf
echo pf_enable=\"YES\" >> /etc/rc.conf

В фаерволе предусмотрено, что трафик будет отправляться в коллектор, для его подсчета. В NoDeny есть возможность использования разных коллекторов. К примеру возьмем ipcad, который присутствует в портах:

Команды bash
cd /usr/ports/net-mgmt/ipcad && make install clean
echo ipcad_enable=\"YES\" >> /etc/rc.conf

По умолчанию, в конфиге /usr/local/etc/ipcad.conf много комментариев и несколько лишних настроек, удалим все и создадим «с нуля»:

Редактируем ipcad.conf
capture-ports enable;
interface divert port 1 netflow-disable;
interface divert port 2 netflow-disable;
rsh enable at 127.0.0.1;
rsh root@127.0.0.1 admin;
rsh ttl = 3;
rsh timeout = 30;
dumpfile = ipcad.dump;
chroot = /tmp;
memory_limit = 50m;

Команда bash
ipcad -d


Запускаем агент доступа:

Команда bash
perl noserver.pl &

Авторизуемся с помощью программы-авторизатора либо включаем режим «всегда онлайн» у одной из клиентских записей и через несколько секунд:

Команда bash
ipfw table 10 list

видим в списке этот ip. Теперь пробуем получать доступ в интернет только при авторизации и только когда учетная запись незаблокирована.



Автозапуск агентов с запуском системы.

Команда bash
cp /usr/local/nodeny/rc.d/* /usr/local/etc/rc.d/




Тюнинг.

В системе FreeBSD с RAM большей 1 Гб рекомендуется в /boot/loader.conf добавить строки:

kern.maxdsiz="1G"
kern.dfldsiz="1G"

что увеличит максимальный размер процесса до 1 Гб, в противном случае сервер mysql будет использовать лишь 512 Мб. При наличии 4 Гб памяти под процессы можно выделить 2G.

Для сервера с ядром так же желательно увеличить этот параметр до 1 Гб для тех случаев, когда в настройках раздела «ядро» вы указали большое количество записей в кеше адресов. Кеш адресов позволяет увеличить скорость обсчета трафика. Однако, вы должны учитывать тот факт, что эффективность кеша адресов обычно довольно низкая, если учитывать затраты памяти на увеличение скорости обсчета. Если у вас нет недостатка в оперативной памяти, вы можете увеличить кеш-адресов, скажем до 2 млн. записей, соответственно повысив максимальный размер процесса как было указано выше.


Детализация трафика наиболее затратная по объему занимаемой информации. Ориентировочно на каждые 25 млн записей в сутки (это до 5 тысяч абонентов) таблица имеет размер примерно гигабайт. При работе с такими объемами рекомендуется увеличить буфер для ключей, в /etc/my.cnf сервера дополнительной базы данных в секции [mysqld]:

key_buffer = 1000M

где 1000M объем выделяемой оперативной памяти, автор установил в это значение при общем объеме RAM 2 Гб. Обратите внимание, что увеличение размера буфера ключей делаем только для дополнительной БД.

В том же конфиге и в основной и дополнительной БД добавляем/изменяем:

max_connections=500

т.е. увеличим максимально возможное количество одновременных соединений с mysql. Дело в том, что в момент наступления нового месяца запускается скрипт, который проводит снятия со счетов абонентов, обнуляет трафик и выполняет др. сервисные функции. В этот период любопытство клиентов достигает максимального уровня и большое их количество открывает Web-статистику дабы выяснить, что же произошло с их счетом. При этом организуется большое количество соединений с mysql, что может негативно сказаться на работоспособности скрипта «перехода на новый месяц». Значение 500 подобрано для сети с 20 тыс абонентов и имеет значительный запас.


В конфиге mysql дополнительной БД закомментируйте строку:

log-bin=

что отключит ведение логов всех запросов. К сожалению, по опыту автора, не всегда бинарный лог отключается таким способом, поэтому приходится вставлять в конфиг дополнительную директиву:

binlog-ignore-db=bill


Для администраторов, желающих "поковырять" БД, чтобы понять на нижнем уровне структуру БД, рекомендуем установить утилиту phpMyAdmin администрирования СУБД mysql.


Важно!

Все процессы NoDeny привязаны ко времени на сервере основной базы данных. Если время на определенном сервере иное, то за основу все равно берется время из основной БД. Установка неправильного времени крайне нежелательна т.к. очевидно, что трафик должен регистрироваться в точное время. Особенно важно, что тарификация во многом привязана к дню месяца - это день начала потребления услуг, начало нового месяца и др. Во избежание проблем, установите в crontab периодическую синхронизацию времени с сервером времени:

27 */4 * * * /usr/sbin/ntpdate time.windows.com > /dev/null 2>&1

- синхронизация будет происходить каждые 4 часа в 27 минут. Обратите внимание, что это решение «для ленивых» - лучше синхронизировать более правильными средствами.