В этом разделе рассказано, как устроен и работает NETAMS 4.
Сразу скажем, что к версии 3.4 новая версия никакого отношения не имеет. Ни единой строчки общего кода (кроме алгоритмов кеширования информации по потокам во внешнем агенте pcap, написанном на С). Хотя бы потому, что NETAMS 4 полностью написан на Java

Вопрос: Ну зачем так? Жава, плохой и медленный язык. Какое убожество! Писали бы на ПХП или Руби.
Ответ: На ПХП пускай пишут студенты. Java - очень гибкий язык, по сравнению с С/С++ содержит гораздо больше встроенных средств (работа с сетью, коллекциями и прочее), что в противном случае пришлось бы реализовывать самим (забудем про STL). Нет проблем с утечкой памяти и нулевыми указателями. О скорости - современные java runtime оптимизированы очень хорошо, а в процессорах мощи более чем достаточно. Проблемы с производительностью были 5-7 лет назад, сейчас их нет. Да, придется скачать и поставить JRE от Oracle - но это необходимые издержки, в сравнении с необходмостью самостоятельно собирать бинарный комплект из исходников.

Структурно NETAMS 4 состоит из следующих компонентов:

  • процесс биллинга (включает в себя сбор сырых данных, обработку тарифными планами, и их сброс в хранилище)
  • интерфейсная часть (сервер), выполняющаяся сервером приложений jetty. она же отвечает за взаимодействие с платежными системами.
  • интерфейсная часть администратора (клиент), выполняющаяся в веб-браузере
  • интерфейсная часть пользователя (клиент), выполняющаяся в веб-браузере
  • процесс генерации отчетов (реализованы встроенный в биллинг, и как внешний модуль)
  • процесс RADIUS-сервера
  • процесс сбора данных на удаленном хосте (посредством библиотеки libpcap) с возможностью блокировки (FreeBSD (pf, ipfw), Linux (ipset))

Вопрос: Под какой операционной системой это работает?
Ответ: Поскольку все написано на Java, код одинаково хорошо работает и под Windows, и под Linux, и под FreeBSD, скорее всего без проблем заработает под *BSD, Solaris и MacOS (не тестировано). Достаточно лишь наличия в системе Java Runtime (JRE) и некоторого минимального набора native java библиотек (sigar, опционально jnetpcap).

Опишем работу каждого из компонентов в деталях.

Процесс биллинга

Запускается как стационарное java приложение, и является "ядром" системы NETAMS4. Если он не работает - фактически не работает ничего.

Биллинг обеспечивает получение данных от источников данных. Это могут быть внешние источники, которые написаны на С и общаются с операционной системой (ipq/ipfw/netflow/radius/pam/libpcap), или внутренние источники данных, реализованные на Java. На настоящий момент внешний источник реализован для Linux/FreeBSD (RemoteAgent), а из внутренних источников написано три - коллектор Cisco Netflow, обработчик пакетов с локального сетевого интерфейса посредством библиотеки PCAP, и источник опрома коммутаторов по протоколу SNMP для съёма статистики счетчиков интерфейсов. 
Netflow позволяет собирать данные о проходящем трафике с устройства, выдающего поток статистики в определенном формате. Это может быть стоящий рядом маршрутизатор Cisco, или любой Windows/Linux/FreeBSD сервер с соответствующим программным обеспечением (например ipfw2netflow из комплекта NeTAMS 3.4).
Pcap позволяет "смотреть" на проходящие мимо (или через) локального интерфейса Ethernet пакеты даных. Подходит, если сервер, на котором работает NETAMS, является ещё и маршрутизатором локальной сети, или же имеет дополнительну сетевую карту, на которую настроен вывод трафика SPAN-порта

SNMP является старым промышленным протоколом управления телекоммуникационным оборудованием. С его помощью можно получить рзличные параметры работы удалённого устройства, в нашем случае - счетчики байт и пакетов, проходящих через Ethernet-интерфейсы коммутатора доступа.  

Биллинг обеспечивает хранение (загрузку, обновление и сохранение обратно) конфигурационной информации, а также данных о статистике по трафику. Конфигурация хранится в формате XML (используется библиотека XStream), а "тяжелая" статистика - в MySQL (используется JDBC через Mysql Connector/J). Для работы необходимо иметь настроенный сервер MySQL версии 5 или выше. Подержка других СУБД реализуема легко (обращайтесь на support@netams.com).

Биллинг обеспечивает связь с серверной частью веб-интерфейса (RPC, библиотека CAJO)

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

