Niedawno na kanale IRCowym #zabbix padło pytanie, jak monitorować ruch na porcie. Po upewnieniu się, że chodzi o port protokołu, a nie o interfejs w switchu (co jest zresztą chyba bardziej popularnym znaczeniem, szczególnie w kontekście monitoringu), padły propozycje.
Moja ulubiona ostatnimi czasy metoda, czyli czytanie danych o ruchu z flowów. Poważnie, sflow i nfdump rządzą, a wrapper do Zabbiksa, który łyka parametry i używa nfdump jest trywialny do napisania, lekki i działa znakomicie, a wyciąganie dowolnych danych o ruchu jest bardzo wygodne. No ale do tego trzeba mieć zboczenie sieciowe i/lub sprzęt obsługujący flowy, ew. uruchomić zrzucanie flowów na maszynie z Linuksem, co może być zbędnym jej obciążeniem i ogólnie strzelaniem z armaty do muchy.
Prostszym rozwiązaniem jest odczyt danych bezpośrednio z iptables. Przypuśćmy, że chcemy monitorować w Zabbiksie, ile ruchu trafia do serwera na porcie 80, a ile na 443. W tym celu tworzymy reguły, które będą dopuszczały, a jednocześnie zliczały ruch na danym porcie:
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Zakładam, że trafią w odpowiednie miejsce w łańcuchu tak, że ruch będzie przez nie przechodził. Do wyświetlania wartości posłuży iptables -L -n -v. Jak widać, w pierwszej kolumnie jest ilość pakietów, w kolejnej ilość bajtów. W /etc/zabbix/zabbix_agentd.conf dodajemy linię:
UserParameter=traffic.incoming.dstport[*], iptables -L -n -v | grep "dpt:$1" | \
sed 's/K/000/;s/M/000000/;s/G/00000000/' | awk '{print $$2}'
Kolejno: grep po parametrze wywołanym z Zabbiksa, w tym przypadku za parametr posłuży numer portu (czyli czytamy dwie wartości: traffic.incoming.dstport[80] oraz traffic.incoming.dstport[443]), zamiana (zgrubna, bo kilo to 1000, nie 1024) K, M i G na cyfry i wyłuskanie w awk drugiej kolumny, czyli ilości bajtów. Widoczny podwojony $ – bez tego zabbix_agent potraktuje $2 jako drugi parametr przekazany z serwera.
I to by było tyle w temacie. Oczywiście można w prosty sposób rozbudować. Gdyby były jakieś błędy/uwagi/sugestie to walcie śmiało – pisałem na sucho, ja tego typu dane biorę z flowów…