Учёт интернет-трафика арендаторов (netflow)

    По вопросу статистики в общем, и netflow в частности, есть довольно много довольно обширных статей (изучение которых требует приличного времени). Здесь я приведу свои скрипты as-is для не очень сложного ТЗ по сбору и отправке месячной статистики арендаторам.

    Вводная


    Несколько арендаторов получают интернет через NAT (сам NAT завязан через policy-routing на двух провайдеров). У каждого арендатора свой вилан. Вилан «разворачивается» в сеть арендатора через управляемый коммутатор. Каждому арендатору выдаётся свой сегмент локальной сети с запретом ходить в соседние сегменты.

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

    Инструменты: используется netflow на циске, flow-tools на линуксе, MTA, cron.

    Теория


    Маршрутизатор объединяет информацию о похожих пакетах в течения (flows). Похожими считаются пакеты с одинаковой комбинацией src/dst IP/port. Т.е. ip-пакеты файла, скачанного с файлопомойки будут объединены в одно течение. Информация о каждом течении включает в себя от кого кому (4 поля, адрес и порт), количество пакетов, интерфейс, через который пакет отправили, размер переданных данных и время (timestamp). Эти данные отсылаются периодически в udp-пакетах на коллектор — сервер, готовый принять эти данные. Понятно, что коллектор может собирать данные от нескольких отправителей, так что при сохранении данных туда обычно ещё пишут и отправителя. Нужно понимать, что статистика собирается на всех портах, где сказано её собирать. Если сказать «собирать всё на всех портах», то трафик будет посчитан дважды — в момент приёма (как входящий) и в момент отправки в интерфейс клиента (как исходящий). К счастью, nat'ирование происходит между приёмкой и отправкой, так что при NAT'е мы будем внутренние адреса видеть в flows только для одного (внутреннего) интерфейса.

    Конфигурация маршрутизатора


    Не буду её цитировать целиком, покажу только часть, относящуюся к netflow (т.е. опущены ACL'ы, NAT, DHCP для попросивших его и т.д.), кроме того, показан только один интерфейс арендатора (остальные строго по аналогии):
    interface Vlan31
     description RENT: OOO AVTOTRADE room 315,316,317,318
     ip address 192.168.31.1 255.255.255.0
     ip flow ingress
     ip flow egress
     ip nat inside
    
    ip flow-export source Vlan255
    ip flow-export version 5
    ip flow-export destination 192.168.255.254 3000
    

    Как понятно, vlan31 (192.168.31/24) — арендаторы, аналогично ± остальные арендаторы. Vlan255 — Vlan, через который отправлять данные (служебный). Остальные значения понятны и так. (обратите внимание на версию netflow, flow-tools не поддерживают 9ую версию).

    Конфигурация flow-tools


    Приёмник


    Его нужно установить (для дебиана: aptitude install flow-tools). Настройки в /etc/flow-tools/capture.conf:

    -w /srv/netflow/ 0/0/3000
    


    Обратите внимание: netflow жрёт МНОГО места. Приготовьтесь к десяткам гигабайт данных, которые ещё и хранить нужно. Лучше эти данные класть на отдельном разделе.

    Обработка статистики


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

    Фильтры


    Фильтры нужны для программы flow-nfilter, которая принимает на вход двоичный flow, фильтрует его и выдаёт на выход опять же двоичный flow.

    Фильтры в /etc/flow-tools/cfg/filter.cfg. Состоят из примтивов (грубо говоря, названия для элементов фильтра) и фильтров. При вызове flow-nfilter ему указывается имя фильтра, по которому фильтровать.

    Вот пример для двух арендаторов:

    filter-primitive rent31-range
      type ip-address-prefix
      permit 192.168.31.0/24
      default deny
    
    filter-primitive rent3233-range
      type ip-address-prefix
      permit 192.168.32.0/24
      permit 192.168.33.0/24
      default deny
    
    
    filter-definition rent31-out
      match dst-ip-addr rent31-range
    
    filter-definition rent3233-out
      match dst-ip-addr ren32t33-range
    


    Скрипт


    Собственно, основное:

    #!/bin/sh
    #args: 
    #    $1 - rent (01,02,...), 
    #    $2... $N - email adresses to be sent
    year=`date --date='-1 month' +%Y`
    month=`date --date='-1 month' +%m`
    net=$1
    total=`flow-cat /srv/netflow/$year/$year-$month|flow-nfilter -F rent$net-out |flow-stat -f 15|grep -v "#"|awk '{print $3}'`
    shift
    (echo "Total incoming: $total Mb"; flow-cat /srv/netflow/$year/$year-$month|flow-nfilter -F rent$net-out |flow-stat -f 8)|mail -s "report for net 192.168.$net.0/24 for $year-$month" $*
    


    Ключевые моменты: скрипт отправляет статистику за прошлый месяц. (спасибо соответствующей опции date). flow обрабатывается дважды (меня скорость пока устраивает, если начнёт тормозить, нужно будет делать фильтрацию в файл и запускать два отчёта раздельно). Первая обработка даёт нам человекочитаемую цифру в мегабайтах, вторая — табличку о том, кто сколько жрёт.

    При необходимости (конфликте/споре) можно будет руками (с помощью flow-print и grep) выдать полную статистику по каждой цепочке.

    Cron


    Я использую фичи cron'а в debian, это чуть более удобно обычного в unix — у него есть каталог /etc/cron.monthly. В нём файл /etc/cron.monthly/rent-acc:
    /usr/local/bin/rent-acc 31 admin@domain.ru rentuser@example.com manager@company.ru
    /usr/local/bin/rent-acc 3233 admin@domain.ru rentuser2@foobar.baz manager@company.ru
    

    Этот файл, заодно, является и файлом конфигурации для арендаторов (однако, фильтры для новых нужно руками прописывать!). Не забываем про chmod +x на этот файл.

    Результат


    Выглядит примерно вот так:
    
    Total incoming: 67673.187 Mb
    
    #  --- ---- ---- Report Information --- --- ---
    #
    # Fields:    Total
    # Symbols:   Disabled
    # Sorting:   None
    # Name:      Destination IP
    #
    # Args:      flow-stat -f 8 
    #
    #
    # IPaddr         flows                 octets                packets
    #
    192.168.2.16     1321968               4301821906            24858456
    192.168.2.2      2118220               62029649663           51512160
    192.168.2.3      226383                193301694             1129250
    192.168.2.8      105319                350858966             3027875
    192.168.2.5      3240                  60888068              681056
    192.168.2.4      31289                 13434866              217217
    192.168.2.15     200                   32104404              97818
    192.168.2.14     1356                  137727274             1977666
    192.168.2.7      35310                 553217946             10290038
    


    Disclamer


    Обратите внимание, что оказание услуг связи требует лицензии. Единственная лазейка — перевыставление счёта от провайдера за услуги. Именно для этого и нужно считать статистику. Однако, всё вышенаписанное не является сертифицированным биллингом, т.е. требует некоего дружелюбия со стороны платящего.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 10

      0
      Перевыставлять счет от провайдера, это я так понимаю, вы выставляете счет клиенту от имени провайдера на меньшую сумму? Как это на деле выглядит? Спасибо.
        0
        Традиционно, этот метод использовался для телефонии. Есть телефон, есть его абонентка и межгород с него — эти цифры перевыставляются арендатору. 1-в-1.

        Аналогично можно делать и с интернетом. Есть цена превышения, по этой же сумме перевыставляется счёт. Однако, тут есть хитрость: превышение идёт выше месячного предоплаченного тарифа, так что если превышения не было, все деньги — конторе. Но, повторю, это очень шаткая с юридической точки зрения позиция. Для больших денег и большого количества клиентов нужен сертифицированный биллинг и лицензия.
          0
          и меж операторское соглашение.
            0
            … И сорм. А сервера для сорма жутко дорогущие.
        0
        Достаточно заключить с оператором агентский договор (услуги связи предоставляет оператор, а вы по поручению и за счет оператора осуществляете работу с клиентами, то есть арендаторами), а с арендаторами заключить договоры простого товарищества по использованию выделенной линии связи для доступа в Интернет.

        Счета арендаторам можете выставлять сами, но в счете нельзя указывать назначение «за услуги связи» иначе потом прилетит за незаконное предпринимательство, уклонение от уплаты налогов и т.д. В счетах указывайте — компенсация за использование доступа в интернет по акту №…
          0
          Я узнавал условия агентского договора — 10% от суммы. Не смешно.
            0
            Необязательно именно 10,0 (десять) процентов. Агентское вознаграждение может рассчитываться как угодно (фиксированный процент, плавающий процент в зависимости от объема, конкретно доля в трафике или что-то другое), важно прописать весь механизм в договоре.
          0
          netflow 5 не поддерживает egress, только ingress, коего, как правило, достаточно для биллинга.
            0
            … впрочем, с натом всё гораздо веселее станет, не стану упорствовать.
              0
              М… Насколько я понимаю, это циски с netflow 5 не поддерживают egress, а сама спецификация — вполне. Если циска умеет netflow 9, то ей можно сказать «отправлять в netflow 5», и там будет egress.

            Only users with full accounts can post comments. Log in, please.