Переезд. Часть 2: биллинг


А теперь он ходит и все время считает. 
(м/ф "Домовенок Кузя") 

Ни шатко, ни валко, но новое оборудование собрано, программы настроены. Запускаем все необходимое программы и... Спустя несколько секунд система зависает. Намертво. Даже танцы с бубном не помогли. Те злоключения описаны на os2.in.ru. Собственно, был нужен не iptrace, а ipstat для сбора статистики по трафику с внешнего интерфейса.

Но нет худа без добра. Через некоторое время SFF обрел подсистему плагинов и один из первых плагинов — ipstat. Хотелось чего-то нового, поэтому для системы учета траффика был выбран Mysql (один первых билдов 4.х появился только-только) и php4, как удобное средство работы с Mysql и "всё равно он уже болтается в системе".

I. Установка и настройка

Краткая инструкция такая: скачиваем mysql, php4, apache по вкусу, как бонус — phpmyadmin. Ищем SFF и выклянчиваем ipstat последней версии.

Ставим apache, php (не забудьте настроить php.exe, чтобы php-скрипты работали из командной строки) и mysql.

Ставим sff. Распаковываем поблизости ipstat и пытаемся их настроить для совместной работы. Ищем авторов, получаем по шее за глупые вопросы. Доводим программы до работоспособности — в настройках SFF появляются следующие строки:

...
[filter]        ; Packet filter
enable = yes
rule = 1 plugin 1
...
[plugins]
plugin=1 C:\sff\bin\ipsfstat.dll
...
а IPSTAT в отличии от настроек по умолчанию получает следующие строки:
; Data mode: Short|Long.
; Default value = Long;
Data = Short
; Plugin mode: Log|Pipe.
; Default value = Log.
Mode = Pipe
Запускаем это. И, выполнив команду:
 IPStat.exe stat lan0
Тупо тарищимся на информацию о прошедших пакетах.

II. "Сидим... Курим... ждем..." (С)

Всё нижеприведённое нельзя рассматривать как "правильное" решение поставленной задачи. Это пример того, как это может быть устроено. Очевидно, что полноценная система учёта трафика должна быть гораздо более продуманной, структурированой и полнофункциональной. Все упоминаемые скрипты доступны, хотя они и не претендуют на учебник по PHP — они работоспособны (и не обладают другими достоинствами). Тем не менее.
  1. Сбор данных.

    Создаём таблицы в Mysql (все эти операции делались через phpmyadmin, из которого потом наружу генерировались скрипты, которые после небольшой модификации приводились к рабочему виду) для каждого месяца с именами вида statYEARMN, где YEAR — год, MN — месяц (stat200401 и тп), следующей структуры:

    CREATE TABLE stat200402 (
      date_time TIMESTAMP NOT NULL,
      from_ip   INT NOT NULL DEFAULT '0',
      to_ip     INT NOT NULL DEFAULT '0',
      size      INT NOT NULL DEFAULT '0',
      KEY from_ip (from_ip),
      KEY to_ip (to_ip)
    )
    
    Не забываем про индексирование по полям from_ip и to_ip.

    Сбор данных можно запускать. Делаем запуск php-скрипта каждые 15 сек (время можно варьировать по вкусу ;)

    php.exe -q stat-mysql.php
    
    В скрипте вызывается ipstat.exe, его stdout парсится, и нужные данные записываются в нужную таблицу базы данных.

  2. "Сети везде" (С)

    Теперь нужно создать таблицы с вспомогательной информацией: список сетей, со специализированной ценой трафика (в моем случае внутрироссийский трафик), список бесплатных сетей (внутренняя подсетка) и таблица тарифов. Список подсетей был выдан провайдером в виде списка из ~1600 строк:

    62.16.0.0/19
    62.16.64.0/19
    ...
    
    Что же. Создаем таблицы net01 и net02 вида:
    CREATE TABLE net01 (
      ip    INT NOT NULL DEFAULT '0',
      mask  INT NOT NULL DEFAULT '0',
      KEY ip (ip)
    )
    
    Пишем простенький парсер файла (пусть это будет снова PHP - table2mysql.php) и заполняем таблицы net01(список от провайдера) и net02 (внутренние сети). При этом маска вида /19 (итп) приводится к побитовой маске (0xffffffff << (32 - net)). Кстати, не забудьте проверить, что в этих таблицах приведён базовый IP-адрес (т.е. с ним уже проделана операция IP & MASK, mask=0xffffffff << (32 - net)).

    Простейшая таблица тарифов — type (int) price (float) — заполняется при создании. Сетка type=0 имеет базовую цены за трафик, type=1 - льготную, а type=2 - нулевую (для внутренней подсети).

  3. А теперь давайте посчитаем.

    Скрипт get_traffic.php. Для заданного IP выбираем весь входной траффик, потом весь входной, от адресов из льготного списка, и, наконец, от адресов из бесплатного списка. Получаем нельготный трафик (вычитая из общего льготные) и получаем общую смету.

    Что-то вроде такого:

    Traffik type 0, 189 Mbytes with price/meg: 0.100000 cost=18.917285
    Traffik type 1, 1155 Mbytes with price/meg: 0.010000 cost=11.556534
    Traffik type 2, 0 Mbytes with price/meg: 0.000000 cost=0.000000
    Whole payment = 30.473819  $
    

III. Что необходимо сделать дальше.

Первый месяц эксплуатации выявил следующие проблемы:
  1. Статистика считается довольно долго. Первое решение (кроме оптимизации скриптов и базы данных) — внести разборку трафика по подсеткам в скрипт, собирающий статистику из ipstat-плагина. Или, скажем, собирать статистику только для интересующих нас IP-адресов.
  2. До запуска Mysqld необходимо проводить проверку целостности базы данных, так как после аварийной перезагрузки она может быть нарушена, и, как следствие, mysql неработособен.
  3. Для случае проблем с mysqld, в скрипт сбора статистики нужно включить обработку такой ситуации. Сбрасывать полученные данные в файл, скажем.
  4. Ну и, конечно, нужен полноценный Web-интерфейс (а вы как думали, зачем PHP?), для запросов, настроек и т.п.
Благодарности:
zuko, nickk - вы меня терпите ;)
banshee, nickk, samm - учите меня основам php и sql.
И всему #os2russian (за редким исключением) за всеобщее безумие.

PS. Упомянутые скрипты доступны на ftp://ftp.pilot-film.com/OS2/bill/

Alexey Gankov (Alex-G)


Интересные ссылки:
Комментариев к странице: 0 | Добавить комментарий
Домой | Проект ядро Core/2 | Проект OS/4 Download | Новости | Гостевая книга | Подробно обо всем | Нужные программы | Проекты | OS/2 FAQ | Всячина | За и Против | Металлолом | #OS2Russian | RDM/2 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