Hi folks,

I plan to move our core routers from FreeBSD to OpenBSD. Currently I use
netgraph and ng_netflow on the FreeBSD machines for netflow accounting.

As there is a netflow kernel implentation with pflow in OpenBSD, too, I
decided to use this.
Unfortunately I seems that flows are exported twice for each connection.

The routers are running on OpenBSD 4.8 RELEASE (no patch applied)

A quick example:

I have a machine named bsd-01 (192.168.89.4) that collects the netflows
using flowd (I have also used flow-tools with the same result).
The test networks 192.168.89/24 and 192.168.92/24 are connected via the
OpenBSD routers (HA pair with carp) which have pflow enabled for netflow
accounting.

/etc/hostname.pflow0:
flowsrc 192.168.89.150 flowdst 192.168.89.4:2100

/etc/pf.conf:
set skip on lo
pass quick proto tcp from 192.168.89.55 to 192.168.92.55 port 5001 keep
state (pflow)
pass keep state
block in on ! lo0 proto tcp to port 6000:6010

Now i generate some packets from 192.168.89.55 to 192.168.92.55 in order
to get accounting data

grabnebel:~# nuttcp -i1 192.168.92.55
  108.2655 MB /   1.00 sec =  908.1545 Mbps
  110.5109 MB /   1.00 sec =  927.0402 Mbps
  111.6529 MB /   1.00 sec =  936.6258 Mbps
  111.6529 MB /   1.00 sec =  936.6277 Mbps
  111.6598 MB /   1.00 sec =  936.6641 Mbps
  111.6529 MB /   1.00 sec =  936.5949 Mbps
  111.6529 MB /   1.00 sec =  936.6212 Mbps
  111.6529 MB /   1.00 sec =  936.6296 Mbps
  111.6598 MB /   1.00 sec =  936.6632 Mbps
  111.6529 MB /   1.00 sec =  936.5940 Mbps

 1113.5000 MB /  10.01 sec =  932.8309 Mbps 5 %TX 20 %RX
grabnebel:~#

In pf's state table I see two records - one for each direction of the
connection.

rtr-fra-01# pfctl -vss | grep -A2 5001

all tcp 192.168.92.55:5001 <- 192.168.89.55:41068
FIN_WAIT_2:FIN_WAIT_2
   [638328050 + 5888] wscale 6  [1759713472 + 1636288] wscale 6
   age 00:00:46, expires in 00:00:54, 806350:403706 pkts,
1209519584:20998868 bytes, rule 0, pflow
all tcp 192.168.89.55:41068 -> 192.168.92.55:5001
FIN_WAIT_2:FIN_WAIT_2
   [1759713472 + 1636288] wscale 6  [638328050 + 5888] wscale 6
   age 00:00:46, expires in 00:00:54, 806350:403706 pkts,
1209519584:20998868 bytes, rule 0, pflow
rtr-fra-01#

After the states have expired on the router the flows are exported to
the collector and I can read them from the logfile.

bsd-01# flowd-reader /var/log/flowd

FLOW recv_time 2011-01-05T11:18:13.209625 proto 6 tcpflags 00 tos 00
agent [192.168.89.150] src [192.168.89.55]:41068 dst
[192.168.92.55]:5001 packets 806350 octets 1209519584
FLOW recv_time 2011-01-05T11:18:13.209625 proto 6 tcpflags 00 tos 00
agent [192.168.89.150] src [192.168.92.55]:5001 dst
[192.168.89.55]:41068 packets 403706 octets 20998868
FLOW recv_time 2011-01-05T11:18:13.209625 proto 6 tcpflags 00 tos 00
agent [192.168.89.150] src [192.168.89.55]:41068 dst
[192.168.92.55]:5001 packets 806350 octets 1209519584
FLOW recv_time 2011-01-05T11:18:13.209625 proto 6 tcpflags 00 tos 00
agent [192.168.89.150] src [192.168.92.55]:5001 dst
[192.168.89.55]:41068 packets 403706 octets 20998868
bsd-01#

I can see that the accounted octects match the traffic data in the state
table. But unfortunately it seems that both RX and TX traffic data are
exported for each record which results in redundant accounting data.
Correct me if I'm wrong but for correct traffic accounting there should
be only one flow for RX and one for TX, shouldn't it?

Any suggestions?

Best regards and thanks in advance,
Bernd

Reply via email to