2017-12-29 04:16:20 +00:00
|
|
|
# Yggdrasil
|
|
|
|
|
2018-03-03 18:29:47 +00:00
|
|
|
[![CircleCI](https://circleci.com/gh/yggdrasil-network/yggdrasil-go.svg?style=shield&circle-token=:circle-token
|
|
|
|
)](https://circleci.com/gh/yggdrasil-network/yggdrasil-go)
|
2018-02-03 01:38:55 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
## Introduction
|
|
|
|
|
|
|
|
Yggdrasil is an early-stage implementation of a fully end-to-end encrypted IPv6
|
|
|
|
network. It is lightweight, self-arranging, supported on multiple platforms and
|
|
|
|
allows pretty much any IPv6-capable application to communicate securely with
|
|
|
|
other Yggdrasil nodes. Yggdrasil does not require you to have IPv6 Internet
|
|
|
|
connectivity - it also works over IPv4.
|
|
|
|
|
|
|
|
Although Yggdrasil shares many similarities with
|
|
|
|
[cjdns](https://github.com/cjdelisle/cjdns), it employs a different routing
|
|
|
|
algorithm based on a globally-agreed spanning tree and greedy routing in a
|
|
|
|
metric space, and aims to implement some novel local backpressure routing
|
|
|
|
techniques. In theory, Yggdrasil should scale well on networks with
|
|
|
|
internet-like topologies.
|
|
|
|
|
|
|
|
## Supported Platforms
|
|
|
|
|
|
|
|
We actively support the following platforms, and packages are available for
|
|
|
|
some of the below:
|
|
|
|
|
|
|
|
- Linux
|
|
|
|
- `.deb` and `.rpm` packages are built by CI for Debian and Red Hat-based
|
|
|
|
distributions
|
|
|
|
- Void and Arch packages also available within their respective repositories
|
|
|
|
- macOS
|
|
|
|
- `.pkg` packages are built by CI
|
|
|
|
- Ubiquiti EdgeOS
|
|
|
|
- `.deb` Vyatta packages are built by CI
|
|
|
|
- Windows
|
|
|
|
- FreeBSD
|
|
|
|
- OpenBSD
|
|
|
|
- NetBSD
|
|
|
|
|
|
|
|
Please see our [Platforms](https://yggdrasil-network.github.io/) pages for more
|
|
|
|
specific information about each of our supported platforms, including
|
|
|
|
installation steps and caveats.
|
2017-12-29 04:16:20 +00:00
|
|
|
|
|
|
|
## Building
|
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
If you want to build from source, as opposed to installing one of the pre-built
|
|
|
|
packages:
|
2017-12-29 04:16:20 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
1. Install [Go](https://golang.org) (requires Go 1.11 or later)
|
|
|
|
2. Clone this repository
|
|
|
|
2. Run `./build`
|
2018-01-26 09:28:57 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
Note that you can cross-compile for other platforms and architectures by
|
|
|
|
specifying the `GOOS` and `GOARCH` environment variables, e.g. `GOOS=windows
|
|
|
|
./build` or `GOOS=linux GOARCH=mipsle ./build`.
|
2017-12-29 04:16:20 +00:00
|
|
|
|
|
|
|
## Running
|
|
|
|
|
2019-03-13 20:08:50 +00:00
|
|
|
### Generate configuration
|
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
To generate static configuration, either generate a HJSON file (human-friendly,
|
|
|
|
complete with comments):
|
2017-12-29 04:16:20 +00:00
|
|
|
|
2018-02-16 14:12:44 +00:00
|
|
|
```
|
2019-03-13 20:08:50 +00:00
|
|
|
./yggdrasil -genconf > /path/to/yggdrasil.conf
|
2018-02-16 14:12:44 +00:00
|
|
|
```
|
2018-01-26 09:28:57 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
... or generate a plain JSON file (which is easy to manipulate
|
|
|
|
programmatically):
|
2018-03-10 23:40:03 +00:00
|
|
|
|
2018-02-16 14:12:44 +00:00
|
|
|
```
|
2019-03-13 20:08:50 +00:00
|
|
|
./yggdrasil -genconf -json > /path/to/yggdrasil.conf
|
2018-02-16 14:12:44 +00:00
|
|
|
```
|
2018-01-03 21:27:13 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
You will need to edit the `yggdrasil.conf` file to add or remove peers, modify
|
|
|
|
other configuration such as listen addresses or multicast addresses, etc.
|
2017-12-29 04:16:20 +00:00
|
|
|
|
2019-03-13 20:08:50 +00:00
|
|
|
### Run Yggdrasil
|
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
To run with the generated static configuration:
|
2017-12-29 04:16:20 +00:00
|
|
|
```
|
2019-03-13 20:06:02 +00:00
|
|
|
./yggdrasil -useconffile /path/to/yggdrasil.conf
|
2017-12-29 04:16:20 +00:00
|
|
|
```
|
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
To run in auto-configuration mode (which will use sane defaults and random keys
|
|
|
|
at each startup, instead of using a static configuration file):
|
2017-12-29 04:16:20 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
```
|
2019-03-13 20:08:50 +00:00
|
|
|
./yggdrasil -autoconf
|
2019-03-13 20:06:02 +00:00
|
|
|
```
|
2018-01-15 14:43:06 +00:00
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
You will likely need to run Yggdrasil as a privileged user or under `sudo`,
|
|
|
|
unless you have permission to create TUN/TAP adapters. On Linux this can be done
|
|
|
|
by giving the Yggdrasil binary the `CAP_NET_ADMIN` capability.
|
|
|
|
|
|
|
|
## Documentation
|
|
|
|
|
2019-03-13 20:08:50 +00:00
|
|
|
Documentation is available on our [GitHub
|
|
|
|
Pages](https://yggdrasil-network.github.io) site, or in the base submodule
|
2019-03-13 20:06:02 +00:00
|
|
|
repository within `doc/yggdrasil-network.github.io`.
|
|
|
|
|
|
|
|
- [Configuration file options](https://yggdrasil-network.github.io/configuration.html)
|
|
|
|
- [Platform-specific documentation](https://yggdrasil-network.github.io/platforms.html)
|
|
|
|
- [Frequently asked questions](https://yggdrasil-network.github.io/faq.html)
|
|
|
|
- [Admin API documentation](https://yggdrasil-network.github.io/admin.html)
|
|
|
|
|
|
|
|
## Performance
|
|
|
|
|
|
|
|
A [simplified model](misc/sim/treesim-forward.py) of this routing scheme has
|
|
|
|
been tested in simulation on the 9204-node
|
|
|
|
[skitter](https://www.caida.org/tools/measurement/skitter/) network topology
|
|
|
|
dataset from [caida](https://www.caida.org/), and compared with results in
|
|
|
|
[arxiv:0708.2309](https://arxiv.org/abs/0708.2309). Using the routing scheme as
|
|
|
|
implemented in this code, the average multiplicative stretch is observed to be
|
|
|
|
about 1.08, with an average routing table size of 6 for a name-dependent scheme,
|
|
|
|
and approximately 30 additional (but smaller) entries needed for the
|
|
|
|
name-independent routing table. The number of name-dependent routing table
|
|
|
|
entries needed is proportional to node degree, so that 6 is the mean of a
|
|
|
|
distribution with a long tail, but this may be an acceptable tradeoff (it's at
|
|
|
|
least worth trying, hence this code). The size of name-dependent routing table
|
|
|
|
entries is relatively large, due to cryptographic signatures associated with
|
|
|
|
routing table updates, but in the absence of cryptographic overhead, each entry
|
|
|
|
should otherwise be comparable in size to the BC routing scheme described in the
|
|
|
|
above paper. A modified version of this scheme, with the same resource
|
|
|
|
requirements, achieves a multiplicative stretch of 1.02, which drops to 1.01 if
|
|
|
|
source routing is used. Both of these optimizations are not present in the
|
|
|
|
current implementation, as the former depends on network state information that
|
|
|
|
appears difficult to cryptographically secure, and the latter optimization is
|
|
|
|
both tedious to implement and would make debugging other aspects of the
|
|
|
|
implementation more difficult.
|
2018-01-15 14:43:06 +00:00
|
|
|
|
2017-12-29 04:16:20 +00:00
|
|
|
## License
|
|
|
|
|
2019-03-13 20:06:02 +00:00
|
|
|
This code is released under the terms of the LGPLv3, but with an added exception
|
|
|
|
that was shamelessly taken from [godeb](https://github.com/niemeyer/godeb).
|
|
|
|
Under certain circumstances, this exception permits distribution of binaries
|
|
|
|
that are (statically or dynamically) linked with this code, without requiring
|
|
|
|
the distribution of Minimal Corresponding Source or Minimal Application Code.
|
2017-12-29 04:16:20 +00:00
|
|
|
For more details, see: [LICENSE](LICENSE).
|