blob: 72a61722c90e551b7b4615bd574fef5e8d191b78 [file] [log] [blame]
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -05001Demonstrations of tcpsubnet, the Linux eBPF/bcc version.
2
3
4tcpsubnet summarizes throughput by destination subnet.
5It works only for IPv4. Eg:
6
7# tcpsubnet
8Tracing... Output every 1 secs. Hit Ctrl-C to end
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -05009[03/05/18 22:32:47]
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050010127.0.0.1/32 8
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050011[03/05/18 22:32:48]
12[03/05/18 22:32:49]
13[03/05/18 22:32:50]
14[03/05/18 22:32:51]
15[03/05/18 22:32:52]
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050016127.0.0.1/32 10
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050017[03/05/18 22:32:53]
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050018
19This example output shows the number of bytes sent to 127.0.0.1/32 (the
20loopback interface). For demo purposes, I set netcat listening on port
218080, connected to it and sent the following payloads.
22
23# nc 127.0.0.1 8080
241111111
25111111111
26
27The first line sends 7 digits plus the null character (8 bytes)
28The second line sends 9 digits plus the null character (10 bytes)
29
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050030Notice also, how tcpsubnet prints a header line with the current date
31and time formatted in the current locale.
32
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050033Try it yourself to get a feeling of how tcpsubnet works.
34
35By default, tcpsubnet will categorize traffic in the following subnets:
36
37- 127.0.0.1/32
38- 10.0.0.0/8
39- 172.16.0.0/12
40- 192.168.0.0/16
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050041- 0.0.0.0/0
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050042
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050043The last subnet is a catch-all. In other words, anything that doesn't
44match the first 4 defaults will be categorized under 0.0.0.0/0
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050045You can change this default behavoir by passing a comma separated list
46of subnets. Let's say we would like to know how much traffic we
47are sending to github.com. We first find out what IPs github.com resolves
48to, Eg:
49
50# dig +short github.com
51192.30.253.112
52192.30.253.113
53
54With this information, we can come up with a reasonable range of IPs
55to monitor, Eg:
56
57# tcpsubnet.py 192.30.253.110/27,0.0.0.0/0
58Tracing... Output every 1 secs. Hit Ctrl-C to end
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050059[03/05/18 22:38:58]
600.0.0.0/0 5780
61192.30.253.110/27 2205
62[03/05/18 22:38:59]
630.0.0.0/0 2036
64192.30.253.110/27 1183
65[03/05/18 22:39:00]
66[03/05/18 22:39:01]
67192.30.253.110/27 12537
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050068
69If we would like to be more accurate, we can use the two IPs returned
70by dig, Eg:
71
72# tcpsubnet 192.30.253.113/32,192.130.253.112/32,0.0.0.0/0
73Tracing... Output every 1 secs. Hit Ctrl-C to end
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -050074[03/05/18 22:42:56]
750.0.0.0/0 1177
76192.30.253.113/32 910
77[03/05/18 22:42:57]
780.0.0.0/0 48704
79192.30.253.113/32 892
80[03/05/18 22:42:58]
81192.30.253.113/32 891
820.0.0.0/0 858
83[03/05/18 22:42:59]
840.0.0.0/0 11159
85192.30.253.113/32 894
86[03/05/18 22:43:00]
870.0.0.0/0 60601
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -050088
89NOTE: When used in production, it is expected that you will have full
90information about your network topology. In which case you won't need
91to approximate subnets nor need to put individual IP addresses like
92we just did.
93
94Notice that the order of the subnet matters. Say, we put 0.0.0.0/0 as
95the first element of the list and 192.130.253.112/32 as the second, all the
96traffic going to 192.130.253.112/32 will have been categorized in
970.0.0.0/0 as 192.130.253.112/32 is contained in 0.0.0.0/0.
98
99The default ouput unit is bytes. You can change it by using the
100-f [--format] flag. tcpsubnet uses the same flags as iperf for the unit
101format and adds mM. When using kmKM, the output will be rounded to floor.
102Eg:
103
104# tcpsubnet -fK 0.0.0.0/0
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -0500105[03/05/18 22:44:04]
1060.0.0.0/0 1
107[03/05/18 22:44:05]
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -05001080.0.0.0/0 5
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -0500109[03/05/18 22:44:06]
1100.0.0.0/0 31
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -0500111
112Just like the majority of the bcc tools, tcpsubnet supports -i and --ebpf
113
114It also supports -v [--verbose] which gives useful debugging information
115on how the subnets are evaluated and the BPF program is constructed.
116
117Last but not least, it supports -J [--json] to print the output in
118JSON format. This is handy if you're calling tcpsubnet from another
119program (say a nodejs server) and would like to have a structured stdout.
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -0500120The output in JSON format will also include the date and time.
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -0500121Eg:
122
123# tcpsubnet -J -fK 192.130.253.110/27,0.0.0.0/0
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -0500124{"date": "03/05/18", "entries": {"0.0.0.0/0": 2}, "time": "22:46:27"}
125{"date": "03/05/18", "entries": {}, "time": "22:46:28"}
126{"date": "03/05/18", "entries": {}, "time": "22:46:29"}
127{"date": "03/05/18", "entries": {}, "time": "22:46:30"}
128{"date": "03/05/18", "entries": {"192.30.253.110/27": 0}, "time": "22:46:31"}
129{"date": "03/05/18", "entries": {"192.30.253.110/27": 1}, "time": "22:46:32"}
130{"date": "03/05/18", "entries": {"192.30.253.110/27": 18}, "time": "22:46:32"}
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -0500131
132
133USAGE:
134
135# ./tcpsubnet -h
136usage: tcpsubnet.py [-h] [-v] [-J] [-f {b,k,m,B,K,M}] [-i INTERVAL] [subnets]
137
138Summarize TCP send and aggregate by subnet
139
140positional arguments:
141 subnets comma separated list of subnets
142
143optional arguments:
144 -h, --help show this help message and exit
145 -v, --verbose output debug statements
146 -J, --json format output in JSON
147 -f {b,k,m,B,K,M}, --format {b,k,m,B,K,M}
148 [bkmBKM] format to report: bits, Kbits, Mbits, bytes,
149 KBytes, MBytes (default B)
150 -i INTERVAL, --interval INTERVAL
151 output interval, in seconds (default 1)
152
153examples:
154 ./tcpsubnet # Trace TCP sent to the default subnets:
155 # 127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,
Rodrigo Manyariefcb30f2018-03-05 22:55:17 -0500156 # 192.168.0.0/16,0.0.0.0/0
Rodrigo Manyari14e23ad2018-03-02 20:41:42 -0500157 ./tcpsubnet -f K # Trace TCP sent to the default subnets
158 # aggregated in KBytes.
159 ./tcpsubnet 10.80.0.0/24 # Trace TCP sent to 10.80.0.0/24 only
160 ./tcpsubnet -J # Format the output in JSON.
161