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 GaleirasandAlban Crequy 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 WilkieandGitHub 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 BourgonandTom Wilkie 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