NtopNG : version 2.4

NtopNG : version 2.4 jpp

Cette dernière version apporte un plus intéressant (déjà présent en version 2.2) mais je n'ai pratiquement pas testé la 2.2 car la 2.4 Stable est parue peu après mes tests. 
Note 2017 : voir tests de la version 3.1. 
Les tests de cette version sont présentés dans plusieurs "chapitres" :

NtopNG version 2.4 : Installation

NtopNG version 2.4 : Installation jpp

Télécharger la version 2.4 Stable par : 
https://sourceforge.net/projects/ntop/files/ntopng/ntopng-2.4-stable.tar.gz/dow… 
Les pré-requis de la 2.2 (voir article précédent) sont déjà installés, on va essayer de compiler la 2.4 directement : 
./autogen.sh 
Qui se passe bien et nous invite à lancer "configure". 
./configure 2>&1 | tee LOG.CONFIGURE 
Qui semble se dérouler sans accroc et nous rappelle de lancer "make geoip" avant d'utiliser le logiciel. On le lance tout de suite pour être sûr de ne pas oublier ! Cela se dépêche de charger les fichiers de maxmind (IPV4 et IPV6), puis on lance le make final : 
make 2>&1 | tee LOG.MAKE 
Et ... tout se termine correctement.  
Donc si vous avez installé les pre-requis de la version 2.2 il n'y aura probablement aucun problème lors de la compilation. 
Avant de lancer la nouvelle version on détruit les tables de notre user "NtopNG" de la base Mysql car ce n'est pas la meme structure de tables (1 table par interface en 2.2) et quelques champs supplémentaires. 
Comme indiqué en fin de compilation il est aussi possible de générer un paquet (RPM ou DEB) et cette option est même conseillée. A part un petit problème avec la "clef" qui déclenche une petit erreur, le package Debian se génère parfaitement et je l'ai installé sur une autre machine. Je vous conseille cette méthode, tout est expliqué dans le message ... :

cd packages/ubuntu 
./configure 
make 
........ 
Processing ../ntopng_2.4.161017-1373_amd64.deb... 
gpg: error reading key: public key not found 
gpg: no default secret key: secret key not available 
gpg: /tmp/debsigs-ng.eP5yVK/digests: clearsign failed: secret key not available 
E: Signing failed. Error code: 512 
Makefile:10: recipe for target 'ntopng' failed 
make: *** [ntopng] Error 1

L'erreur ne gêne pas la réalisation du paquet, elle ne concerne que la signature,  qui est alors disponible dans le répertoire ".../packages" : 
-rw-r--r-- 1 root root     698 oct.  17 22:42 ntopng_2.4.161017-1373_amd64.changes 
-rw-r--r-- 1 root root 4903998 oct.  17 22:42 ntopng_2.4.161017-1373_amd64.deb

On peut aussi procéder de manière traditionnelle, un petit "su root" et on lance le non moins traditionnel : 
make install 2>&1 | tee LOG.INSTALL 
et on relance le service sans changer nos paramètres de la version 2.2 : 
service ntopng start 
Pour rappel le fichier cd config "/etc/ntopng/ntopng.conf" est minimal : 
-G=/var/tmp/ntopng.pid 
-F=mysql;localhost;ntopng;flows;userntop;passntop 
Le fichier log (/var/log/ntopng/ntopng.log) nous signale que tout va bien et que tous les interfaces sont pris en compte. 
Du coté de la base Mysql seules deux tables on été créées :

show tables; 
+------------------+ 
| Tables_in_ntopng | 
+------------------+ 
| flowsv4          | 
| flowsv6          | 
+------------------+ 
2 rows in set (0.00 sec)