Каждый объект имеет уникальный номер (id), по которому происходит взаимосвязь объектов. Также общими являются некоторые служебные метаданные, например время создания или последней модификации объекта.

Контракт (contract) описывает клиента биллинга - физическое или юридическое лицо. К нему привязаны свойства вроде контактных телефонов, почтового адреса и прочее.

Группа контрактов (contract group) дает возможность объединять записи о контрактах в группы (для удобства работы) - например, сделав группы по подразделениям предприятия.

Лицевой счет (account) описывает валюту и баланс счета.

Валюта (currency) описывает код, человеческое имя и принятое сокращение валюты, используемой для некоего счета. В настоящей реализации заблокирована возможность создавать несколько валют. Если вам мешает это ограничение - обращайтесь на support@netams.com.

Учетный элемент (acctunit) является аналогом unit из NeTAMS 3.4 и описывает объект, по которому ведется непосредственный учет (биллинг). В текущем случае - это IP адрес (подсеть) некоего устройства (абонента, клиента), или же физический порт коммутатора. Потенциально один клиент может иметь несколько закрепленных за ним учетных объектов, в том числе не-IP объекты (а, например, домены или почтовые ящики, за которые надо брать периодическую абонентскую плату).

Тариф (tariff), описывает тарифный план, которым производится учет. Содержит в себе такие параметры, как сроки действия, тип плана (периодический или однократно применяемый), ссылку на предыдущий тарифный план, а главное - на тип обработчика (classname) тарифного плана. В зависимости от типа обработчика, имеет ряд дополнительных параметров (размер абонентской платы, количество включенного трафика, ограничение по скорости и прочее).

Важно: обработчик тарифного плана сделан по шаблону (в терминах Java - реализует некий стандартный интерфейс), и позволяет один раз закодировать, и потом многократно использовать одну и ту же логику работы для нескольких схожих тарифных планов. Например, можно иметь линейку тарифных планов, которые имеют общий обработчик, но отличаются величиной абонентской платы и стоимостью превышения объема включенного в неё трафика.

В настоящий момент реализованы три обработчика "FlatRate2", который обсчитывает трафик линейно (тариф за килобайт отдельно на вход и выход), "PolicyBasedEngine", который позволяет создавать гибкие политики учета на базе настраиваемых критериев (при аналогичном линейном обсчете), и "PeriodicFeeIncludedVolume", который позволяет назначать фиксированную абонентскую плату за период, объем включенного в неё трафика, стоимость перерасхода. 

Важно-важно: обработчик тарифного плана можно:

  • добавлять-удалять на лету, без остановки программы
  • редактировать или писать самостоятельно (обладая соответствующими знаниями)
  • заказывать для разработки авторам NETAMS
  • организовывать любую, *абсолютно* любую фантазию в логике его работы

Сервис (service), описывает экземпляр услуги. Является финальной связкой, которая объединяет:

  • контракт (кому принадлежит услуга)
  • тарифный план (каким способом обрабатывать трафик по услуге)
  • лицевой счет (откуда снимать деньги за услугу)
  • учетный объект (по какому объекту (IP-адресу) идентифицировать услугу) - один или несколько

Изначальная, поставляемая с программой конфигурация имеет по одному объекту каждого типа. Её достаточно, чтобы проверить учет трафика, и денег, по одному IP-адресу.

Интерфейсная часть (сервер)

Запускается как стационарное java приложение, при этом стартует встроенный web/application сервер Jetty. Отвечает на запросы web-клиента (ниже), перенаправляя их в сторону сервиса биллинга. Реализация такова, что вебсервер и сервис биллинга могут исполняться на разных физических серверах, или же возможен запуск всех компонентов на одном сервере. "Слушает" Jetty на порту 8080 (настраивается в netams.properties). Серверная часть интерфейса фактически занимается проброской данных между "толстым клиентом" веб-интерфейса, и процессом биллинга.

Важно: биллинг прекрасно работает, даже если серверная интерфейсная часть не запущена. Перезагрузка (останов-запуск) серверной части интерфейса, и процесса биллинга, друг на друга не влияют.

Интерфейсная часть администратора (клиент)

Запускается из веб-браузера при обращении к серверу http://localhost:8080/webadmin/webadmin.html
Написана с использованием библиотеки Google Web Toolkit, то есть является тяжеловесным AJAX/JavaScript приложением.
Интерфейс интуитивно понятен, обеспечивает в настоящий момент следующие функции:

  • настройку параметров источников данных (откуда принимать netflow-поток, на каком интерфейсе слушает pcap)
  • бэкап/восстановление/просмотр конфигурации биллинга
  • редактирование элементов конфигурации биллинга
  • работу с абонентом
  • "мастера" для удобного пополнения лицевого счета, создания нового абонента и т.д.
  • просмотр простейшей статистики (Quick Reporting)
  • создание, редактирование и запуск отчетов через Сервер Отчетов
  • работу с системами приема платежей
  • вызов подсказки

