Simple conntrack netlink based traffic accounting
Ostatnia zmiana: 2017-08-13 08:30

Demon nlbwmon pozwala na zbieranie statystyk ruchu sieciowego bazując na mechanizmie kernela conntrack netlink. Mechanizm ten pozwala na proste zbieranie danych nie powodując znacznego obciążenia procesora w stosunku do rozwiązań wykorzystujących np. iptables. W działaniu przypomina inne projekty tego typu: vnstat, bandwidthd, BitMeter OS, ale jest dość dobrze konfigurowalny i umożliwia uzyskania podsumowania danych w różnych formatach.

Co nlbwmon zbiera:
- adresy mac
- liczbę połączeń
- ilość danych wysłanych, w bajtach
- ilość danych wysłanych, w pakietach
- ilość danych pobranych, w bajtach
- ilość danych pobranych, w pakietach
- rodzinę połączeń (ipv4/ipv6)
- protokół (icmp, tcp itd)

Czym nlbwmon nie jest:
- nie przechowuje statystyk sekundowych/minutowych/godzinowych
- nie zawiera historii odwiedzanych stron czy adresów IP
- nie udzieli informacji ile pasma zużył jakiś komputer we wtorek dwa tygodnie temu po południu

Dane zbierane są w cyklach miesięcznych (lub innych określonych przez konfigurację) i umożliwiają późniejszą prezentację zużycia pasma w podziale na hosty (mac adresy), protokoły czy inne dostępne dane.

Instalacja

Obecna wersja dostępna jest dla LEDE, zarówno w wersji rozwojowej jak i stabilnej. Pakiety dostępne są standardowo w repozytorium, wystarczy więc wykonać polecenia:


    # opkg update
    # opkg install nlbwmon

Konfiguracja

Jak dla większości programów w OpenWrt czy LEDE zawarta jest w pliku /etc/config/nlbwmon. Wszystkie opcje są dość czytelne opisane więc nie powinno być problemów z konfiguracją. Domyślna konfiguracja powinna być wystarczająca na początek, choć parę opcji można ustawić "po swojemu".
- warto zwrócić uwagę na listę opcji local_network która definiuje zakres adresów IP na których demon nasłuchuje - można podawać zarówno adresy IP jak również nazwy logiczne sieci typu lan.
- demon domyślnie zbiera i przechowuje dane w pamięci ram (w katalogu określonym przez opcję database_directory - domyślnie jest to /var/lib/nlbwmon).
- w pliku konfiguracyjnym można znaleźć opcję commit_interval która określa co jaki czas dane zostają przeniesione do pamięci stałej routera. Domyślnie opcja ta ma wartość 24 godzin; jeżeli mamy na stałe włączony router to wydaje się ona dobrą wartością. Jednakże w przypadku gdy resetujemy często router można tą wartość zmienić na inną - np. co 15 minut (15m). Można posługiwać się jednostkami czasu: w, d, h, m i s.
- bazy danych w pamięci nieulotnej zapisywane są na stałe w /usr/share/nlbwmon/db.
- w pliku określonym przez opcję protocol_database (domyślnie jest to /usr/share/nlbwmon/protocols) znajduje się lista portów wraz z typami protokołu które program wykorzystuje do gromadzenie danych według aplikacji, czyli klasyfikując ruch według typu połączeń. Można samodzielnie dodać inne porty, jak również usunąć zbędne wpisy dla późniejszej czytelności prezentacji danych.
- warto także zastanowić się nad opcją database_interval, ponieważ określa ona okres zbierania danych. Domyślnie nowa baza danych powstaje pierwszego dnia każdego miesiąca (wartość "1"). Możliwe jest także określenie dowolnego innego dnia miesiąca, dnia liczonego od końca miesiąca ("-2" powoduje rozpoczęcie nowej bazy np. 30 stycznia) lub określonego okresu - podane "2017-01-22/14" powoduje tworzenie nowej bazy co 14 dni zaczynając do 22 stycznia 2017r.

