+++ categories = ["software"] tags = ["dns"] date = 2025-02-16T00:00:00Z description = "" draft = false slug = "dynamic-dns" title = "🌐 Dynamic DNS" author = "nicholas" +++ I have a public IP assigned by my ISP, but it is not *static*, and is therefore subject to change at their whim. This is no good, since I like to be able to access my devices from beyond my local network, and any change in my public IP address will result in misconfigured DNS. A disaster. I need a way to be sure that my any change in my public IP address will trigger an automatic reconfiguration of certain DNS records. I am using AWS Route 53 for my DNS provider, and luckily there is a handy resource available [`route53-dynamic-dns-with-lambda`](https://aws.amazon.com/blogs/startups/how-to-build-a-serverless-dynamic-dns-system-with-aws/) which perfectly suits my need for DDNS. ### Route 53 Dynamic DNS with Lambda Rather than rehash all of the steps covered in the documentation for this tool, I will simply cover the broad strokes of the process and configuration. The repository linked above basically comes with an installer that walks the user through a few steps to automatically configure the DDNS. The user is left with a simple script that will update the Route 53 DNS records any time the sender IP address changes. This is explained pictographically below. {{< image src="images/architecture.png" caption="Route 53 Dynamic DNS with Lambda" >}} #### AWS CloudShell {{< image src="images/aws-cloudshell.jpg" caption="AWS Cloudshell" >}} The guide recommends deploying their Cloud Development Kit using AWS CloudShell session, so this is what I do. The process amounts to cloning the git repo `route53-dynamic-dns-with-lambda`, running the `newrecord.py` script contained therein, and following the directions in the CLI bootstrap wizard. The process is basically: - clone the repo - change directory to the repo - install the CDK - run `newrecord.py` {{< image src="images/aws-cloudshell-newrecord.py.jpg" caption="newrecord.py" >}} #### Generate Configuration File The last step of the install wizard isa prompt appears to confirm all of the settings. ```bash ############################################## # # # The following configuration will be saved: # # # Host name: www.uuard.com Hosted zone id: ZYZ12345678901234 Record set TTL: 60 Secret: SHARED_SECRET_123 # # # do you want to continue? (y/n) # # # ############################################## ``` And finally the following message is produced, along with a `dyndns.sh` script. > This can be run via a CRON or SystemD timer to periodically update your hostname. ``` ##################################################### # # # The Serverless Dynamic DNS solution is now ready. # # # ##################################################### www.uuard.com can be updated with the following command: ./dyndns.sh -m set -u https://xyz1234567890xyz.lambda-url.eu-west-1.on.aws/ -h www.uuard.com -s SHARED_SECRET_123 ``` The only thing left to be done is to move the provided `dyndns.sh` script to my server and set up a `cron` job. I chose to run my script each week “At 00:00 on Sunday” (`0 0 * * 0`). Done.