{"id":2121,"date":"2018-06-05T08:08:22","date_gmt":"2018-06-05T06:08:22","guid":{"rendered":"http:\/\/blog.sfsoft.it\/?p=2121"},"modified":"2018-06-05T09:47:28","modified_gmt":"2018-06-05T07:47:28","slug":"monitorare-il-traffico-di-rete-con-pmacct-su-ubuntu-18-04","status":"publish","type":"post","link":"http:\/\/www.sfsoft.it\/blog\/2018\/06\/05\/monitorare-il-traffico-di-rete-con-pmacct-su-ubuntu-18-04\/","title":{"rendered":"Monitorare il traffico di rete con pmacct su Ubuntu 18.04"},"content":{"rendered":"<p>Aggiornamento dell&#8217;articol0 <a href=\"http:\/\/blog.sfsoft.it\/2017\/01\/19\/monitorare-il-traffico-di-rete-con-pmacct-su-ubuntu-aggiornamento-4\/\" target=\"_blank\" rel=\"noopener noreferrer\">Monitorare il traffico di rete con pmacct su Ubuntu (aggiornamento 4)<\/a> procedendo all&#8217;installazione da sorgenti della versione 1.7.1 ed utlizzando la versione 9 della tabella su Ubuntu Server 18.04<\/p>\n<hr \/>\n<p>Di <a href=\"http:\/\/www.ubuntugeek.com\/bandwidth-monitoring-tools-for-linux.html\" target=\"_blank\" rel=\"noopener noreferrer\">sistemi per il monitoraggio della rete<\/a> ce ne sono molti ma alla fine ho optato per il programma che si chiama <em>pmacct<\/em> che descritto molto grezzamente si tratta di uno sniffer di rete che registra il traffico su <em>MySQL<\/em>, <em>PostgreSQL<\/em> oppure <em>SQLite<\/em>.<\/p>\n<p>Si procede all&#8217;installazione di <em>MySQL<\/em> ( o <em>PostgreSQL<\/em> o <em>SQLlite<\/em> ) nel caso si volesse tutto su unica macchina:<\/p>\n<pre class=\"lang:default decode:true\">sudo apt-get install mysql-server<\/pre>\n<p>Per la configurazione di <em>MySQL<\/em> ( o <em>PostgreSQL<\/em> o <em>SQLlite<\/em> ) rimando alla documentazione ufficiale o gi\u00e0 abbondantemente disponibile in rete.<\/p>\n<p>Nel caso avessimo gi\u00e0 un server <em>MySQL<\/em> esterno, occorre installare solo la parte client:<\/p>\n<pre class=\"lang:default decode:true\">sudo apt-get install mysql-client<\/pre>\n<p>Per avere le ultime versioni occorre installare da sorgenti, per avere per\u00f2 la comodit\u00e0 dei pacchetti <em>.deb<\/em> si pu\u00f2 utilizzare il programma <em>checkinstall<\/em> per creare un installazione personalizzata:<\/p>\n<pre class=\"lang:default decode:true\">sudo apt-get install build-essential checkinstall<\/pre>\n<p>Le dipendenze richieste per la compilazione:<\/p>\n<pre class=\"lang:default decode:true\">sudo apt-get install libpcap0.8-dev libmysqlclient-dev<\/pre>\n<p>Si scarica <a href=\"http:\/\/www.pmacct.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">dal sito<\/a> l&#8217;ultima versione e si estrae l&#8217;archivio, ad esempio:<\/p>\n<pre class=\"lang:default decode:true\">wget http:\/\/www.pmacct.net\/pmacct-1.7.1.tar.gz\r\ntar xzvf pmacct-1.7.1.tar.gz\r\ncd pmacct-1.7.1<\/pre>\n<p>Si procede alla preparazione dei sorgenti, ricordandosi di abilitare il plugin che ci interessa ( nel mio caso uso <em>MySQL<\/em> ) e infine richiamando <em>checkinstall<\/em> al posto di <em>makeinstall<\/em> verr\u00e0 creato ed installato il pacchetto <em>.deb<\/em>:<\/p>\n<pre class=\"lang:default decode:true\">sudo .\/configure --enable-mysql\r\nsudo make\r\nsudo checkinstall<\/pre>\n<p>Copiare a mano i file di esempio:<\/p>\n<pre class=\"lang:default decode:true\">sudo cp -R sql\/ \/usr\/share\/doc\/pmacct\/<\/pre>\n<p>E&#8217; possibile ora cancellare i sorgenti in quanto se volessimo disinstallarlo essendo stato pacchettizzato <em>.deb<\/em> basta usare <em>dpkg -r pmacct<br \/>\n<\/em><\/p>\n<p>Se manca, si deve creare il database con la tabella versione 9, che al momento in cui scrivo \u00e8 l&#8217;ultima, se esiste gi\u00e0 un database basta proseguire alla sezione &#8216;<em>Configurare il programma<\/em>&#8216;:<\/p>\n<pre class=\"lang:default decode:true\">mysql -h host -u root -p &lt; \/usr\/share\/doc\/pmacct\/sql\/pmacct-create-db_v9.mysql<\/pre>\n<p>Impostare i permessi di default ( utente <em>pmacct@localhost <\/em> ):<\/p>\n<pre class=\"lang:default decode:true\">mysql -h host -u root -p &lt; \/usr\/share\/doc\/pmacct\/sql\/pmacct-grant-db.mysql<\/pre>\n<p>Cambiare la password:<\/p>\n<pre class=\"lang:default decode:true\">mysql -h host -u root -p<\/pre>\n<pre class=\"lang:default decode:true\">USE pmacct;\r\nUPDATE mysql.user SET Password=PASSWORD('nuova-password') WHERE User='pmacct';\r\nFLUSH PRIVILEGES;<\/pre>\n<p>Configurare il programma:<\/p>\n<pre class=\"lang:default decode:true\">sudo mkdir \/etc\/pmacct\r\nsudo nano \/etc\/pmacct\/pmacctd.conf<\/pre>\n<p>Un esempio di configurazione:<\/p>\n<pre class=\"lang:default decode:true\">! pmacctd configuration\r\n!\r\n!\r\n!\r\ndaemonize: true\r\npidfile: \/var\/run\/pmacctd.pid\r\nsyslog: daemon\r\n!\r\n! interested in in and outbound traffic\r\naggregate: src_host,dst_host,src_port,dst_port\r\n! on this network\r\npcap_filter: net 192.168.1.0\/24\r\n! on this interface\r\ninterface: eth0\r\n!\r\n! storage methods\r\nplugins: mysql\r\nsql_host: localhost\r\nsql_user: pmacct\r\nsql_passwd: nuova-password\r\nsql_db: pmacct\r\nsql_table: pmacct\r\nsql_table_version: 9\r\n!\r\n! refresh the db every 5 minutes\r\nsql_refresh_time: 300\r\n! reduce the size of the insert\/update clause\r\nsql_optimize_clauses: true\r\n! accumulate values in each row for up to 5 minutes\r\nsql_history: 5m\r\n! create new rows on the minute, hour, day boundaries\r\n!sql_history_roundoff: mhd\r\nsql_history_roundoff: m\r\n! in case of emergency, log to this file\r\n!sql_recovery_logfile: \/var\/lib\/pmacct\/recovery_log\r\n! try to use only INSERT\r\nsql_dont_try_update: true<\/pre>\n<p>Avviare il demone e controllare sul nostro database i record che vengono inseriti:<\/p>\n<pre class=\"lang:default decode:true\">sudo pmacctd -f \/etc\/pmacct\/pmacctd.conf<\/pre>\n<p>E&#8217; anche possibile creare il file di avvio, si crea ad esempio uno script <em>\/etc\/init.d\/pmacctd<\/em>:<\/p>\n<pre class=\"lang:default decode:true\">#!\/bin\/sh\r\n\r\n### BEGIN INIT INFO\r\n# Provides: pmacct\r\n# Required-start: $network $syslog\r\n# Required-stop: $network $syslog\r\n# Default-start: 2 3 4 5\r\n# Default-stop: 0 1 6\r\n# Short-Description: promiscuous mode accounting daemon\r\n### END INIT INFO\r\n\r\nPATH=\/usr\/local\/sbin:\/usr\/local\/bin:\/sbin:\/bin:\/usr\/sbin:\/usr\/bin\r\nDAEMON=\/usr\/local\/sbin\/pmacctd\r\nNAME=pmacctd\r\nDESC=\"promiscuous mode accounting daemon\"\r\nCONFDIR=\/etc\/pmacct\r\n\r\ntest -x $DAEMON || exit 0\r\n\r\nstop () {\r\n    killall -INT pmacctd\r\n}\r\n\r\nstart () {\r\n    if [ -n \"$INTERFACES\" ]; then\r\n        for i in $INTERFACES; do\r\n                ifconfig $i up\r\n                $DAEMON -f $CONFDIR\/pmacctd.$i.conf $DAEMON_OPTS\r\n        done\r\n    else\r\n        $DAEMON -f $CONFDIR\/pmacctd.conf $DAEMON_OPTS\r\n    fi\r\n}\r\n\r\ncase \"$1\" in\r\n  start)\r\n        echo -n \"Starting $DESC: \"\r\n        start\r\n        echo \"$NAME.\"\r\n        ;;\r\n  stop)\r\n        echo -n \"Stopping $DESC: \"\r\n        stop\r\n        echo \"$NAME.\"\r\n        ;;\r\n  restart|reload|force-reload)\r\n        echo -n \"Restarting $DESC: \"\r\n        stop\r\n        sleep 1\r\n        start\r\n        echo \"$NAME.\"\r\n        ;;\r\n  *)\r\n        N=\/etc\/init.d\/$NAME\r\n        echo \"Usage: $N {start|stop|restart|reload|force-reload}\" &gt;&amp;2\r\n        exit 1\r\n        ;;\r\nesac\r\n\r\nexit 0<\/pre>\n<p>E lo si abilita:<\/p>\n<pre class=\"lang:default decode:true \">update-rc.d pmacctd defaults<\/pre>\n<p><strong>Nota<\/strong>: ho notato che su reti diciamo discrete la mole di dati generata influisce notevolmente sulle prestazioni richieste dal server <em>MySQL<\/em>, ogni tanto \u00e8 cosigliato spostare i dati storici su una copia della tabella meglio ancora su un altro <em>database<\/em>\/<em>host<\/em> ed \u00e8 comunque consigliato avere MySQL impostato con l&#8217;opzione di creare le tabelle su singoli files.<\/p>\n<p><strong>Nota 2<\/strong>: se il traffico \u00e8 elevato e si usa il raggruppamento \u00e8 possibile che venga richiesto un server <em>MySQL<\/em> con alte prestazioni di <em>CPU<\/em> e di <em>I\/O<\/em> su disco in quanto le istruzioni di <em>UPDATE<\/em> sono molte, in tal caso ridurre il periodo di raggruppamento ( es. da 30m a 5m ) e usare l&#8217;istruzione &#8220;<em>sql_dont_try_update: true<\/em>&#8221; che usa la memoria per limitare al massimo le istruzioni di <em>UPDATE<\/em>, appoggiandosi a versioni <em>InnoDB<\/em> invece che <em>MyISAM<\/em> delle tabelle.<\/p>\n<p><strong>Nota 3<\/strong>: Nel caso servisse recuperare i dati dal file di recupero ( <em>recovery_log<\/em> ) utilizzare il comando <em>pmmplay<\/em>:<\/p>\n<pre class=\"lang:default decode:true\">pmmplay -d -f \/var\/lib\/pmacct\/recovery_log -U &lt;utentemysql&gt; -P &lt;passwordmysql&gt;<\/pre>\n<p>Se serve solo testare cosa c&#8217;\u00e8 nel file senza fare modifiche al database aggiungere il parametro <em>-t<\/em>.<\/p>\n<p>Sul <a href=\"http:\/\/wiki.pmacct.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">wiki ufficiale<\/a> per\u00f2 sconsigliano di utilizzare il file di recupero dicendo che sar\u00e0 dismesso ma di utilizzare eventualmente un DB di backup:<\/p>\n<blockquote><p><em>While planning for a recovery method, consider that the logfile method is being discontinued and you are encouraged to use the backup DB option.<\/em><\/p><\/blockquote>\n<p><strong>Nota 4<\/strong>: Nel caso si utilizzi un server <em>MySQL<\/em> esterno controllare che le due macchine abbiano lo stesso <em>timezone<\/em> tramite il comando <em>date<\/em>, in caso siano diversi occorre riconfigurarlo per impostarlo uguale, riavviare anche <em>MySQL<\/em> dopo:<\/p>\n<pre class=\"lang:default decode:true\">sudo dpkg-reconfigure tzdata\r\nsudo service mysql restart<\/pre>\n<p>Per tenere anche sincronizzati gli orari tramite un NTP server:<\/p>\n<pre class=\"lang:default decode:true \">sudo ntpdate &lt;host-ntp&gt;<\/pre>\n<p><strong>Nota 5<\/strong>: Nel caso servisse controllare eventuali errori fare riferimento al <em>syslog<\/em>:<\/p>\n<pre class=\"lang:default decode:true \"># Gli ultimi log\r\nsudo tail \/var\/log\/syslog\r\n\r\n# Monitor realtime dei log (uscire con CTRL+C)\r\nsudo tail \/var\/log\/syslog -f<\/pre>\n<p><strong>Nota 6<\/strong>: Se sul gateway ci sono configurate pi\u00f9 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:<\/p>\n<pre class=\"lang:default decode:true\">sudo cp \/etc\/pmacct\/pmacctd.conf \/etc\/pmacct\/pmacctd.eth1.conf<\/pre>\n<p>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 <em>\/etc\/init.d\/pmacctd<\/em> e nella procedura <em>start()<\/em> modificare in:<\/p>\n<pre class=\"lang:default decode:true \">...\r\n    else\r\n        $DAEMON -f $CONFDIR\/pmacctd.conf $DAEMON_OPTS\r\n        $DAEMON -f $CONFDIR\/pmacctd.eth1.conf $DAEMON_OPTS\r\n    fi\r\n...<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aggiornamento dell&#8217;articol0 Monitorare il traffico di rete con pmacct su Ubuntu (aggiornamento 4) procedendo all&#8217;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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,3,23],"tags":[270,16,8,205,20,5],"_links":{"self":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts\/2121"}],"collection":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/comments?post=2121"}],"version-history":[{"count":1,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts\/2121\/revisions"}],"predecessor-version":[{"id":2122,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts\/2121\/revisions\/2122"}],"wp:attachment":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/media?parent=2121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/categories?post=2121"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/tags?post=2121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}