Zmiana wartości database_interval czy protocol_database może spowodować bezużyteczność zebranych dotychczasowych danych.

Uruchomienie

Program powinien uruchomić się samodzielnie po instalacji. Jeżeli z jakiegoś powodu tego nie zrobił można to wykonać standardowo ręcznie:


    # /etc/init.d/nlbwmon enable
    # /etc/init.d/nlbwmon start

Prezentacja wyników

Konsola

Demon działa w tle i zbiera cyklicznie dane umieszczając je następnie w swojej lokalnej bazie danych. Potrzebny jest program służący do prezentacji tych danych - i tu z pomocą przychodzi nlbw. Dostępne są cztery główne polecenia:

  • show: pokazuje zawartość bazy danych w postaci czytelnej dla użytkownika
  • json: pokazuje zawartość bazy danych w formacie json
  • csv: pokazuje zawartość bazy danych w formacie csv
  • list: wyświetla spis baz danych
  • commit: zapisuje bazę danych do pamięci trwałej.
Polecenie podajmy po przełączniku "-c", czyli np.


    # nlbw -c show
        Fam            Host (    MAC )      Layer7      Conn.   > Downld. ( > Pkts. )      Upload (   Pkts. )
IPv4   192.168.10.120 (a8:1a:83)       HTTPS        60      4.25 MB (   4.69 K)   327.08 KB (   3.77 K)
IPv4   192.168.10.208 (ee:d0:59)       HTTPS         2     46.64 KB (      54 )     5.84 KB (      49 )
IPv4   192.168.10.120 (a8:1a:83)       POP3S         3     15.84 KB (      49 )     3.98 KB (      46 )
IPv4       10.1.1.187 (00:00:00)       other       102      7.49 KB (     101 )     7.49 KB (     101 )
IPv4   192.168.10.120 (a8:1a:83)        POP3         2      6.72 KB (      27 )     1.87 KB (      25 )
IPv4   192.168.10.208 (ee:d0:59)       other         3      5.74 KB (      17 )     2.37 KB (      21 )
IPv4   192.168.10.120 (a8:1a:83)        HTTP         5      3.59 KB (      42 )    27.91 KB (      49 )
IPv4   192.168.10.120 (a8:1a:83)       other         5      1.03 KB (      14 )     1.03 KB (      14 )
IPv4   192.168.10.208 (ee:d0:59)        HTTP         1        351 B (       5 )       507 B (       6 )
    # nlbw -c json
{"columns":["family","proto","port","mac","ip","conns","rx_bytes","rx_pkts","tx_bytes","tx_pkts","layer7"],"data":[[4,"TCP",443,"88:53:2e:xx:xx:xx","192.168.10.120",60,4462753,4811,334937,3865,"HTTPS"],[4,"TCP",443,"00:03:7e:xx:xx:xx","192.168.10.208",2,47764,54,5986,49,"HTTPS"],[4,"TCP",995,"88:53:2e:xx:xx:xx","192.168.10.120",3,16228,49,4079,46,"POP3S"],[4,"IP",0,"00:00:00:00:00:00","10.1.1.187",102,7676,101,7676,101,null],[4,"TCP",110,"88:53:2e:xx:xx:xx","192.168.10.120",2,6882,27,1919,25,"POP3"],[4,"IP",0,"00:03:7e:xx:xx:xx","192.168.10.208",3,5887,17,2429,21,null],[4,"TCP",80,"88:53:2e:xx:xx:xx","192.168.10.120",5,3681,42,28590,49,"HTTP"],[4,"IP",0,"88:53:2e:xx:xx:xx","192.168.10.120",5,1064,14,1064,14,null],[4,"TCP",80,"00:03:7e:xx:xx:xx","192.168.10.208",1,351,5,507,6,"HTTP"]]
}
Polecenia można używać łącznie z kilkoma przełącznikami umożliwiającymi modyfikację formatu prezentacji danych. Są to głównie: -g (grupowanie danych) oraz -o (prezentacja określonych kolumn). Dla przykładu:


    # nlbw -c show -g mac -o -tx,layer7
