Commit Graph

30 Commits

Author SHA1 Message Date
Marc Carré
d46c2266ce Change Sirupsen/logrus to sirupsen/logrus
```
$ git grep -l Sirupsen | grep -v vendor | xargs sed -i '' 's:github.com/Sirupsen/logrus:github.com/sirupsen/logrus:g'
$ gofmt -s -w app
$ gofmt -s -w common
$ gofmt -s -w probe
$ gofmt -s -w prog
$ gofmt -s -w tools
```
2018-07-23 20:10:14 +02:00
Iago López Galeiras
9920c4ea48 Add eBPF connection tracking without dependencies on kernel headers
Based on work from Lorenzo, updated by Iago, Alban, Alessandro and
Michael.

This PR adds connection tracking using eBPF. This feature is not enabled by default.
For now, you can enable it by launching scope with the following command:

```
sudo ./scope launch --probe.ebpf.connections=true
```

This patch allows scope to get notified of every connection event,
without relying on the parsing of /proc/$pid/net/tcp{,6} and
/proc/$pid/fd/*, and therefore improve performance.

We vendor https://github.com/iovisor/gobpf in Scope to load the
pre-compiled ebpf program and https://github.com/weaveworks/tcptracer-bpf
to guess the offsets of the structures we need in the kernel. In this
way we don't need a different pre-compiled ebpf object file per kernel.
The pre-compiled ebpf program is included in the vendoring of
tcptracer-bpf.

The ebpf program uses kprobes/kretprobes on the following kernel functions:
- tcp_v4_connect
- tcp_v6_connect
- tcp_set_state
- inet_csk_accept
- tcp_close

It generates "connect", "accept" and "close" events containing the
connection tuple but also pid and netns.
Note: the IPv6 events are not supported in Scope and thus not passed on.

probe/endpoint/ebpf.go maintains the list of connections. Similarly to
conntrack, it also keeps the dead connections for one iteration in order
to report short-lived connections.

The code for parsing /proc/$pid/net/tcp{,6} and /proc/$pid/fd/* is still
there and still used at start-up because eBPF only brings us the events
and not the initial state. However, the /proc parsing for the initial
state is now done in foreground instead of background, via
newForegroundReader().

NAT resolution on connections from eBPF works in the same way as it did
on connections from /proc: by using conntrack. One of the two conntrack
instances is only started to get the initial state and then it is
stopped since eBPF detects short-lived connections.

The Scope Docker image size comparison:
- weaveworks/scope in current master:  22 MB (compressed),  68 MB
  (uncompressed)
- weaveworks/scope with this patchset: 23 MB (compressed), 69 MB
  (uncompressed)

Fixes #1168 (walking /proc to obtain connections is very expensive)

Fixes #1260 (Short-lived connections not tracked for containers in
shared networking namespaces)

Fixes #1962 (Port ebpf tracker to Go)

Fixes #1961 (Remove runtime kernel header dependency from ebpf tracker)
2017-03-08 22:11:12 +01:00
Alban Crequy
f1e2b5d93a probe: conntrack: fix output parsing
With net.netfilter.nf_conntrack_acct = 1, conntrack adds the following
fields in the output: packets=3 bytes=164

And with SELinux (e.g. Fedora), conntrack adds: secctx=...

The parsing with fmt.Sscanf introduced in #2095 was unfortunately
rejecting lines with those fields. This patch fixes that by adding more
complicated parsing in decodeFlowKeyValues() with FieldsFunc and SplitN.

Fixes #2117
Regression from #2095
2017-01-17 19:30:56 +01:00
Alfonso Acosta
64f1a5d0f5 Check that conntrack events are enabled in the kernel 2017-01-02 09:22:26 +00:00
Alfonso Acosta
9d352e96f5 Review feedback 2016-12-22 09:33:52 +00:00
Alfonso Acosta
d22d64c710 Cleanup
* Remove XML traces
* Improve performance
* Fix tests
2016-12-21 19:35:37 +00:00
Alfonso Acosta
f19889f63c Reduce garbage 2016-12-19 19:30:23 +00:00
Alfonso Acosta
5c02dfcbd2 Complete hacky manual parser 2016-12-19 11:30:00 +00:00
Alfonso Acosta
710c3bf82e [WIP] Diable XML in conntrack parsing
Not working yet
2016-12-19 11:30:00 +00:00
Jonathan Lange
e8085b01b6 Use 'common' library 2016-12-07 11:22:38 +00:00
Tom Wilkie
b130f1ba13 Allow users to specify conntrack buffer size. (#1896)
* Allow users to specify conntrack buffer size.

* Fix tests.

* Use a config struct.
2016-09-26 12:08:38 -07:00
Alfonso Acosta
7702905bbf Remove unused variable 2016-08-26 14:03:29 +00:00
Alfonso Acosta
a904620908 Improve conntrack kernel-support detection for in-kernel compilations 2016-08-26 14:03:29 +00:00
Tom Wilkie
277bd70491 Don't every store NEW conntrack flows (only every store updates). (#1541)
This closes a small window where we might produce reports which contain flows that are NEW but have never seen an UPDATE, which can potentially be invalid.
2016-05-27 11:25:42 +01:00
Tom Wilkie
23c5e9f820 Ignore conntracked connections on which we never saw an update; don't nat map conntracked connections. (#1466) 2016-05-11 15:30:45 +02:00
Alfonso Acosta
3d94082b07 Add debug logging 2016-02-05 16:58:40 +00:00
Tom Wilkie
c5c115bb0f Make channel so stop doesn't fail; also, test stop. 2015-10-28 15:25:38 +00:00
Tom Wilkie
07af26e05b Review feedback 2015-10-27 11:39:38 +00:00
Tom Wilkie
a3c53aadf5 No more nil flow workers 2015-10-27 10:53:23 +00:00
Peter Bourgon
cb40ad3a90 Continued un-exporting of symbols; renames
- Unexport consts, types, vars, etc.
- Rename Conntracker (interface) to FlowWalker, to match its definition.
- Rename conntracker (type) to conntrackWalker, to match the interface.
- Move conntrack_test.go to conntrack_internal_test.go and package endpoint
2015-10-27 10:40:09 +00:00
Tom Wilkie
492ca1692d Review feedback 2015-10-22 09:01:53 +00:00
Tom Wilkie
0cd3de5c7f Retry conntrack, after a short delay, in a loop. 2015-10-21 15:17:41 +00:00
Tom Wilkie
e2dfcb1def Review feedback 2015-09-24 03:07:20 +00:00
Tom Wilkie
7da599194d Test the nat mapper. 2015-09-23 11:01:29 +00:00
Tom Wilkie
b9ffca42e5 Don't fail if there are no existing nat mappings. 2015-09-23 03:35:53 +00:00
Tom Wilkie
54299dc0fd Review feedback. 2015-09-15 10:03:06 +00:00
Tom Wilkie
766d8772d7 Do a conntrack -L before -E to capture existing connections and NAT mappings. 2015-09-15 10:02:59 +00:00
Tom Wilkie
d5570f27a7 Only conntrack tcp connections to reduce cpu load from xml marshalling. 2015-09-09 15:08:54 +00:00
Tom Wilkie
903a51397b Review feedback 2015-08-28 09:19:56 +00:00
Tom Wilkie
1a286eac04 Use an exec'd conntrack in 'events' mode instead of repeatedly execing it for NAT mappings. Also use conntrack to populate the endpoint table. 2015-08-27 16:29:33 +00:00