The Dual-Stack Dynamic DNS client, the world's first dynamic DNS client built for IPv6.

Overview

dsddns

DsDDNS is the Dual-Stack Dynamic DNS client. A dynamic DNS client keeps your DNS records in sync with the IP addresses associated with your home Internet connection, which are subject to reassignment by your ISP.

DsDDNS is the world's first dynamic DNS client built from the ground-up for IPv6. In comparison to other dynamic DNS clients available on the Internet, including some others that support IPv6, DsDDNS features:

  • First-class support for IPv6, including the ability to update multiple hostnames within a dynamically allocated prefix—not just the one that refers to the host system.
  • Support for determining the lower bits of the address either manually or with SLAAC.
  • Support for managing multiple domains across multiple accounts and services.
  • A single binary and a single configuration file that can be deployed anywhere.
  • A YAML configuration format that supports the DRY ("don't repeat yourself") principle.

Currently, DsDDNS can manage A and AAAA records for the following services:

Installation

Grab Linux, Windows, and MacOS binaries from the releases page.

Or, to build and install your own copy,

$ go get -u github.com/YoRyan/dsddns

With systemd

For Linux servers, here is the suggested systemd service definition:

[Unit]
Description=DsDDNS Dynamic DNS Client
[Service]
ExecStart=/path/to/dsddns /etc/dsddns.conf
Restart=always
[Install]
WantedBy=multi-user.target

With Docker

If you are a Docker fan, a DsDDNS Dockerfile and Docker image are available. However, be aware that Docker does not enable IPv6 support out of the box. (Boo!) Until you manually assign a prefix, containers will not be able to use IPv6, and DsDDNS will not be able to manage AAAA records.

To use the Docker image, bind mount the configuration file to /etc/dsddns.conf.

Configuration

The configuration file is in YAML format. Its path should be supplied to as the sole argument to DsDDNS:

dsddns /etc/dsddns.conf

This file contains a list of records to manage under the records key. Here is a simple example configuration:

records:
  - type: A
    service: cloudflare,
    api_token: XXXXXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXX
    record_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    zone_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    name: ipv4.youngryan.com
  - type: AAAA
    service: cloudflare,
    api_token: XXXXXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXX
    record_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    zone_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    name: ipv6.youngryan.com

To test the configuration file without making any changes to your DNS records, you can add the -dryrun flag:

dsddns -dryrun /etc/dsddns.conf

(To see the other command-line flags available, run dsddns -help.)

Common fields

Some keys apply to all kinds of records, regardless of service. The following keys must be specified:

Key Type Value
type string Specifies the type of DNS record. Can be A (IPv4) or AAAA (IPv6).
service string

Specifies the dynamic DNS service that manages this record. Must be one of the following values:

  • cloudflare
  • duck
  • google

The following keys are optional:

Key Type Value
interface string Selects the source network interface to use when reading the current IP address. This setting refers to the interface used by the HTTP client; DsDDNS always reads the current IP address from a web service. The interface should be specified by its name, such as eth0. If it is not specified, the operating system selects the interface.
ip_mask_bits number Zeroes out the specified number of lower bits from the IP address. The value 64 can be used to zero out the interface identifier portion (right half) of an IPv6 address.
ip_offset string Sets the lower bits of the IP address once they have been masked with ip_mask_bits. The value should be an "offset" IP address, such as ::1, which will be added to the masked address.
ip_slaac string Sets the lower 64 bits of the IP address using the provided MAC address, such as 11:22:33:44:55:66. The EUI-64 method is used, matching the addresses generated by SLAAC. This setting overrides ip_mask_bits and ip_offset.

Per-service fields

Other keys only apply to records managed by specific services. Some of them are required by the service.

Cloudflare

Cloudflare API requests can be authenticated using your account's global API key or by issuing individual API tokens. Specify a global API key or an API token, but not both.

The following keys are mandatory for Cloudflare-managed records:

Key Type Value
api_key string If using your global API key, provide it here.
api_email string If using your global API key, provide your Cloudflare login here.
api_token string If using an API token, provide it here.
name string Specify the full domain managed by this record, including its suffix.
zone_id string Specify the identifier of your domain's DNS zone. You can obtain this with the List Zones API call.
record_id string Specify the identifier of your DNS record. You can obtain this with the List DNS Records API call.

The following keys are optional:

Key Type Value
ttl number Sets the TTL for this record's updates. If it is not specified, the value 1 (automatic) is used.
Duck DNS

The following keys are mandatory for Duck DNS-managed records:

Key Type Value
subname string The domain managed by this record. Should not include the ".duckdns.org" suffix.
token string The API token for this dynamic DNS client.
Google Domains

To use a dynamic DNS client with Google Domains, you have to set up a synthetic record for the hostname you want to manage and then generate a username/password combination for the client.

The following keys are mandatory for Google-managed records:

Key Type Value
username string The username generated for this dynamic DNS client.
password string The password generated for this client.
hostname string The FQDN for this record.

Avoiding repetition with merge keys

Because the configuration file uses YAML, you can use YAML's anchor, alias, and merge key features to consolidate information that repeats itself.

Here is an example of a configuration file that uses merge keys to centralize authentication information:

my_merges:
  - &CfYoungryanCom {
      service: cloudflare,
      api_token: XXXXXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXX,
      zone_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    }