Интерфейсная часть пользователя

Предоставляет пользователям (абонентам, клиентам) системы биллинга доступ в свой "рабочий кабинет". Доступна при ображении по ссылке http://localhost:8080/ Написана как простой сервлет (исполняется там же, где и серверная часть интерфейса  администратора). Использует HTML-шаблоны, то есть допускает настройку внешнего вида кабинета (контактная информация, логотипы, расположение блоков). Обеспечивает работу с объектами (лицевыми счетами, услугами, статистикой) данного абонента, дает возможность выписать квитанцию для оплаты и т.д. Предусмотрена возможность выбора одного из нескольких типов веб-интерфейсов (тестируется).

Процесс генерации отчетов

Стационарное java-приложение, которое общается с веб-интерфейсом администратора, и процессом биллинга, и служит для генерации "тяжеловесных" отчетов, в основном посредством SQL-запросов к базе данных. Вынесен в отдельный процесс для возможного выноса на другой физический сервер, чтобы не нагружать сервер биллинга.

Процесс RADIUS-сервера

Стационарное java-приложение, реализующее функционал сервера протокола RADIUS. Вынесен в отдельный процесс для возможного выноса на другой физический сервер, чтобы не нагружать сервер биллинга. При использовании соответствующего источника данных позволяет предоставлять и контролировать услугу VPN-доступа посредством управления серверами доступа (NAS).

Вопрос: Так, всё ясно, давайте скорее запускать!
Ответ: Подождите!

Поняв, как устроен NETAMS 4.0, вам необходимо спроектировать будущую систему. Внимание, это очень важно! Пожалуйста, не пытайтесь тут же приступить к установке и настройке, предварительно не потратив пять минут на чтение и обдумывание следующего раздела. Скорее всего, полученный результат окажется не таким, как вы ожидали. Проектирование является ключевым этапом к построению сложной и успешной информационной системы. Итак, продолжим.  

  • No labels

4 Comments

  1. Anonymous

    >> Java - очень гибкий язык, по сравнению с С/С++ содержит гораздо больше встроенных средств (работа с сетью, коллекциями и прочее), что в противном случае пришлось бы реализовывать самим (забудем про STL)

    Забудем про STL и вспомним про Qt который портирован на все платформы, и по богатству средств даст фору Java еще на много лет вперёд. На самом деле очень жаль, что FreeBSD сообщество активно использующее NetAMS на своих серверах получило в новой реализации Java зависимую (читай глюченную, эксперементальную для FreeBSD) NetAMS 4.0.

    Хотя бы не убирайте 3-ю версию для BSD сообщества из шар, дабы не потерять всё то, что BSD сообщество нарабатывало годами.

    1. Думаю вы согласитесь, что программистов на Java на два порядка больше, чем на Qt. Реализовывать вещи, которые уже сделаны на Java, и которыми мы пользуемся (cajo, mysql/j, gwt) самостоятельно на другом языке - увольте. Вряд ли меня кто-то сможет аргументированно убедить, что надо было "делать на Qt/PHP/...".

      3-я версия останется где есть. Должен сказать, что BSD сообщество (да и вообще, юникс-сообщество) РОВНЫМ СЧЕТОМ НИЧЕГО не сделало в плане написания и развития этого кода (хотя я активно предлагал всем желающим поучаствовать). 

      1. Anonymous

        > off top

        У вас быстро работает jira :-)

        > , что BSD сообщество (да и вообще, юникс-сообщество) РОВНЫМ СЧЕТОМ НИЧЕГО

        В России не принято делать вклад в чужой код.

        Ваша система супер альтернатива билинга Traffic Inspector у,

          за которую платят компании в регионах, где интернет для компаний дорогой и бизнес жмёт деньги на покупку выделенного канала (порта).

        Но она не такая простая в установке и настройке как TI, поэтому бизнес платит за TI. И быдло Windows админы одобряют :) 

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

          Да, современные админы привыкли к настройке в "два клика мышкой". Увы, это ведет к непониманию того, что происходит в вашей системе, и как следствие - к проблемам. Мы и так постарались всячески вас оградить от необходимости ставить уйму пакетов, что-то компилировать, править сорцы.