Since I registered this domain, I have been using Namecheap for DNS mostly out of convenience. Most of the domains I manage for work use DigitalOcean which is a little different, but not necessarily better in my opinion. I went into this project with fairly minimal knowledge about different DNS providers and I did not do a thorough comparison of the various providers out there. I settled on Cloudflare as a service that I trust (I use their 1.1.1.1 DNS) and that is free; I skipped DigitalOcean because the OPNSense integration does not show updates in DDNS and I recall it being a bit of a pain getting resource IDs that are used as usernames for authentication.
Motivation
I was configuring a new domain at work and it reminded me how inconvenient it is to use HTTP challenges for my personal domain because Namecheap requires a static IP for DNS challenges. Some brief searching indicated other users have had success using Cloudflare; this Reddit post in particular described my exact situation with Cloudflare DNS as a suggested solution.
Cloudflare Configuration
Creating a free account with Cloudflare is easy. After account creation, I waited to change my domain DNS settings until after I created
the necessary records on Cloudflare to avoid any downtime. I have a CNAME
record to point mcknight.tech
to www.mcknight.tech
and
then a single wildcard A
record that DDNS updates to point at my home network.
I also have email through Namecheap; I followed their configuration guide to get those records in place.
OPNSense Updates
I have an OPNSense router handling DDNS updates and LetsEncrypt certificate renewal. It isn’t possible to start issuing certificates until the DNS servers are updated (and the update propagates), but this can be configured in OPNSense so everything is ready to go.
Dynamic DNS
Under Services
-> Dynamic DNS
-> Settings
, I created a new entry; Cloudflare uses the username token
and an API key for the
password. I set zone
to mcknight.tech
and Hostname(s)
to *.mcknight.tech
(the one A
record configured earlier). I use
Interface
for the Check IP Method since it is the most straight-forward method for getting my public IP address. After applying the
changes and waiting a few minutes, the Current IP
and Updated
fields should show something after refreshing the page; the Log File
menu option can be used to check for any errors.
ACME Client
I already have HTTP-based certificates configured, so I am re-using an existing Account.
Under Services
-> ACME Client
-> Challenge Types
, I created a new DNS-01 challenge; the Global API Key
section may be left empty,
CF Account ID
is most easily found as the first part of the URL slug when logged in at dash.Cloudflare.com. The API key could use the
same key as Dynamic DNS, though I prefer to generate separate ones in case I have to re-issue a key to change some service configuration
in the future. I left CF Zone ID
empty.
Next under the Certificates
menu, I created a new certificate with Common Name *.mcknight.tech
, using my existing Account and newly-
defined Challenge. At this point, the OPNSense configuration is complete but a certificate cannot be issued until DNS records are updated
with Namecheap.
Update Namecheap DNS
With all of the above configuration done, updating Namecheap DNS shouldn’t cause any service interruption; when the name servers update,
Cloudflare should keep all of the routing working. In the Namecheap Domain
menu, I changed Nameservers
to Custom DNS
and entered the
nameservers listed in Cloudflare.
At this point, it will take some time for DNS changes to propagate (this time it took less than an hour, but I’ve waited up to 12 in the past). Cloudflare shows a warning when it is not managing DNS, so I waited for this warning to go away as an indication that routing moved over.
Test Changes
I have TrueNAS (among other things) set up to send email alerts, so I sent a test email there to check that my DNS records for emails are all valid. I suppose it would have been just as easy to send an email to myself, but I had the TrueNAS dashboard open already.
I also did some quick checks for external access to my domain from my phone since my Uptime Kuma monitoring runs on the same subnet as everything else on my domain. In the future, I might get that running remotely for a more complete test.
Issue DNS Certificate
With routing all updated, that configured certificate can now be issued. After watching LetsEncrypt issue the certificate, I am confident that all of my changes were successful.
With the DNS Certificate issued, I updated nginx to use the new certificate and then restarted that service in OPNSense. I usually wait a few minutes and then open a page in a private browser to check for the new certificate without worrying about the old one being cached.
Conclusion
This was a quick change that I am very glad to have made. Now, I can add services/subdomains simply by updating Nginx and they will automatically have working SSL with a valid certificate. I am also interested in checking out all the analytics Cloudflare exposes; I see there is more web scraping traffic than I expected, that or there are a lot more people reading this than I thought.