records:
  - << : *CfYoungryanCom
    type: AAAA
    record_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    name: radio-free.youngryan.com
    ip_mask_bits: 64
    ip_offset: ::1
  - << : *CfYoungryanCom
    type: AAAA
    record_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    name: arvin.radio-free.youngryan.com
    ip_slaac: c8:5b:76:xx:xx:xx
  - << : *CfYoungryanCom
    type: AAAA
    record_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    name: shafter.radio-free.youngryan.com
    ip_slaac: 10:60:4b:xx:xx:xx
Releases(v1.1.0)
Owner
Ryan Young
Polyglot programmer-writer and citizen of the Internet.
Ryan Young
Render minecraft: bedrock worlds using dragonfly

worldrenderer render minecraft: bedrock worlds using dragonfly

Tal 5 Jun 10, 2022
SOCKS Protocol Version 5 Library in Go. Full TCP/UDP and IPv4/IPv6 support

socks5 中文 SOCKS Protocol Version 5 Library. Full TCP/UDP and IPv4/IPv6 support. Goals: KISS, less is more, small API, code is like the original protoc

TxThinking 477 Aug 10, 2022
ScriptTiger 17 Aug 7, 2022
Quickly find all IPv6 and IPv4 hosts in a LAN.

invaentory Quickly find all IPv6 and IPv4 hosts in a LAN. Overview ?? This project is a work-in-progress! Instructions will be added as soon as it is

Felix Pojtinger 7 May 17, 2022
CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed.

CoreRAD CoreRAD is an extensible and observable IPv6 Neighbor Discovery Protocol router advertisement daemon. Apache 2.0 Licensed. To get started with

Matt Layher 121 Jul 20, 2022
Hetzner-dns-updater - A simple tool to update a DNS record via Hetzner DNS API. Used for simple HA together with Nomad

hetzner-dns-updater A small utility tool to update a single record via Hetzner D

Patrick Pacher 0 Feb 12, 2022
Dynamic dns for name.com

name-ddns Dynamic DNS for Name.com using v4 name.com API Usage docker run --rm \ -e "NAME_DDNS_USER=namecom-user" \ -e "NAME_DDNS_TOKEN=namecom-toke

Ignacio Tolstoy 1 Apr 11, 2022
Self-hosted and Easy-to-deploy Cloudflare based Dynamic DNS service for router

Self-hosted and Easy-to-deploy Cloudflare based Dynamic DNS service for router Contents Features Environment Variables Installation Heroku Docker (Run

Aseem Manna 4 May 30, 2022
DNS Ping: to check packet loss and latency issues with DNS servers

DNSping DNS Ping checks packet loss and latency issues with DNS servers Installation If you have golang, easiest install is go get -u fortio.org/dnspi

Fortio (Φορτίο) 60 Aug 5, 2022
Verify IP addresses of respectful crawlers like Googlebot by reverse dns and forward dns lookups

goodbots - trust but verify goodbots verifies the IP addresses of respectful crawlers like Googlebot by performing reverse dns and forward dns lookups

Eric Wu 29 Jun 21, 2022
netcup DNS module for caddy: dns.providers.netcup

netcup DNS module for Caddy This package contains a DNS provider module for Caddy. It can be used to manage DNS records with the netcup DNS API using

null 6 Mar 3, 2022
A fork on miekg/dns (since I've already forked zmap/dns)

Alternative (more granular) approach to a DNS library Less is more. Complete and usable DNS library. All Resource Records are supported, including the

null 0 Jan 19, 2022
A simple DNS forwarder that forwards DNS queries to various upstreams

A simple DNS forwarder that forwards DNS queries to various upstreams. If an upstream returns NXDomain, the next upstream is tried.

null 1 Jul 8, 2022
Used gRPC for the first time, and it was a amazing developer experience

gRPC Used gRPC for the first time, and it was a amazing developer experience. Edge points of using gPRC which I felt: Structured Code Uniform request

Mrigank Anand 5 Oct 11, 2021
Reflections on a first-run of a very simple Go project.

Go-Example Working example of the write-up posted on my blog. Installation Set GOPATH to this (root) folder. On Unix-like systems: export GOPATH=. In

null 0 Nov 13, 2021
App with CRUD for user, with palindrome checker for user's first and last name

Run db container first, so that app does not connect to db while db has not started yet docker-compose up -d db docker-compose up -d app CRUD endpoint

Vinh Tran 0 Dec 9, 2021
A Minecraft scanner written in Golang (first Golang project)

__ __/ \__ Gothyc A Minecraft port scanner written in Go. ?? / \__/ \__ \__/ \__/ \ Version 0.3.0 \__/ \__/ Author @toas

toast 11 Jul 9, 2022
Keeps track of Steam Deck Verifications. On first run, it reports all games with their respective Steam Deck Verification status. On subsequent runs, the tool will report newly tested and updated games.

Keeps track of Steam Deck Verifications. On first run, it reports all games with their respective Steam Deck Verification status. On subsequent runs, the tool will report newly tested and updated games.

henning mueller 1 Feb 2, 2022
Diameter stack and Base Protocol (RFC 6733) for the Go programming language

Diameter Base Protocol Package go-diameter is an implementation of the Diameter Base Protocol RFC 6733 and a stack for the Go programming language. St

Alexandre Fiori 206 Aug 17, 2022