DIY Dynamic DNS with OpenWRT and Google Domains

Dynamic DNS (DDNS) can give your home’s changing IP a reliable hostname. I recently redid mine with some new tools. Here’s how it went!

## History
When I first had high-speed internet, the ISP had helpfully printed my static IP address on the bottom of the massive cable modem. This consistent, reliable address was convenient for the multiplayer PC games of the time, which often required manually entering an IP to connect. One of my old friends still has that IP memorized!

These days, everyone uses DHCP with finite leases, so your public IP changes from time to time. If you want reliable access from outside, the solution is to use Dynamic DNS. In short, you run a _dynamic dns client_ inside your network, which connects to your domain registrar and automatically updates a record to point to your current IP. Many consumer-grade routers have this capability built-in.

I’ve done this for years, using whichever free service happens to be supported by my router. Recently, I’ve been annoyed by the service’s constant attempts to convert me to a paying customer, so I decided to DIY it with a subdomain I already own.

## Domain
My existing registrar’s DDNS support looked pretty poor, so I transferred a domain to Google Domains, where support is [much better](https://support.google.com/domains/answer/6147083). I chose Google in part because its help page offers settings for a client called [inadyn](https://github.com/troglobit/inadyn), which I recognized from my router logs. After adding a new _”Dynamic DNS”_ _”Synthetic record”_ to the domain, it was time to reconfigure my router.

## Router Firmware
Here’s where I hit a speed bump. I’d been using a third-party router firmware called [DD-WRT](https://www.dd-wrt.com/) for a few years, mostly for its larger set of supported Dynamic DNS services.

I didn’t get very far. Long story short, even the latest releases of DD-WRT are built with an ancient version of inadyn that won’t work with Google Domains (and, indeed, can’t even use TLS). I was ready to give up and run a client on a _computer_ when a friend suggested I try another router firmware.

I looked around and found that OpenWRT seems to be the most active third-party router firmware, with support for a large set of DDNS services. I restored my router to its factory firmware and then [installed](https://wiki.openwrt.org/doc/howto/installopenwrt) OpenWRT.

## Adding Dynamic DNS Support to OpenWRT
OpenWRT’s philosophy is to provide a bare-bones platform with optional modules for various features and services. This is fantastic for space-constrained devices (my router has a whopping 8MB of storage!), but it means we need to do a little extra work to enable DDNS.

After an embarrassing amount of troubleshooting (documentation [here](https://wiki.openwrt.org/doc/howto/ddns.client)), I can pass on one simple guideline: Make sure to _update the package list_, and then install the packages `luci-app-ddns`, `wget`, `ca-certificates`, and `bind-host`.

As I installed packages, I nervously watched the disk usage grow:

After the packages are installed, the configuration will appear in the UI under _Services_ -> _Dynamic DNS_.

## Configuration
Configuring DDNS within OpenWRT is pretty easy! Just paste the hostname and Google’s randomly-generated credentials into OpenWRT’s UI.

Once you enable the rule, it will attempt to connect. A successful log looks something like this:

 012429       : #> /usr/bin/wget -nv -t 1 -O /var/run/ddns/myddns_ipv4.dat -o /var/run/ddns/myddns_ipv4.err --ca-directory=/etc/ssl/certs --no-proxy 'https://foo:[email protected]/nic/update?hostname=subdomain.example.com&myip=XX.XX.XX.XX'
 012430       : DDNS Provider answered:
good XX.XX.XX.XX
 012430  info : Update successful - IP 'XX.XX.XX.XX' send
 012430  info : Forced update successful - IP: 'XX.XX.XX.XX' send
 012430       : Waiting 600 seconds (Check Interval)

The IP shows up in Google Domains’ UI, and the hostname should start working shortly.

## Conclusion
I concede that most people don’t need this, especially in today’s era of laptops, software-as-a-service, and the cloud. If you find yourself wanting external access to something at your house, though, Dynamic DNS might be just the ticket.

For example, you could forward a port and remote in to your desktop computer, if you still have one of those. Or access a network camera, or the media library on your NAS, or your [garden watering system](https:/raspberry-pi-gardening/).

Or, even if you don’t need DDNS, it might be worth checking out OpenWRT for some of the other [cool stuff](https://wiki.openwrt.org/doc/howto/start) it can do, like guest networks, VOIP, QOS, and VPN.

Besides, it’s really cool to be able to ssh to your _router_!