Show HN: DDNS-go – Over-engineered DDNS service with native OS integrations

1 database64128 0 8/21/2025, 9:50:39 AM github.com ↗
I have this tendency to over-engineer things, and sometimes it can be a good learning opportunity. ddns-go is what happens when you take DDNS seriously, and try to do everything in the most efficient way possible.

On Linux it opens a netlink socket and listens for network interface changes. If you use WireGuard for all outgoing traffic, and still want to be able to handle incoming connections from the physical interface, ddns-go can even help you maintain the policy routing rules (see ip-rule(8)).

On the BSDs it opens a route(4) socket for the same thing, except it is a bit more complicated here because for historical reasons the messages do not contain IPv6 address flags. You have to call ioctl(2) to retrieve the flags, if you want to filter out deprecated and temporary IPv6 addresses.

On Windows ddns-go uses the IP Helper API to get notified for interface address changes. Of course the API does not behave quite like how the documentation describes, so there needs to be workarounds.

ddns-go also speaks asuswrt's web API and can get the WAN IPv4 address directly from the router.

As a result of working on this project, I sent 3 separate CLs to the x/sys module.

[1] https://go-review.googlesource.com/c/sys/+/597915

[2] https://go-review.googlesource.com/c/sys/+/598895

[3] https://go-review.googlesource.com/c/sys/+/603755

Comments (0)

No comments yet