Software Components and Usage

 

Executables are located in the /opt/trafMon/bin and /opt/trafMon/testing directories:

 

bin/tmon_collector
bin/tmon_probe
bin/trafMon_loader.py
bin/trafMon_updateIpInfo.py
bin/trafMon_FormatNetFlow.py
bin/trafMon_volumeReportGen.py
bin/trafMon_detailReportGen.py
bin/trafMon_probeResurrect.sh.sample
bin/trafMon_serverResurrect.sh.sample
testing/trafgen
testing/ftpgen.py
testing/trafgen.py

 

Some MySQL stored procedures, provided in the trafMon_template database, are also for direct use:

 

trafMon_template.Update_ftp_data_in_ipcttable()
trafMon_template.Aggr_activityvolumetable_first_level()
trafMon_template.Aggr_activityvolumetable_netflow_first_level()
trafMon_template.Drop_working_tables()
trafMon_template.Partition_drop()

 

The most important commands are explained here below.

 

 

1. The Probes

The probe executable has the following usage:

tmon_probe [-l] [-c configXML] [-n NEWconfigXML] probeName

 USAGE:
     -l (local) means using ./tmon.xml, ./tmon-new.xml and,
                           if it exists, ./tmon_probe.diag
     -c means use the given XML, and nothing else
     -n monitors the given NEW XML for scheduled config update
                         (based on its `startAt' attribute
 If -l is NOT given, /etc/trafMon/xml/tmon.xml is used
 If -l and -n are NOT given, /etc/trafMon/xml/tmon-new.xml is looked at
 If -l is NOT given, or ./tmon_probe.diag doesn't exist,
                         /etc/trafMon/diag/<probeName>.diag is used

 

2. The Central Processing System

2.1 The Collector

The collector executable has the following usage:

tmon_collector [-l] [-c configXML] [-n NEWconfigXML] collectorName

USAGE:
        -l (local) means using ./tmon.xml, ./tmon-new.xml and, if it exists, ./tmon_collector.diag
        -c means use the given XML, and nothing else
        -n monitors the given NEW XML for scheduled config update
                        (based on its `startAt' attribute
 If -l is NOT given, /etc/trafMon/xml/tmon.xml is used
 If -l and -n are NOT given, /etc/trafMon/xml/tmon-new.xml is looked at
 If -l is NOT given, or ./tmon_collector.diag doesn't exist,
                        /etc/trafMon/diag/<collectorname>.diag is used

 

2.2. The scripts

This section describes the different scripts used by the trafMon software for a variety of tasks. The scripts are located in /opt/trafMon/bin/ unless mentioned otherwise explicitly.

trafMon_loader.py [options]

Options:
  -h, --help            show this help message and exit
  -p PATH, --path=PATH  Path to the directory containing the data file to load
                        into the DB (default: /var/trafMon/collector/
  -l, --localConfig     If -l is specified, the db.cred file in the current
                        directory is used. Otherwise, the default
                        /etc/tmon/cred/db.cred file is loaded
  -L LOGFILEDIRECTORY, --logFileDirectory=LOGFILEDIRECTORY
                        Path to log directory (default: /var/trafMon/log/)

This script loads the probe and collector data, and optionally the SiLK NetFlow records, into the MySQL database.

Bulk load in temporary tables, then update persistent lists and persistent counters aggregates at 1 minute, 1 hour and 1 day.

 

trafMon_updateIpInfo.py [options]

Options:
  -h, --help            show this help message and exit
  -p INFOFILE, --path=INFOFILE
                        File pathname to the .ini file with information about
                        the known IP adresses/segments. (Default:
                        /etc/trafMon/ipInfo.ini)
  -l, --localConfig     If -l is specified, the db.cred file in the current
                        directory is used. Otherwise, the default
                        /etc/tmon/cred/db.cred DB configuration file is loaded
  -g GEOIPPATH, --geoipPath=GEOIPPATH
                        Path to the directory with GeoLite2 or Maxmind GeoIP2
                        databases (Default: /var/trafMon/GeoIP/)
  -a, --all             Activate a full update of the ipInfoTable rather than
                        a partial one (partial means that we do not try to
                        resolve addresses which have already been successfully
                        resolved previously).
  -L LOGDIR, --logFileDirectory=LOGDIR
                        Path to log directory (default: /var/trafMon/log/)

This script fills the MySQL “ipInfotable” table relating an IP with a location, an activity and/or a country, a city and an ASN, and performs a DNS reverse lookup.

It applies to unsolved IP addresses (typically those freshly discovered; or, with –all, it conducts a complete re-scan of all registered IP addresses.

MAXMIND® free GeoLite2™ IP geolocation database files

The MaxMind Company sells GeOIP registries. It is also providing free access to GeoLite2 semi-accurate version of their commercial product. But, since the legal enforcement of privacy protection of personal data (in particular in California and the EU), users must first register at their site before getting the database files: https://dev.maxmind.com/geoip/geoip2/geolite2/. Please carefully analyse the licensing conditions. The databases used to obtain information about an IP should be downloaded or copied in /var/trafMon/GeoIP/.

Previously, the following commands could be used while being in the said directory:

– wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
– wget http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz
– gunzip *.gz

These commands downloaded the two database files used by the script and decompress them.

 

trafMon_FormatNetFlow.py [options]

Options:
  -h, --help            show this help message and exit
  -H nbOfHours, --hour=nbOfHours
                        Number of hours of data to process (starting from the
                        past hour). This option has precedence to the
                        start/end date options. E.g.: '-H 2' at 14:36:27 means
                        data for [12:00:00, 14:00:00]
  -S startTime, --dateStart=startTime
                        Time at which the collection of data will begin
                        (format: YYYY/MM/DD:HH). The data for the given hour
                        are included in the results.
  -E endTime, --dateEnd=endTime
                        Time at which the collection of data will end (format:
                        YYYY/MM/DD:HH). The data for the given hour are
                        included in the results.
  -N SRCPATH, --netflowdata=SRCPATH
                        Path to the root of the SiLK collected NetFlow data
                        (default: /var/silk/data/)
  -D DSTPATH, --collectordata=DSTPATH
                        Path to the runtime observations logs produced by the
                        trafMon Collector, where to place the NetFlow
                        extracted log (default: /var/trafMon/collector/)
  -C SILKCONFIG, --silkconfig=SILKCONFIG
                        Path to SiLK config file (default: /var/silk/twoway-
                        silk.conf)
  -s SILKBIN, --silkbin=SILKBIN
                        Path where to find SiLK rwfilter and rwcut utilities
                        (default: /usr/local/bin/)
  -L LOGDIR, --logFileDirectory=LOGDIR
                        Path to log directory (default: /var/log/trafMon/)

This script retrieves, every hour, the NetFlow records received and stored in the SiLK tree of raw log binary log files. The resulting text file is added to the trafMon collector output, subject to next run of trafMon_loader.py.

 

trafMon_volumeReportGen.py [options]

Options:
  -h, --help            show this help message and exit
  -d DBname, --db=DBname
                        Database to be used. Default to 'trafMon'.
  -r report, --report=report
                        Type of synthesis report to be generated. Possible
                        choices are: [manager, operator, conversation].
                        Default to 'manager'.
  -D destination, --destination=destination
                        Destination directory. Default to
                        '/var/trafMon/reports/2020/11/13', where the
                        'YYYY/MM/DD' part is the generation time of the report
                        (today).
  -t top, --top=top     Top-N to be used. Possible choices are: [5, 10, 15,
                        20, 25]. Default to top-5.
  -T threshold, --threshold=threshold
                        Threshold bandwidth in b/s to be used. Possible
                        choices are: [0, 1000, 10000, 50000, 100000, 500000].
                        Default to 1000.
  -A activityName, --activity=activityName
                        Activity to be used. Default to 'any'. Use quotes if
                        the activity name include a space.
  -L locationName, --location=locationName
                        Location to be used. Default to 'any'. Use quotes if
                        the location name include a space.
  -H hostName, --host=hostName
                        Host to be used. Default to 'any'. Use quotes if the
                        host name include a space.
  -s startDate, --startDate=startDate
                        Start date to be used (format: 'YYYY-MM-DD'). Default
                        to first day of previous month.
  -e endDate, --endDate=endDate
                        End date to be used (format: 'YYYY-MM-DD'). Default to
                        last day of previous month.
  -l LOGDIR, --logFileDirectory=LOGDIR
                        Path to log directory (default: /var/log/trafMon/)
  -R TEMPLATESFOLDER, --reportTemplatesDirectory=TEMPLATESFOLDER
                        Path to trafMon report templates directory. Default:
                        /opt/trafMon/trafMon_reports/
  -g GENREPORT, --genReport_sh=GENREPORT
                        Full pathname to the Birt runtime 'genReport.sh'
                        utility. Default to /opt/trafMon/bin/genReport.sh,
                        which is typically a symbolic link to the BIRT RunTime
                        installation/ReportEngine/genReport.sh

This script is used to automatically produce a sysnthesis PDF report.

 

trafMon_detailReportGen.py [options]

Options:
  -h, --help            show this help message and exit
  -l, --localConfig     if -l is specified, db.cred file is fetched from the
                        current directory. Default: /etc/trafMon/cred/
  -f FILENAME, --filename=FILENAME
                        Give a pathname or filename containing IP address
                        patterns in concerned Flow Instances. This file
                        basename is also the root of the tree of generated
                        reports. When relative, the file is fetched from
                        current directory when -l is specified, otherwise from
                        default /etc/trafMon/report/
  -D destination, --destination=destination
                        Destination directory. Default to
                        '/var/trafMon/reports/'.
  -s STARTDATE, --startDate=STARTDATE
                        Give a start date in format: 'YYYY-MM-DD'
  -e ENDDATE, --endDate=ENDDATE
                        Optionally give an end date in format: 'YYYY-MM-DD'
  -t TIMESPAN, --timespan=TIMESPAN
                        Without endDate: choose between 'weekly' or 'monthly'
                        report. With endDate: give any identifier for this
                        type of reports.
  -L LOGDIR, --logFileDirectory=LOGDIR
                        Path to log directory. Default: /var/log/trafMon/
  -T TEMPLATESFOLDER, --reportTemplatesDirectory=TEMPLATESFOLDER
                        Path to trafMon report templates directory. Default:
                        /opt/trafMon/report/
  -g GENREPORT, --genReport_sh=GENREPORT
                        Full pathname to the Birt runtime 'genReport.sh'
                        utility. Default to /opt/trafMon/bin/genReport.sh,
                        which is typically a symbolic link to the BIRT RunTime
                        installation/ReportEngine/genReport.sh

This script is used to automatically produce the set of protocol details PDF reports for IP hosts whose address match the configured patterns.

 

trafMon_probeResurrect.sh.sample “<tmon_probe start cmd>” <logfile_pathname>

 

trafMon_serverResurrect.sh.sample <log_pathname> [(“” | “<tmon_coll start cmd>”)
[(“” | “<msqld start cmd>”) [“<tomcat start cmd>”]]]

These sample scripts can be adapted and scheduled every minute by the crontab or the appropriate Linux accounts, on the appropriate computers, to automatically launch (or re-launch after potential crash) the key daemon processed of an operational trafMon installation.

 

3. MySQL Stored Procedures

 

Update_ftp_data_in_ipcttable( _dbName, _rangeStart, _rangeEnd)

Assigns the volumes of actual FTP data connections to their original data flows, encompassing corresponding FTP control session.

 

Aggr_activityvolumetable_first_level( _dbName, _rangeStart, _rangeEnd)

For the given range of days (up to yesterday), or for yesterday when both rangeStart and rangeEnd are NULL, update the prepared tables, at 1 hour and at 1 day granularity, for the “quick” generation of synthesis reports on trafMon probe data: with every flow having full description of its peer IP systems, full volumes in each direction, and the corresponding FTP and TCP key performance values.

 

Aggr_activityvolumetable_netflow_first_level( _dbName, _rangeStart, _rangeEnd)

For the given range of days (up to yesterday), or for yesterday when both rangeStart and rangeEnd are NULL, update the prepared tables, at 1 hour and at 1 day granularity, for the “quick” generation of synthesis reports on SiLK gathered NetFlow data: with every flow having full description of its peer IP systems and full volumes in each direction.

 

Drop_working_tables( )

Drops, from all existing trafMon database instances, the remaining working tables, produced upon the generation of BIRT report instances, and that cannot be declared as temporary tables (automatically drop at end of database connection).Those working table names start with an ‘_’.

 

Partition_drop( SCHEMANAME, TABLENAME, NB_DAYS)

Cleanup the given trafMon database from obsolete fine-gain observations from the given table name (stored in separate physical partitions of a same logical table), while preserving the last NB_DAYS days of data.

 

4. Traffic Generators

 

trafgen [-l] [-c XML] tgenName

USAGE:
                -l (local) uses ./.xml and if it exists, ./trafgen.diag
                -c means use the given XML, and nothing else
        If -l is NOT given, /etc/tmon/xml/<tgenName>.xml is used
        If -l is NOT given, or ./trafgen.diag doesn't exist,
                        /etc/tmon/diag/<tgenName>.diag is used

Conducts fully controlled repetitive scenarios, defined in an XML configuration file, of sending specially crafted UDP and/or TCP packets.

ftpgen.py host user password number-of-simultaneous-connections-to-server filename(optional default=totransfer.tar)

Conducts an FTP transfer session.

trafgen.py

Continuously repeats scenario (selected by editing the script) mixing ICMP Echo (ping), SNMP, NTP, DNS and FTP traffic (this last via ftpgen.py).

 

These utilities are used to generate traffic during the trafMon setup and configuration phase, or to qualify data links under “worst case” traffic patterns.

On the receiving side, following system daemons are “receiving” the traffic:

    • “vsftpd” for the ftp traffic
    • “ntpd“ for ntp traffic
    • “snmpd“ for snmp
    • “named“ for dns traffic
    • “httpd“ for http traffic

 

5. The cron tables

 

A typical trafMon collector cron table, for unprivileged trafmon Linux account, includes: 

    • Execution every 10 minutes (or so) of the trafMon_loader.py, followed by trafMon_updateIpInfo.py
    • Once per week, or less, trafMon_updateIpInfo.py –all
    • The NetFlow data are extracted from the SiLK database once every hour (for the previous hour, when we can be pretty sure that all the connections are closed): trafMon_FormatNetFlow.py
    • During a quite period at night, call the Aggr_activityvolumetable_first_level(“trafMon”, NULL, NULL), just after invocation of Update_ftp_data_in_ipcttable(“trafMon”, NULL, NULL) MySQL stored procedure.
    • At another quiet time at night, optionally call the Aggr_activityvolumetable_netflow_first_level(“trafMon”, NULL, NULL) MySQL stored procedure.
    • The Drop_procedure() is called regularly to clean the database of temporary tables (typically, tables created when generating reports).
    • The schedule for trafMon_volumeReportGen.py and/or trafMon_detailReportGen.py scripts can be added to generate reports automatically.
    • After careful monitoring of the growing rate of fine-grain trafMon raw observations tables, specific invocations of the Partition_drop() MySQL stored procedure can be automatically scheduled.
    • Every minute, the trafMon_serverResurrect.sh /var/log/trafMon/resurrect.log “/opt/trafMon/bin/tmon_collector TMonServer” will permit to (re-)start a missing trafMon collector process.

A typical cron table for the privileged root Linux account, would include: 

 

    • Every minute, the trafMon_serverResurrect.sh (for mysqld and tomcat services only) or trafMon_probeResurrect.sh (unless invoked by unprivileged trafmon Linux account, thanks to setcap tuning).
    • Every hour, the logrotate for the trafMon specific logrotate configuration

6. Optional CERT® SiLK

 

The SiLK Netflow receiver and database has three main configuration files, located in /var/silk and /usr/local/etc/:

    • rwflowpack.conf: defines how the software itself should behave: where to log events, where to store data, etc.
    • twoway-silk.conf and sensor.conf: defines which version of NetFlow the sensor(s) will receive, whether it will be over TCP or UDP and how to categorize the IPs.

These configuration files will be set up as needed or can be used as is.
If any other information is needed, please refer to the SiLK documentation.

  

7. MySQL

The specific setup of a running MySQL server for its use by the trafMon tool consists of 3 steps:

    • Defining two database users (e.g. tmon_db and tmon_birt: db_users_sample.sql); the first with full privileges over the trafMon databases, including bulk loading from files, and the second with limited right to query (read-only) and to execute pre-defined stored procedures. The user names and their encoded passwords must be configured in several (protected) files (/etc/trafMon/cred/db.cred, /var/www/html/trafMon/php/include.php, /var/lib/tomcat/webapps/birt/trafMon_reports/Library/trafMonDb.rptlibrary);
    • Create and configure the file /etc/trafMon/ipInfo.ini with Activity/Location of all known IP address ranges;
    • Executing the SQL script that creates and populates the (nearly empty) database with template schemas for temporary and persistent trafMon data tables and with the definition of all trafMon stored procedures: trafMon_templateDB.sql

Maybe the table trafMon_template.protocol_table needs to be tuned with service names and precedence assigned to TCP or UDP port numbers.

At first run of the trafMon_loader.py, the runtime database will be automatically created and initialised.

 

For all details, please refer to the trafMon Configuration and Administration Guide: trafMon v1.0.0 Configuration and Administration Guide, Oct 2020