This guide explains how to install, configure, debug, and verify a working Yggdrasil node from scratch.
Goal: join the IPv6 mesh network reliably using outbound peers + listeners.
Yggdrasil is a decentralized encrypted IPv6 mesh overlay network.
Features:
sudo pacman -S yggdrasil
Enable service:
sudo systemctl enable yggdrasil
Create default config:
sudo yggdrasil -genconf > ~/yggdrasil.conf
Move into place:
sudo mv ~/yggdrasil.conf /etc/yggdrasil.conf
Example:
PrivateKey: YOUR_PRIVATE_KEY
Never regenerate unless you want a new node identity.
Find:
Peers: []
Replace with:
Peers: [
"tcp://ygg-1.okade.pro:20000",
"tcp://ygg.nadeko.net:44441",
"tls://ygg.nadeko.net:44442",
"quic://ip6.casa2.mywire.org:44443?key=000000003cb1cc50e05147fc548f6d1f78e7ffcdc67b456f9bb0db6f0a5e4723",
"tcp://Yggdrasil.UnderEu.Net:37001",
"quic://Yggdrasil.UnderEu.Net:37003",
"tls://ygg.jjolly.dev:3443",
"tcp://mo.us.ygg.triplebit.org:9000",
"tls://mo.us.ygg.triplebit.org:993"
]
Why inline format?
Because YAML indentation errors break configs easily.
This avoids them.
Find:
Listen: []
Replace with:
Listen: ["tls://0.0.0.0:0","tls://[::]:0"]
This allows:
Keep enabled:
MulticastInterfaces:
- Regex: .*
Beacon: true
Listen: true
This lets nearby nodes auto-connect.
sudo systemctl restart yggdrasil
Check peers:
yggdrasilctl getpeers
Working example output:
URI State
tcp://peer... Established
tls://peer... Established
Empty table means:
node is not connected yet.
Run:
ip addr | grep ygg
Expected:
ygg0
Ping internal mesh DNS node:
ping6 inv.nadeko.ygg
Success = working mesh connection
Before restarting service:
sudo yggdrasil -useconffile /etc/yggdrasil.conf -normaliseconf
If config is broken:
command prints exact error line.
journalctl -u yggdrasil -n 50
yggdrasilctl getpeers
Columns:
| Column | Meaning |
|---|---|
| URI | peer address |
| State | connection status |
| Dir | inbound/outbound |
| RTT | latency |
| RX/TX | traffic |
| Cost | routing metric |
Wrong:
Peers:
Correct:
Peers:
Fix inside vim:
:set expandtab
:retab
Wrong:
Peers: ["tcp://peer1" "tcp://peer2"]
Correct:
Peers: ["tcp://peer1","tcp://peer2"]
Wrong:
Peers: ["tcp://peer1",]
Check IPv6 address:
yggdrasilctl getself
Example:
Address: 200:xxxx:xxxx:xxxx::xxxx
This is your mesh address.
Permanent until PrivateKey changes.
If using firewall:
sudo ufw allow 0:65535/tcp
sudo ufw allow 0:65535/udp
yggdrasilctl getroutes
Shows mesh topology paths.
Working node checklist:
✔ service running ✔ ygg0 exists ✔ peers connected ✔ IPv6 assigned ✔ ping works ✔ routes visible
Once connected you can run:
Perfect foundation for a Manna-lite assistant environment.