dyndns
Automatically updates DNS records for hosts that don't have a static IP
Features
π£ Dynamically updates DNS records to match their public IP address
π° Built-in resiliency for different failure scenarios
π’ Server component supports running on AWS Lambda
π Dispatch update requests via AWS SQS, MQTT and/or HTTP API calls
π Detect public IP address by network interface's status or by calling HTTP APIs
π Runs in client / server mode to limit blast-radius of leaked credentials
π§ Customizable list of HTTP APIs to detect IP updates
β€οΈ Specify HTTP APIs that detect IP updates which are preferred over other API endpoints
π Messages are cryptographically signed, therefore public MQTT brokers can be used
π Can use either dynamic credentials using Hashicorp Vault or static credentials
π Observability through Prometheus metrics
Why would I need it?
π You don't have a static public IP address but want to connect to your home network
π€Ή Ideally, you have multiple endpoints you want to assign DNS records to
Installation
AWS Lambda
Run the lambda-server
Makefile target to build an archive for the provided.al2
Lambda runtime and the arm64
architecture. Either create a Lambda function using AWS cli / Console or run the Terraform code to create an API Gateway instance and Lambda function.
$ make lambda-server # build the server component
$ terraform -chdir=deployment/terraform/envs/dev apply # this command will deploy a dyndns-server as a Lambda function which is reachable via a new API Gateway instance
$ terraform -chdir=deployment/terraform/envs/dev output -raw gateway-url # display the url of the API endpoint
Docker / Podman
$ docker pull ghcr.io/soerenschneider/dyndns-server:main
$ docker pull ghcr.io/soerenschneider/dyndns-client:main
Binaries
Head over to the prebuilt binaries and download the correct binary for your system.
From Source
As a prerequesite, you need to have Golang SDK installed. After that, you can install dyndns from source by invoking:
$ go install github.com/soerenschneider/dyndns@latest
Configuration
Head over to the configuration section to see more details.
Getting Started
First, you need to build a keypair. This is easily done
$ docker run ghcr.io/soerenschneider/dyndns-client -gen-keypair
{"public_key":"IyXH8z/+vRsIUEAldlGgKKFcVHoll8w2tzC6o9717m8=","private_key":"h7jrhYupN0LVPnVWqFun6sN+bWNr0B0mh7/mgRaKnhsjJcfzP/69GwhQQCV2UaAooVxUeiWXzDa3MLqj3vXubw=="}
Architecture
Client Internals
Client states and client failure scenarios and their remediation is found here.
Data sent over the wire is expected to have the following format, encoded as a JSON message.
UpdateRecordRequest
reference
Field Name |
Description |
JSON Key |
Data Type |
Optional |
PublicIp |
The resolved IP address. |
"public_ip" |
DnsRecord |
No |
Signature |
The signature associated with the envelope. |
"signature" |
String |
No |
DnsRecord
reference
Field Name |
Description |
JSON Key |
Data Type |
Optional |
IpV4 |
The IPv4 address (optional). |
"ipv4" |
String |
Yes |
IpV6 |
The IPv6 address (optional). |
"ipv6" |
String |
Yes |
Host |
The hostname associated with the resolved IP address. |
"host" |
String |
No |
Timestamp |
The timestamp when the resolution occurred. |
"timestamp" |
Time |
No |
Observability
Head over to the metrics to see more details.
Changelog
The changelog can be found here