2014-05-14 16:32:49 +00:00
|
|
|
## obfs4 - The obfourscator
|
2014-05-09 10:23:58 +00:00
|
|
|
#### Yawning Angel (yawning at torproject dot org)
|
|
|
|
|
|
|
|
### What?
|
|
|
|
|
|
|
|
This is a look-like nothing obfuscation protocol that incorporates ideas and
|
|
|
|
concepts from Philipp Winter's ScrambleSuit protocol. The obfs naming was
|
|
|
|
chosen primarily because it was shorter, in terms of protocol ancestery obfs4
|
|
|
|
is much closer to ScrambleSuit than obfs2/obfs3.
|
|
|
|
|
|
|
|
The notable differences between ScrambleSuit and obfs4:
|
|
|
|
|
|
|
|
* The handshake always does a full key exchange (no such thing as a Session
|
2014-05-13 02:31:37 +00:00
|
|
|
Ticket Handshake).
|
2014-05-09 10:23:58 +00:00
|
|
|
* The handshake uses the Tor Project's ntor handshake with public keys
|
2014-05-16 05:06:38 +00:00
|
|
|
obfuscated via the Elligator 2 mapping.
|
2014-05-11 21:55:34 +00:00
|
|
|
* The link layer encryption uses NaCl secret boxes (Poly1305/XSalsa20).
|
2014-05-09 10:23:58 +00:00
|
|
|
|
2014-08-17 17:11:03 +00:00
|
|
|
As an added bonus, obfs4proxy also supports acting as an obfs2/3 client and
|
|
|
|
bridge to ease the transition to the new protocol.
|
|
|
|
|
2014-05-09 10:23:58 +00:00
|
|
|
### Why not extend ScrambleSuit?
|
|
|
|
|
|
|
|
It's my protocol and I'll obfuscate if I want to.
|
|
|
|
|
|
|
|
Since a lot of the changes are to the handshaking process, it didn't make sense
|
|
|
|
to extend ScrambleSuit as writing a server implementation that supported both
|
|
|
|
handshake variants without being obscenely slow is non-trivial.
|
|
|
|
|
2014-06-07 20:03:29 +00:00
|
|
|
### Dependencies
|
|
|
|
|
2018-10-15 21:49:15 +00:00
|
|
|
Build time library dependencies are handled by the Go module automatically, but
|
|
|
|
are listed for clarity.
|
2014-06-07 20:03:29 +00:00
|
|
|
|
2018-10-15 21:49:15 +00:00
|
|
|
If you are on Go versions earlier than 1.11, you might need to run `go get -d
|
|
|
|
./...` to download all the dependencies. Note however, that modules always use
|
|
|
|
the same dependency versions, while `go get -d` always downloads master.
|
|
|
|
|
|
|
|
* Go 1.2.0 or later. Prior versions of Go (Eg: 1.0.2) are missing certain
|
2014-09-06 16:47:57 +00:00
|
|
|
important parts of the runtime library like a SHA256 implementation.
|
2015-01-14 20:43:04 +00:00
|
|
|
* go.crypto (https://golang.org/x/crypto)
|
2015-03-23 09:13:19 +00:00
|
|
|
* go.net (https://golang.org/x/net)
|
2014-06-07 20:03:29 +00:00
|
|
|
* ed25519/extra25519 (https://github.com/agl/ed25519/extra25519)
|
|
|
|
* SipHash-2-4 (https://github.com/dchest/siphash)
|
|
|
|
* goptlib (https://git.torproject.org/pluggable-transports/goptlib.git)
|
|
|
|
|
2014-09-03 09:44:18 +00:00
|
|
|
### Installation
|
|
|
|
|
|
|
|
To build:
|
|
|
|
|
2018-10-15 21:49:15 +00:00
|
|
|
go build ./obfs4proxy
|
|
|
|
|
|
|
|
To install, copy `obfsproxy` to a permanent location (Eg: `/usr/local/bin`)
|
2014-09-03 09:44:18 +00:00
|
|
|
|
|
|
|
Client side torrc configuration:
|
|
|
|
```
|
2014-09-06 16:47:57 +00:00
|
|
|
ClientTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy
|
2014-09-03 09:44:18 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Bridge side torrc configuration:
|
|
|
|
```
|
|
|
|
# Act as a bridge relay.
|
|
|
|
BridgeRelay 1
|
|
|
|
|
2014-09-06 16:47:57 +00:00
|
|
|
# Enable the Extended ORPort
|
|
|
|
ExtORPort auto
|
|
|
|
|
2014-09-03 09:44:18 +00:00
|
|
|
# Use obfs4proxy to provide the obfs4 protocol.
|
2014-09-06 16:47:57 +00:00
|
|
|
ServerTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy
|
2014-09-03 09:44:18 +00:00
|
|
|
|
|
|
|
# (Optional) Listen on the specified address/port for obfs4 connections as
|
|
|
|
# opposed to picking a port automatically.
|
|
|
|
#ServerTransportListenAddr obfs4 0.0.0.0:443
|
|
|
|
```
|
|
|
|
|
|
|
|
### Tips and tricks
|
|
|
|
|
|
|
|
* On modern Linux systems it is possible to have obfs4proxy bind to reserved
|
|
|
|
ports (<=1024) even when not running as root by granting the
|
|
|
|
`CAP_NET_BIND_SERVICE` capability with setcap:
|
|
|
|
|
2014-09-06 16:47:57 +00:00
|
|
|
`# setcap 'cap_net_bind_service=+ep' /usr/local/bin/obfs4proxy`
|
2014-09-03 09:44:18 +00:00
|
|
|
|
2014-09-06 16:47:57 +00:00
|
|
|
* obfs4proxy can also act as an obfs2 and obfs3 client or server. Adjust the
|
2014-09-03 09:44:18 +00:00
|
|
|
`ClientTransportPlugin` and `ServerTransportPlugin` lines in the torrc as
|
|
|
|
appropriate.
|
|
|
|
|
2015-02-17 11:33:29 +00:00
|
|
|
* obfs4proxy can also act as a ScrambleSuit client. Adjust the
|
|
|
|
`ClientTransportPlugin` line in the torrc as appropriate.
|
|
|
|
|
2014-09-03 09:44:18 +00:00
|
|
|
* The autogenerated obfs4 bridge parameters are placed in
|
2014-10-01 19:00:30 +00:00
|
|
|
`DataDir/pt_state/obfs4_state.json`. To ease deployment, the client side
|
|
|
|
bridge line is written to `DataDir/pt_state/obfs4_bridgeline.txt`.
|
2014-09-03 09:44:18 +00:00
|
|
|
|
2014-05-09 10:23:58 +00:00
|
|
|
### Thanks
|
2014-06-07 20:03:29 +00:00
|
|
|
|
2014-05-09 10:23:58 +00:00
|
|
|
* David Fifield for goptlib.
|
|
|
|
* Adam Langley for his Elligator implementation.
|
|
|
|
* Philipp Winter for the ScrambleSuit protocol which provided much of the
|
|
|
|
design.
|