forked from bpftrace/bpftrace
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtcpconnect.bt
More file actions
77 lines (71 loc) · 2.57 KB
/
tcpconnect.bt
File metadata and controls
77 lines (71 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env bpftrace
// tcpconnect.bt Trace TCP connect()s.
// For Linux, uses bpftrace and eBPF.
//
// All connection attempts are traced, even if they ultimately fail.
//
// This uses dynamic tracing of kernel functions, and will need to be updated
// to match kernel changes.
//
// Example of usage:
//
// # ./tcpconnect.bt
// TIME PID COMM SADDR SPORT DADDR DPORT
// 00:36:45 1798396 agent 127.0.0.1 5001 10.229.20.82 56114
// 00:36:45 1798396 curl 127.0.0.1 10255 10.229.20.82 56606
// 00:36:45 3949059 nginx 127.0.0.1 8000 127.0.0.1 37780
//
//
// This output shows three connections, one from a "agent" process, one from
// "curl", and one from "nginx". The output details shows the IP version, source
// address, source socket port, destination address, and destination port. This traces attempted
// connections: these may have failed.
//
// The overhead of this tool should be negligible, since it is only tracing the
// kernel functions performing connect. It is not tracing every packet and then
// filtering.
//
// This is a bpftrace version of the bcc tool of the same name.
//
// Copyright (c) 2018 Dale Hamel.
//
// 23-Nov-2018 Dale Hamel created this.
#ifndef BPFTRACE_HAVE_BTF
#include <linux/socket.h>
#include <net/sock.h>
#else
// BTF provides the types, we just need to define AF_INET and AF_INET6.
// These are Linux ABI defines, and are not architecture-specific.
// With BTF, this allows tcpconnect.bt to work without glibc headers:
#define AF_INET 2 /* IPv4 */
#define AF_INET6 10 /* IPv6 */
#endif
BEGIN
{
printf("Tracing tcp connections. Hit Ctrl-C to end.\n");
printf("%-8s %-8s %-16s ", "TIME", "PID", "COMM");
printf("%-39s %-6s %-39s %-6s\n", "SADDR", "SPORT", "DADDR", "DPORT");
}
kprobe:tcp_connect
{
let $daddr;
let $saddr;
$sk = (struct sock *)arg0;
$inet_family = $sk.__sk_common.skc_family;
if ($inet_family == AF_INET || $inet_family == AF_INET6) {
if ($inet_family == AF_INET) {
$daddr = ntop($sk.__sk_common.skc_daddr);
$saddr = ntop($sk.__sk_common.skc_rcv_saddr);
} else {
$daddr = ntop($sk.__sk_common.skc_v6_daddr.in6_u.u6_addr8);
$saddr = ntop($sk.__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr8);
}
$lport = $sk.__sk_common.skc_num;
$dport = $sk.__sk_common.skc_dport;
// Destination port is big endian, it must be flipped
$dport = bswap($dport);
time("%H:%M:%S ");
printf("%-8d %-16s ", pid, comm);
printf("%-39s %-6d %-39s %-6d\n", $saddr, $lport, $daddr, $dport);
}
}