Skip to content →

Tag: unifi

Export Netflow from Unifi Gateway


Looking on which client in my home network is consuming bandwith and trying to catch / debug some attacks and network flows, I played with Unifi gateway (Model UniFi Security Gateway 3P) to export netflow data to a pmacct/nfacctd netflow receiver.


First you need to define netflow / flow-accounting configuration on Unifi gateway.


For testing purpose, you could enable temporary the netflow export using a manual configuration using direct configuration on CLI. Take care, on each change on your unifi controller, configuration manually set on the gateway will be erased.

user@gw:~$ configure
user@gw# show system flow-accounting 
 ingress-capture pre-dnat
 interface eth0
 interface eth1
 netflow {
     sampling-rate 10
     server {
         port 6999
     timeout {
         expiry-interval 60
         flow-generic 60
         icmp 300
         max-active-life 604800
         tcp-fin 300
         tcp-generic 3600
         tcp-rst 120
         udp 300
     version 9
 syslog-facility daemon

Unifi controller

In order to deploy this configuration automatically using the Unifi controller, and to be kept after a reboot or any configuration change, you should create a config.gateway.json file to automate / keep this deployment on each provisioning, on each site ID folder :

✘ ⚡ root@controller  /var/lib/unifi/sites/mysiteID  cat config.gateway.json
        "system": {
                "flow-accounting": {
                        "ingress-capture": "pre-dnat",
                        "interface": [
                        "netflow": {
                                "sampling-rate": "10",
                                "server": {
                                        "": {
                                                "port": "6999"
                                "timeout": {
                                        "expiry-interval": "60",
                                        "flow-generic": "60",
                                        "icmp": "300",
                                        "max-active-life": "604800",
                                        "tcp-fin": "300",
                                        "tcp-generic": "3600",
                                        "tcp-rst": "120",
                                        "udp": "300"
                                "version": "9"
                        "syslog-facility": "daemon"

With this configuration deployed, you should be able to receive UDP netflow export on port 6999, with a 1 for 10 sample rate. It means 1 out 10 packets will be sampled to the netflow exporter / receiver. This value should be adjusted carefully to avoid CPU exhaustion on your Unifi gateway (processor is some old stuff, with no powerful capacities)

Data Collection

I’ve always been a pmacct‘s project fan 😉 So naturally, I deployed a nfacctd daemon on my home server to collect netflow exports and aggregate them using some primitives.

user@home  ~  cat /opt/pmacct/etc/nfacctd.conf       
! nfacctd configuration for home
! nfacctd daemon parameters
! for details :
daemonize: false
pidfile: /var/run/
logfile: /var/log/nfacctd.log
syslog: daemon
core_proc_name: nfacctd

!interface: enp0s25
nfacctd_port: 6999
!nfacctd_time_new: true
!nfacctd_disable_checks: true
!nfacctd_renormalize: true
nfacctd_ext_sampling_rate: 10

geoip_ipv4_file: /usr/share/GeoIP/GeoIP.dat
geoip_ipv6_file: /usr/share/GeoIP/GeoIPv6.dat

!aggregate[traffic]: in_iface,out_iface,proto,tcpflags,ethtype,src_host_country,dst_host_country,src_host,dst_host
aggregate[traffic]: in_iface,out_iface,proto,tcpflags,src_host_country,dst_host_country,src_host,dst_host

! storage methods
plugins: print[traffic]

! print rules
print_output_file[traffic]: /tmp/nfacctd/%s.json
print_output: json
print_history: 2m
print_history_roundoff: m
print_refresh_time: 60
plugin_pipe_size: 102400000
plugin_buffer_size: 102400

After installing and configure with the following nfacctd.conf file, you should be able to play with pmacct command to see netflow exports, if you dump results through a pipe, or directly look at the json print export.

Example of JSON output generated :

	"event_type": "purge",
	"iface_in": 2,
	"iface_out": 3,
	"ip_src": "",
	"ip_dst": "",
	"country_ip_src": "DE",
	"country_ip_dst": "",
	"tcp_flags": "0",
	"ip_proto": "udp",
	"stamp_inserted": "2020-08-20 11:28:00",
	"stamp_updated": "2020-08-20 11:29:01",
	"packets": 1,
	"bytes": 125
	"event_type": "purge",
	"iface_in": 3,
	"iface_out": 2,
	"ip_src": "",
	"ip_dst": "",
	"country_ip_src": "",
	"country_ip_dst": "RU",
	"tcp_flags": "0",
	"ip_proto": "udp",
	"stamp_inserted": "2020-08-20 11:28:00",
	"stamp_updated": "2020-08-20 11:29:01",
	"packets": 1,
	"bytes": 311

Data Export

After this you are able to parse data produced by nfacctd collector and push it to a TSDB.

Python – From JSON to InfluxDB

Not sure InfluxDB is the best to doing this, due to the high cardinality on tags. But anyway, for home setup, it’s sufficient.

I wrote a quick and dirty python script that parse and enhance data (like SNMP ifIndex name provided by nfacctd) and push it to InfluxDB.

I will probably publish it to github when it will be cleaned up.


Here is an example of what you can produce with data inside the TSDB. Top Countries, Top IP talkers…

Leave a Comment