Demonstrations of tcpsubnet, the Linux eBPF/bcc version. tcpsubnet summarizes throughput by destination subnet. It works only for IPv4. Eg: # tcpsubnet Tracing... Output every 1 secs. Hit Ctrl-C to end [03/05/18 22:32:47] 127.0.0.1/32 8 [03/05/18 22:32:48] [03/05/18 22:32:49] [03/05/18 22:32:50] [03/05/18 22:32:51] [03/05/18 22:32:52] 127.0.0.1/32 10 [03/05/18 22:32:53] This example output shows the number of bytes sent to 127.0.0.1/32 (the loopback interface). For demo purposes, I set netcat listening on port 8080, connected to it and sent the following payloads. # nc 127.0.0.1 8080 1111111 111111111 The first line sends 7 digits plus the null character (8 bytes) The second line sends 9 digits plus the null character (10 bytes) Notice also, how tcpsubnet prints a header line with the current date and time formatted in the current locale. Try it yourself to get a feeling of how tcpsubnet works. By default, tcpsubnet will categorize traffic in the following subnets: - 127.0.0.1/32 - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 - 0.0.0.0/0 The last subnet is a catch-all. In other words, anything that doesn't match the first 4 defaults will be categorized under 0.0.0.0/0 You can change this default behavior by passing a comma separated list of subnets. Let's say we would like to know how much traffic we are sending to github.com. We first find out what IPs github.com resolves to, Eg: # dig +short github.com 192.30.253.112 192.30.253.113 With this information, we can come up with a reasonable range of IPs to monitor, Eg: # tcpsubnet.py 192.30.253.110/27,0.0.0.0/0 Tracing... Output every 1 secs. Hit Ctrl-C to end [03/05/18 22:38:58] 0.0.0.0/0 5780 192.30.253.110/27 2205 [03/05/18 22:38:59] 0.0.0.0/0 2036 192.30.253.110/27 1183 [03/05/18 22:39:00] [03/05/18 22:39:01] 192.30.253.110/27 12537 If we would like to be more accurate, we can use the two IPs returned by dig, Eg: # tcpsubnet 192.30.253.113/32,192.130.253.112/32,0.0.0.0/0 Tracing... Output every 1 secs. Hit Ctrl-C to end [03/05/18 22:42:56] 0.0.0.0/0 1177 192.30.253.113/32 910 [03/05/18 22:42:57] 0.0.0.0/0 48704 192.30.253.113/32 892 [03/05/18 22:42:58] 192.30.253.113/32 891 0.0.0.0/0 858 [03/05/18 22:42:59] 0.0.0.0/0 11159 192.30.253.113/32 894 [03/05/18 22:43:00] 0.0.0.0/0 60601 NOTE: When used in production, it is expected that you will have full information about your network topology. In which case you won't need to approximate subnets nor need to put individual IP addresses like we just did. Notice that the order of the subnet matters. Say, we put 0.0.0.0/0 as the first element of the list and 192.130.253.112/32 as the second, all the traffic going to 192.130.253.112/32 will have been categorized in 0.0.0.0/0 as 192.130.253.112/32 is contained in 0.0.0.0/0. The default output unit is bytes. You can change it by using the -f [--format] flag. tcpsubnet uses the same flags as iperf for the unit format and adds mM. When using kmKM, the output will be rounded to floor. Eg: # tcpsubnet -fK 0.0.0.0/0 [03/05/18 22:44:04] 0.0.0.0/0 1 [03/05/18 22:44:05] 0.0.0.0/0 5 [03/05/18 22:44:06] 0.0.0.0/0 31 Just like the majority of the bcc tools, tcpsubnet supports -i and --ebpf It also supports -v [--verbose] which gives useful debugging information on how the subnets are evaluated and the BPF program is constructed. Last but not least, it supports -J [--json] to print the output in JSON format. This is handy if you're calling tcpsubnet from another program (say a nodejs server) and would like to have a structured stdout. The output in JSON format will also include the date and time. Eg: # tcpsubnet -J -fK 192.130.253.110/27,0.0.0.0/0 {"date": "03/05/18", "entries": {"0.0.0.0/0": 2}, "time": "22:46:27"} {"date": "03/05/18", "entries": {}, "time": "22:46:28"} {"date": "03/05/18", "entries": {}, "time": "22:46:29"} {"date": "03/05/18", "entries": {}, "time": "22:46:30"} {"date": "03/05/18", "entries": {"192.30.253.110/27": 0}, "time": "22:46:31"} {"date": "03/05/18", "entries": {"192.30.253.110/27": 1}, "time": "22:46:32"} {"date": "03/05/18", "entries": {"192.30.253.110/27": 18}, "time": "22:46:32"} USAGE: # ./tcpsubnet -h usage: tcpsubnet.py [-h] [-v] [-J] [-f {b,k,m,B,K,M}] [-i INTERVAL] [subnets] Summarize TCP send and aggregate by subnet positional arguments: subnets comma separated list of subnets optional arguments: -h, --help show this help message and exit -v, --verbose output debug statements -J, --json format output in JSON -f {b,k,m,B,K,M}, --format {b,k,m,B,K,M} [bkmBKM] format to report: bits, Kbits, Mbits, bytes, KBytes, MBytes (default B) -i INTERVAL, --interval INTERVAL output interval, in seconds (default 1) examples: ./tcpsubnet # Trace TCP sent to the default subnets: # 127.0.0.1/32,10.0.0.0/8,172.16.0.0/12, # 192.168.0.0/16,0.0.0.0/0 ./tcpsubnet -f K # Trace TCP sent to the default subnets # aggregated in KBytes. ./tcpsubnet 10.80.0.0/24 # Trace TCP sent to 10.80.0.0/24 only ./tcpsubnet -J # Format the output in JSON.