MAC                  < Layer7      Conn.     Downld. (   Pkts. )    > Upload (   Pkts. )
88:53:2e:xx:xx:xx       other       115      4.89 MB (   7.21 K)   630.84 KB (   6.35 K)
00:03:7e:xx:xx:xx       other        16    145.40 KB (     228 )    46.38 KB (     230 )
00:00:00:xx:xx:xx       other       140     10.39 KB (     140 )    10.39 KB (     140 )

    # nlbw -c show -g layer7 -o -tx
Layer7     Conn.     Downld. (   Pkts. )    > Upload (   Pkts. )
HTTPS       168      7.46 MB (  12.76 K)   930.16 KB (  11.58 K)
HTTP         25     99.18 KB (     272 )   150.08 KB (     320 )
other       178     40.88 KB (     232 )    34.02 KB (     238 )
POP3S         9     47.54 KB (     148 )    11.78 KB (     135 )
POP3          6     20.46 KB (      87 )     5.62 KB (      75 )


Dostępne są kolumny: family, proto, port, mac, ip/host, conns/conn, rx/rx_bytes/rx_pkts, tx/tx_bytes/tx_pkts. Podane znaku "-" przed nazwą kolumny powoduje posortowanie danych w odwrotnej kolejności:


    # nlbw -c show -g layer7 -o tx
Layer7     Conn.     Downld. (   Pkts. )    < Upload (   Pkts. )
POP3          6     20.46 KB (      87 )     5.62 KB (      75 )
POP3S         9     47.54 KB (     148 )    11.78 KB (     135 )
other       182     41.17 KB (     236 )    34.31 KB (     242 )
HTTP         25     99.18 KB (     272 )   150.08 KB (     320 )
HTTPS       171      7.64 MB (  13.59 K)   978.09 KB (  12.42 K)
    # nlbw -c show -g layer7 -o -tx
Layer7     Conn.     Downld. (   Pkts. )    > Upload (   Pkts. )
HTTPS       171      7.64 MB (  13.59 K)   978.09 KB (  12.42 K)
HTTP         25     99.18 KB (     272 )   150.08 KB (     320 )
ther        182     41.17 KB (     236 )    34.31 KB (     242 )
POP3S         9     47.54 KB (     148 )    11.78 KB (     135 )
POP3          6     20.46 KB (      87 )     5.62 KB (      75 )


Grafika

Wraz z program nlbwmon dostarczana jest odpowiednia aplikacja dla LuCI. Instalacja:


    # opkg install luci-app-nlbwmon

W menu głównym powinna pojawić się pozycja "Bandwidth Monitor" posiadająca trzy opcje:
- Display

Umożliwia wyświetlenie podziału transferu w podziale na hosty (mac adresy), podział na protokoły, rodzinę połączeń oraz eksport pogrupowanych danych. Prezentacja danych odbywa się w postaci tabelarycznej oraz interaktywnych wykresów kołowych - kliknięcie danego obszaru powoduje zaznaczenie odpowiedniego wiersza w tabeli.







- Configuration

Ustawienia demona nlbwmon.





- Backup

Backup i przywrócenie bazy danych.

Problemy

W momencie pisania tego opisu (sierpień 2017r) projekt liczy sobie zaledwie kilka tygodni i nękają go jeszcze różne dolegliwości wieku młodzieńczego. Dotychczasowe zauważone przeze mnie:
- zdarza się problem ze zbieraniem danych i dostępem do zebranych danych. Zwykle pomaga restart samego demona.
- na jednej z używanych instalacji nie przenosi się baza danych z zebranymi danymi do pamięci flash. Nie pomaga zmiana okresu zapisu, nie pomaga ręcznie wymuszenie zapisu czy wyłączenie demona. Należy więc upewnić się że dane są faktycznie zapisywane we flash, ewentualnie samodzielnie zatroszczyć się o regularne kopiowanie danych na np. na nośnik USB.
- problemu ze zbieraniem danych dla IPv6