← Notes

A homelab mesh over AmneziaWG

· openwrt, amneziawg, bird, routing

My routers live in several places: a few hubs on rented servers in different countries and a handful of sites — home, the homelab rack and a couple of others. They are all OpenWrt, and they are tied together with AmneziaWG, a WireGuard fork whose packets don’t look like WireGuard on the wire. This note is about the routing on top, not about the tunnels themselves.

Shape

Routing

One BIRD daemon per router:

Two extra pieces make it pleasant to use:

A netifd quirk

A link-local routing protocol needs an fe80::/64 route on every tunnel. OpenWrt’s netifd only adds one when the interface has a non-zero metric, and Linux keeps a single fe80::/64 per metric value — so tunnels that share a metric silently lose their link-local routes, except for the one brought up last. The fix is boring: give every tunnel its own metric.

What didn’t work

Part of the motivation was to detect throttled cross-border links and route around them automatically. I tried two quality-aware protocols:

Both also share a deeper problem: their link quality comes from small hello packets. A throttled link often passes pings and hellos perfectly while bulk TCP crawls, so a hello-based metric calls it healthy.

All three packages live in my OpenWrt feed, my-openwrt-feed, together with the rest of what these routers run.

Next

An external controller that measures each link for real — throughput, not just reachability — and feeds the result into OSPF costs, with enough hysteresis that routes don’t flap.