Configuring Yggdrasil with systemd-networkd
Yggdrasil, while being a great mesh networking software, doesn’t have that many learning resources on it. The docs on its website and a few enthusiast-established wikis are probably everything you’ll ever find on how to set it up.
This is a simple recipe on how to configure Yggdrasil with systemd-networkd and systemd-resolved while providing other devices on your local network with Ygg addresses and allowing them to use Ygg.
Consider the following setup:
- an always-on PC
- a router to which the PC is connected
- all other devices in LAN
We want to deploy Yggdrasil on the PC and delegate the 300:XXXX:XXXX:XXXX::/64
subnet provided by Ygg to other devices. This guide assumes you have already
set up Yggdrasil on your Linux box.
We configure our usual connection with /etc/systemd/network/10-eth0.network
:
[Match]
# wired connection device name
Name=eth0
[Network]
# Address/Gateway, or DHCP=yes, or whatever else you might have configured
# your wired connection with
...
# the address inside the 300::/8 subnet; the host will use this address inside
# the wired network
Address=300:XXXX:XXXX:XXXX::1/64
# enable IPv6 router
IPv6PrefixDelegation=static
IPForward=ipv6
# the DNS we want to use for clearnet connections
DNS=...
[IPv6Prefix]
# the prefix advertised to other devices by the machine
Prefix=300:XXXX:XXXX:XXXX::/64
[IPv6PrefixDelegation]
EmitDNS=yes
# should be an Ygg DNS address, you might prefer to unset this or use your own
# DNS server inside Yggdrasil
DNS=301:2522::53
RouterLifetimeSec=3600 # should always be set
[IPv6RoutePrefix]
# the route to Ygg to propagate to devices
Route=200::/7
Now let’s configure Yggdrasil TUN device with
/etc/systemd/network/40-tun0.network
:
[Match]
# Yggdrasil TUN device name, same as IfName in /etc/yggdrasil.conf if set
Name=tun0
[Network]
# useless with Yggdrasil
LinkLocalAddressing=no
# some DNS inside Yggdrasil to resolve .ygg addresses and alike; you might want
# to specify your own address here
DNS=301:2522::53
DefaultRouteOnDevice=no
[Address]
# the /128 address Ygg provides us with
Address=200:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/128
[Route]
# route packets to Yggdrasil
Destination=200::/7
Scope=global
In this schema systemd-resolved will only use Ygg DNS for sites we browse from
Ygg, and whatever else we configure in /etc/systemd/resolved.conf
by default.
This allows the machine to properly resolve .ygg
domains while falling back
to system default DNS for everything outside Yggdrasil.
Every other IPv6-enabled device on your LAN will now receive Ygg addresses and will be able to connect to Yggdrasil while your machine is on. However, be aware that end-to-end encryption Yggdrasil provides is terminated at your Yggdrasil router. You should also consider setting up a firewall to protect your other devices.