Monitorare il traffico di rete con pmacct su Ubuntu 18.04
Aggiornamento dell’articol0 Monitorare il traffico di rete con pmacct su Ubuntu (aggiornamento 4) procedendo all’installazione da sorgenti della versione 1.7.1 ed utlizzando la versione 9 della tabella su Ubuntu Server 18.04
Di sistemi per il monitoraggio della rete ce ne sono molti ma alla fine ho optato per il programma che si chiama pmacct che descritto molto grezzamente si tratta di uno sniffer di rete che registra il traffico su MySQL, PostgreSQL oppure SQLite.
Si procede all’installazione di MySQL ( o PostgreSQL o SQLlite ) nel caso si volesse tutto su unica macchina:
1 |
sudo apt-get install mysql-server |
Per la configurazione di MySQL ( o PostgreSQL o SQLlite ) rimando alla documentazione ufficiale o già abbondantemente disponibile in rete.
Nel caso avessimo già un server MySQL esterno, occorre installare solo la parte client:
1 |
sudo apt-get install mysql-client |
Per avere le ultime versioni occorre installare da sorgenti, per avere però la comodità dei pacchetti .deb si può utilizzare il programma checkinstall per creare un installazione personalizzata:
1 |
sudo apt-get install build-essential checkinstall |
Le dipendenze richieste per la compilazione:
1 |
sudo apt-get install libpcap0.8-dev libmysqlclient-dev |
Si scarica dal sito l’ultima versione e si estrae l’archivio, ad esempio:
1 2 3 |
wget http://www.pmacct.net/pmacct-1.7.1.tar.gz tar xzvf pmacct-1.7.1.tar.gz cd pmacct-1.7.1 |
Si procede alla preparazione dei sorgenti, ricordandosi di abilitare il plugin che ci interessa ( nel mio caso uso MySQL ) e infine richiamando checkinstall al posto di makeinstall verrà creato ed installato il pacchetto .deb:
1 2 3 |
sudo ./configure --enable-mysql sudo make sudo checkinstall |
Copiare a mano i file di esempio:
1 |
sudo cp -R sql/ /usr/share/doc/pmacct/ |
E’ possibile ora cancellare i sorgenti in quanto se volessimo disinstallarlo essendo stato pacchettizzato .deb basta usare dpkg -r pmacct
Se manca, si deve creare il database con la tabella versione 9, che al momento in cui scrivo è l’ultima, se esiste già un database basta proseguire alla sezione ‘Configurare il programma‘:
1 |
mysql -h host -u root -p < /usr/share/doc/pmacct/sql/pmacct-create-db_v9.mysql |
Impostare i permessi di default ( utente pmacct@localhost ):
1 |
mysql -h host -u root -p < /usr/share/doc/pmacct/sql/pmacct-grant-db.mysql |
Cambiare la password:
1 |
mysql -h host -u root -p |
1 2 3 |
USE pmacct; UPDATE mysql.user SET Password=PASSWORD('nuova-password') WHERE User='pmacct'; FLUSH PRIVILEGES; |
Configurare il programma:
1 2 |
sudo mkdir /etc/pmacct sudo nano /etc/pmacct/pmacctd.conf |
Un esempio di configurazione:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
! pmacctd configuration ! ! ! daemonize: true pidfile: /var/run/pmacctd.pid syslog: daemon ! ! interested in in and outbound traffic aggregate: src_host,dst_host,src_port,dst_port ! on this network pcap_filter: net 192.168.1.0/24 ! on this interface interface: eth0 ! ! storage methods plugins: mysql sql_host: localhost sql_user: pmacct sql_passwd: nuova-password sql_db: pmacct sql_table: pmacct sql_table_version: 9 ! ! refresh the db every 5 minutes sql_refresh_time: 300 ! reduce the size of the insert/update clause sql_optimize_clauses: true ! accumulate values in each row for up to 5 minutes sql_history: 5m ! create new rows on the minute, hour, day boundaries !sql_history_roundoff: mhd sql_history_roundoff: m ! in case of emergency, log to this file !sql_recovery_logfile: /var/lib/pmacct/recovery_log ! try to use only INSERT sql_dont_try_update: true |
Avviare il demone e controllare sul nostro database i record che vengono inseriti:
1 |
sudo pmacctd -f /etc/pmacct/pmacctd.conf |
E’ anche possibile creare il file di avvio, si crea ad esempio uno script /etc/init.d/pmacctd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/sh ### BEGIN INIT INFO # Provides: pmacct # Required-start: $network $syslog # Required-stop: $network $syslog # Default-start: 2 3 4 5 # Default-stop: 0 1 6 # Short-Description: promiscuous mode accounting daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/sbin/pmacctd NAME=pmacctd DESC="promiscuous mode accounting daemon" CONFDIR=/etc/pmacct test -x $DAEMON || exit 0 stop () { killall -INT pmacctd } start () { if [ -n "$INTERFACES" ]; then for i in $INTERFACES; do ifconfig $i up $DAEMON -f $CONFDIR/pmacctd.$i.conf $DAEMON_OPTS done else $DAEMON -f $CONFDIR/pmacctd.conf $DAEMON_OPTS fi } case "$1" in start) echo -n "Starting $DESC: " start echo "$NAME." ;; stop) echo -n "Stopping $DESC: " stop echo "$NAME." ;; restart|reload|force-reload) echo -n "Restarting $DESC: " stop sleep 1 start echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0 |
E lo si abilita:
1 |
update-rc.d pmacctd defaults |
Nota: ho notato che su reti diciamo discrete la mole di dati generata influisce notevolmente sulle prestazioni richieste dal server MySQL, ogni tanto è cosigliato spostare i dati storici su una copia della tabella meglio ancora su un altro database/host ed è comunque consigliato avere MySQL impostato con l’opzione di creare le tabelle su singoli files.
Nota 2: se il traffico è elevato e si usa il raggruppamento è possibile che venga richiesto un server MySQL con alte prestazioni di CPU e di I/O su disco in quanto le istruzioni di UPDATE sono molte, in tal caso ridurre il periodo di raggruppamento ( es. da 30m a 5m ) e usare l’istruzione “sql_dont_try_update: true” che usa la memoria per limitare al massimo le istruzioni di UPDATE, appoggiandosi a versioni InnoDB invece che MyISAM delle tabelle.
Nota 3: Nel caso servisse recuperare i dati dal file di recupero ( recovery_log ) utilizzare il comando pmmplay:
1 |
pmmplay -d -f /var/lib/pmacct/recovery_log -U <utentemysql> -P <passwordmysql> |
Se serve solo testare cosa c’è nel file senza fare modifiche al database aggiungere il parametro -t.
Sul wiki ufficiale però sconsigliano di utilizzare il file di recupero dicendo che sarà dismesso ma di utilizzare eventualmente un DB di backup:
While planning for a recovery method, consider that the logfile method is being discontinued and you are encouraged to use the backup DB option.
Nota 4: Nel caso si utilizzi un server MySQL esterno controllare che le due macchine abbiano lo stesso timezone tramite il comando date, in caso siano diversi occorre riconfigurarlo per impostarlo uguale, riavviare anche MySQL dopo:
1 2 |
sudo dpkg-reconfigure tzdata sudo service mysql restart |
Per tenere anche sincronizzati gli orari tramite un NTP server:
1 |
sudo ntpdate <host-ntp> |
Nota 5: Nel caso servisse controllare eventuali errori fare riferimento al syslog:
1 2 3 4 5 |
# Gli ultimi log sudo tail /var/log/syslog # Monitor realtime dei log (uscire con CTRL+C) sudo tail /var/log/syslog -f |
Nota 6: Se sul gateway ci sono configurate più interfacce di rete da monitorare ho notato che conviene far girare un processo distinto per ogni scheda, quindi creare una copia del file di configurazione:
1 |
sudo cp /etc/pmacct/pmacctd.conf /etc/pmacct/pmacctd.eth1.conf |
Modificare il nuovo file di configurazione che legga sulla seconda interfaccia e cambiare lo script di avvio in maniera che mandi in esecuzione due processi distinti, quindi aprire /etc/init.d/pmacctd e nella procedura start() modificare in:
1 2 3 4 5 6 |
... else $DAEMON -f $CONFDIR/pmacctd.conf $DAEMON_OPTS $DAEMON -f $CONFDIR/pmacctd.eth1.conf $DAEMON_OPTS fi ... |