Automatically updates DNS records for internet connections that don't have a static IP
APACHE-2.0 License
Automatically updates DNS records for hosts that don't have a static IP
๐ฃ 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
๐ 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
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 pull ghcr.io/soerenschneider/dyndns-server:main
$ docker pull ghcr.io/soerenschneider/dyndns-client:main
Head over to the prebuilt binaries and download the correct binary for your system.
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
Head over to the configuration section to see more details.
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=="}
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
referenceField 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
referenceField 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 |
Head over to the metrics to see more details.
The changelog can be found here