L'analyse sera plus simple qu'en 2.2 car seules deux tables contiennent les données. Changement important dans la structure, les volumes échangés (bytes) sont subdivisés en IN_BYTES et OUT_BYTES. 
Les interfaces étant en mode "promiscuous" tous les paquets passant sur le réseau aux alentours de vos interfaces sont enregistrés. 
La zone "INFO" contient souvent des infos intéressantes, notamment pour le protocole DNS. Le champ INTERFACE_ID permet de repérer les différents interfaces, le champ NTOPNG_INTERFACE_NAME contient le nom de la machine d'origine, on pourra ainsi utiliser une seule base Mysql pour plusieurs capteurs NtopNG. Le numéro de VLAN est enregistré, ici c'est toujours zéro car je n'utilise pas de VLAN sur mon tout petit réseau. 
Pour le champ "PROTOCOL" c'est le standard (TCP = 6, UDP = 17, ICMP = 1) on trouve cela dans tous les bons Wikipedia. 
Attention, le volume de données dans la base est assez conséquent, sur un réseau un peu fréquenté on dépassera rapidement les 200 000 rangs prévoir le stockage adéquat ! 
Il faudra aussi prévoir une petite purge des tables au cas ou celle de Ntop ne soit pas suffisante. Il faut ensuite faire un peu de SQL pour exploiter les données enregistrées. 
Après quelques minutes d'activité vous devriez voir quelques rangs dans votre base Mysql, pour commencer essayez  le scripts SQL suivant :

select inet_ntoa(IP_SRC_ADDR) as IP_SRC, 
inet_ntoa(IP_DST_ADDR) as IP_DST,L4_DST_PORT, 
sum(IN_BYTES) as IN_BYTES,sum(OUT_BYTES) as OUT_BYTES,PACKETS 
from flowsv4 
where IP_DST_ADDR not in (inet_aton('127.0.0.1'),inet_aton('192.168.1.31') ) 
group by IP_SRC_ADDR, IP_DST_ADDR,L4_DST_PORT 
order by IP_SRC

ou encore celui-ci :

SELECT INTERFACE_ID,L7_PROTO,inet_ntoa(IP_SRC_ADDR) as IPSRC,L4_SRC_PORT, 
inet_ntoa(IP_DST_ADDR) as IP_DST,L4_DST_PORT, 
IN_BYTES,OUT_BYTES,PACKETS, 
FROM_UNIXTIME(FIRST_SWITCHED),FROM_UNIXTIME(LAST_SWITCHED), 
INFO,JSON 
FROM ntopng.flowsv4 
order by FIRST_SWITCHED,IP_SRC_ADDR

qui devraient vous afficher les résultats de manière claire et avec des adresses lisibles !

NtopNG : Myisam à Innodb

NtopNG : Myisam à Innodb jpp

Note : valable aussi en V2.4 et V3.0. 
Les deux tables créées par NtopNG sont d'office en MyISAM, si, comme moi, vous avez d'autres tables en InnoDB dans votre base vous allez vouloir profiter des buffers de InnoDB pour vos traitements. 
Par ailleurs, en cas de crash, InnoDB est plus "sûr" que MyISAM.
Mais, car il y a un "mais", si vous faites cette modification "à la main" pour passer les deux tables de MyISAM en InnoDB, ce qui est simple, un simple "alter table truc engine = innodb" ne suffit pas ! 
Si vous le faites, NtopNG s'empressera lors du prochain démarrage de repasser la table en MyISAM ! Et ce sans rien vous demander. 
La seule manière pour réaliser l'exploit de passer en InnoDB est d'aller modifier les sources du paquet. 
Le module "MySQLDB.cpp" vous tend les bras dans le répertoire "src". Il suffit de modifier quelques constantes "MyISAM" --> "InnoDB" aux environs de la ligne 310 pour ressembler à ceci :

// Modify database engine to MyISAM (that is much faster in non-transactional environments) 
  for (u_int16_t i = 0; i < sizeof(ipvers); i++){ 
    snprintf(sql, sizeof(sql), 
         "SELECT 1 " 
         "FROM information_schema.TABLES " 
         "WHERE TABLE_SCHEMA='%s' " 
         "AND TABLE_NAME='%sv%hu' " 
         "AND ENGINE='MyISAM' ", 
         ntop->getPrefs()->get_mysql_dbname(), 
         ntop->getPrefs()->get_mysql_tablename(), 
         ipvers[i]); 
    if(exec_sql_query(&mysql, sql, true, true) > 0){ 
      // if here, the table has enging InnoDB so we want to modify that to MyISAM 
      ntop->getTrace()->traceEvent(TRACE_NORMAL,

    ntop->getTrace()->traceEvent(TRACE_NORMAL, 
                   "MySQL schema update. Altering table %sv%hu: " 
                   "changing engine from Myisam to InnoDB.", 
                   ntop->getPrefs()->get_mysql_tablename(), ipvers[i]);

      snprintf(sql, sizeof(sql), 
           "ALTER TABLE `%sv%hu` ENGINE='InnoDB'", 
           ntop->getPrefs()->get_mysql_tablename(), ipvers[i]); 
      exec_sql_query(&mysql, sql, true, true);

  
Après une petite recompilation et la régénération du paquet on ré-installe et au premier démarrage nos tables sont migrées en InnoDB, automatiquement et sans rien demander ! 
Attention; si vos tables sont un peu volumineuses, cela dure un certain temps ! Et demande de l'espace disque (environ le double de l'espace occupé par la table MyIsam.

NtopNG : début d'analyse des données

NtopNG : début d'analyse des données jpp

J'ai installé NtopNG, par le paquet Debian généré lors de la compilation, sur la machine qui me sert de frontal internet et j'ai commencé à analyser un peu les données enregistrées. D'abord, ça crache épais, je suis actuellement seul à la maison et donc le trafic est un peu réduit. Quelques procédures exemples sont téléchargeables en fin de page. 
Le petit ordre SQL suivant donne un comptage sans prétentions :

SELECT DAY(from_unixtime(FIRST_SWITCHED)),count(*) 
 FROM ntopng.flowsv4 
group by 1

Ramène : 
2   22037 
3   77469 
On est le 3 août vers 20h00 et j'ai démarré le zinzin hier soir, j'ai bossé toute la journée ... et quand même plus de 100000 flux enregistrés ! 
J'ai aussi extrait les adresses IP et j'ai crée une table  IP,PAYS,AS,nom de domaine (voir en fin de page les liens de téléchargement) .... sur ces deux jours j'ai déjà "repéré" plus de 1700 adresses différentes ... provenant de 88 pays. Quand on parle de mondialisation ... 
Bien sûr certains pays sont représentés par une seule adresse. Le petit tableau suivant montre les pays pour lesquels j'ai "collecté" plus de 10 adresses ... :.

                                      PAYS                  

                        count(*)

US     

535

CN     

133

FR     

122

VN     

94

BR     

94

RU     

79

KR     

64

TW     

63

NL     

60

IN     

36

EU     

34

DE     

30

JP     

28

RO     

24

CO     

22

TR     

21

MX     

17

UA     

16

ES     

13

PL     

12

GB     

12

CA     

12

ID     

12

IT     

10

C'est déjà pas mal.

Les Chinois, les russes et les vietnamiens sont systématiquement bloqués par le pare-feu, mais NtopNG enregistre toutes les connexions. Attendons 23:59 pour avoir une journée complète. 
Il est 23:59, statistique sur une journée complète.

 

Visiblement il n'y a pas d'heures pour les braves, il y en a toute la journée.

Télécharger les scripts : 
La création de la table IPV4_DOMAINE, renommez le en ".sql" pour faire bien ! 
La création des index complémentaires sur la table "flowsv4", idem pour le ".sql" 
Le script bash "MAJ_DOMAINE" à renommer en .sh  (nécessite le script DNS_RES) 
Le script bash DNS_RES à renommer en .sh, qui cherche les PAYS,noms DNS, FAI à intégrer dans la base. 
Ce dernier script nécessite l'installation des outils "geoip".