DynDNS64

DynDNS64 automatically keeps your ipv64.net domains pointed at your connection's public IPv4 and IPv6. This page shows how to set it up with your API key, which modes there are, how often it checks and what happens on errors and limits.

Requirement

DynDNS64 only updates names hosted at ipv64.net: ipv64 DynDNS domains and your own domains at ipv64. So you need an ipv64.net account – getting started is free. How many domains and daily updates your plan includes is listed at ipv64.net/pricing. Linking the node to ipv64 (health check sync) is not required.

How it works

DynDNS64 only opens outbound connections. You don't need to forward any port.

  # Home network                              # Internet · outbound only
 ┌──────────────────┐  1 What is my IP?        ┌────────────────────────────┐
 │      Node64      │ ───────────────────────► │ ipv4. / ipv6.ipv64.net     │
 │     DynDNS64     │    HTTPS, tcp4 / tcp6    ├────────────────────────────┤
 │                  │  2 What does DNS say?    │                            │
 │ checks every     │ ───────────────────────► │ zone's name servers        │
 │ 5 min (default)  │    DNS, UDP 53           ├────────────────────────────┤
 │                  │  3 only if different     │                            │
 │ no open port     │ ───────────────────────► │ ipv64.net/update.php       │
 │                  │    HTTPS, token header   ├────────────────────────────┤
 │                  │  optional with API key   │                            │
 │                  │ ───────────────────────► │ ipv64 API v2               │
 └────────┬─────────┘    picker, quota         └────────────────────────────┘
          │ notifications
          ▼
   e-mail · Telegram · Discord · ntfy · Gotify · Pushover · webhook
  1. Find the IP: Node64 asks ipv4.ipv64.net or ipv6.ipv64.net – with the address family enforced, so the other side sees the public address (for IPv4, your router's).
  2. Compare: Node64 asks the zone's authoritative name servers directly (no cache) what they're currently serving.
  3. Report: Only if the expected address is missing does Node64 call ipv64.net/update.php – and only for the address family that changed.

Getting and entering your API key

With an ipv64 API key you can pick names straight from your account, see your update quota, and Node64 fetches tokens by itself. It also works without a key – see Enter manually.

  1. Create a key
    Log in at ipv64.net and create an API key in your account. The interface itself is described in the API documentation.
  2. Enter it in Node64
    Paste the key under Settings → ipv64 API key. It's stored centrally in the settings and used by all modules; Node64 shows its name and expiry date and stores it encrypted.
  3. Enable the module
    Enable the DynDNS module under Settings → Modules. When it's off, nothing runs.
Safest token, automatically

Updates never use the API key. Node64 always picks the safest token: the name's record token, otherwise the domain token – the account token is never used. The key is only for picking names, showing the quota and renewing tokens. Tokens are stored encrypted, sent in the HTTP header (Authorization: Bearer …) rather than the URL, masked in logs and shown in the UI with only their last 4 characters.

Choosing domains

  1. Add target
    Under DynDNS → Add target, "Domains and records of your account" lists all active domains with their A and AAAA records.
  2. Tick names
    For each name, choose what gets updated (IPv4 and IPv6 mode). The defaults match the existing records. With "prefix + interface ID", Node64 takes the interface ID from the existing AAAA record.
  3. Add selection
    Node64 fetches fresh tokens from ipv64 and creates the targets, grouped by domain. Fixed addresses and interface mode are set afterwards when editing a target.
  • You can add as many targets as you like; each one has its own token.
  • Records belonging to the ipv64 CDN itself are never touched. Names behind ipv64's reverse proxy/CDN can be selected (note "via ipv64 CDN"): DynDNS64 then only maintains the origin address. DNS returning the CDN addresses is intended – the target shows "up to date · DNS via CDN/proxy" and is re-checked once a day.
  • If you no longer want a target, delete it when editing. The record at ipv64 stays, and so does the history.

Enter manually (without API key)

Without an API key, create targets under Enter manually – fully functional, just without the picker and without the quota display:

FieldContent
Domainyour domain at ipv64
Hostname below the domain, empty = the domain itself
Token typeRecord token (can only change this one name – recommended) or domain token (can change the whole domain including subhosts)
Token32 characters, found at ipv64 on the record or the domain; stored encrypted

Modes for IPv4 and IPv6

For every target you set IPv4 and IPv6 separately. At least one family has to be on.

IPv4

ModeWhat gets reported
automaticYour connection's public IPv4 – your router's, never the container's internal address.
fixed addressAlways the public IPv4 you entered.
offIPv4 isn't updated for this name – useful with CGNAT or DS-Lite, when your IPv4 isn't reachable from outside.

IPv6

ModeWhat gets reported
address of this hostThe node's IPv6 as seen from outside. If that's a temporary privacy address, Node64 uses the stable one from the same /64. Works best with network_mode: host.
prefix only (zone-wide)Only the /64 prefix. ipv64 applies it to all AAAA records of the zone that only carry an interface ID (e.g. ::1:2:3:4). Affects the whole zone.
prefix + interface IDThe current /64 prefix plus the interface ID you enter (lower 64 bits, e.g. ::1a2b:3c4d:5e6f:7a8b), put together locally and reported for this record only. Great for other LAN devices with a fixed interface ID.
interfaceThe stable global address of one of the host's network interfaces; temporary, deprecated, ULA and link-local addresses are skipped. Only with network_mode: host.
fixed addressAlways the public IPv6 you entered.
offIPv6 isn't updated for this name.
IPv6 in the container

By default, Docker gives containers no IPv6. If the container has no IPv6 connectivity, DynDNS64 doesn't even try and shows "no IPv6 in the container". The fix: network_mode: host or enable IPv6 in the Docker network – see Configuration. IPv4 works either way, because behind NAT ipv64 automatically sees your router's address.

Connection check: CGNAT and DS-Lite

After every module start, DynDNS64 traces the first up to six hops towards ipv4.ipv64.net (Linux only, IPv4 only). If a hop lies in the provider NAT range 100.64.0.0/10, you get a CGNAT hint; with 192.0.0.0/29, a DS-Lite hint – each with links to relevant help at ipv64. The analysis is only an indication: from inside your network it can't be determined for sure. If your IPv4 isn't reachable from outside, set IPv4 to "off" for your targets and use IPv6 – or publish services via CDN64.

Check interval and check URL

You'll find these settings on the DynDNS page under Checking.

SettingValuesDefault
Check interval1, 2, 5, 10, 15, 30 or 60 minutes5 minutes
Own check URL IPv4 / IPv6optional, http/https only; must return the address as text or JSONempty = ipv64
  • Looking up your own address does not use any update quota. Updates only happen on a change.
  • Order of sources: your own check URL (if set), then ipv4.ipv64.net or ipv6.ipv64.net, with ipv64.net/api/v2/ip as fallback. Only public addresses are accepted – private, CGNAT, link-local, documentation and test addresses are not.
  • The first run starts a few seconds after startup. Each run starts with a small random offset so that not all nodes ask at the same moment.
  • If no target is enabled, the regular check is idle (no queries, no quota lookups).
  • Check now starts a run immediately. Update now reports a target's address to ipv64 right away, even without a change – this uses update quota.

Behaviour on errors and limits

DynDNS64 is built to spare your daily quota and never end up in an endless loop:

  • Only on change: the expected address is compared with the last reported one and with the answer from up to two of the zone's name servers. If a name has several A/AAAA records, it's enough for the expected address to be among them. Even a "nochg" would count toward the daily limit – so without a difference, nothing is reported at all.
  • Queue: there are at least 5 seconds between two calls to ipv64.
  • Grace period: after an update, DynDNS64 waits at least 3 minutes or two check intervals while the name servers still return the old state.
  • Too many requests (429/cooldown): backoff of 1, then 5, then 15 minutes.
  • Daily limit reached: no further attempts until the next day.
  • Server or network errors: only hold back the affected target – 2, 4, 8 … at most 60 minutes.

Automatic pauses

In some cases, another attempt would only burn quota. DynDNS64 then pauses the target and explains why:

Shown asMeaningWhat to do
token rejectedipv64 rejected the token, e.g. because it was regenerated."Fetch token again" (with API key) or enter a new token, then "Update now". With an API key, Node64 retries hourly with a freshly fetched token.
unknown nameThe name doesn't exist at ipv64 (anymore).Check at ipv64 or delete the target.
conflict (CNAME/CDN)A CNAME, CDN or failover on the name prevents the update.Resolve it at ipv64, then "Update now".
changed elsewhereThe record was repeatedly set differently from somewhere else (3× in 2 hours), e.g. by a second updater or another node.Switch off the other updater, then "Update now".
ignored at ipv64The domain is configured at ipv64 to ignore IPv4 or IPv6.Check the setting at ipv64 or switch that family off for the target.

"Unknown name", "conflict", "ignored at ipv64" and "changed elsewhere" are retried automatically after 6 hours.

Target status

StatusMeaning
up to dateDNS returns the expected address.
up to date · DNS via CDN/proxyThe name sits behind ipv64's reverse proxy/CDN (e.g. CDN64). DNS then intentionally returns the CDN's addresses, not yours. DynDNS64 only maintains the origin address and does not re-report because of this difference – which saves update quota. It is detected from ipv64's response or already when selecting from your account; once a day DynDNS64 checks whether that is still the case.
being appliedUpdate reported, the name servers still return the old state (grace period).
DNS differsEven after the grace period, the name servers return a different address than the one reported.
not synced yetNew target, no run has completed yet.
error / paused / offSee the note on the target or Automatic pauses.

Keeping an eye on the quota

With an API key, the page shows "DynDNS updates today: X of Y" from your ipv64 account, plus this node's own count of calls in the last 24 hours. It's fetched at most every 15 minutes (when you open the page and the value is older than 5 minutes). From 80 % the page warns you – after that, ipv64 won't accept updates until the counter resets.

History

The History page has two tabs: Updates and IP checks. Filter by target, address family, result and time range (24 hours, 7 days, 30 days, everything); each view shows the newest 300 entries. For every update you see the time, target, trigger (automatic or manual), the IPv4/IPv6 or prefix sent, HTTP code, ipv64's response, errors and duration.

RetentionValuesDefault
IP checks7, 30, 90 or 365 days30 days
Updates90 days, 365 days or unlimited365 days

Changes to targets and settings are also recorded in Node64's audit log.

Notifications

Under Checking → Notifications you switch these notifications on or off individually:

  • Public address has changed
  • Update failed or target paused – automatic runs only. A persistently failing IP lookup (three runs in a row) is reported too; the all-clear follows on the next success.
  • Update limit almost or fully reached – at most once a day.

Notifications go to this node's default channels – e-mail, Telegram, Discord, Slack, Microsoft Teams, Matrix, ntfy, Gotify, Pushover or webhook – even if the node is linked to ipv64. Nothing is sent during quiet hours, but the history still shows everything. ipv64 mail and SMS are sent with your API key directly through the ipv64 API. Webhooks receive the kinds dyndns_ip, dyndns_fail and dyndns_limit. Set up channels under Notifications.

API, Prometheus and export

Everything in the UI is also available through the local JSON API (log in with a Node64 API key, details under API):

CallPurpose
GET /api/dyndns/statusaddresses, connection check, targets per status, quota
GET|POST /api/dyndns/targetslist or create targets
GET|PUT|DELETE /api/dyndns/targets/{id}read, change, delete a target
POST /api/dyndns/targets/{id}/updateupdate now
POST /api/dyndns/targets/{id}/tokenfetch the token again from ipv64
POST /api/dyndns/checkcheck now
GET /api/dyndns/historyhistory
GET|PUT /api/dyndns/settingssettings
GET /api/dyndns/account/names, POST /api/dyndns/targets/from-accountpick from your ipv64 account
bash
# Start a check run right away
curl -X POST -H "Authorization: Bearer YOUR_API_KEY" http://NODE-IP:8080/api/dyndns/check

For Prometheus and Grafana, GET /api/metrics provides, among others, node64_dyndns_target_status, node64_dyndns_target_ok, node64_dyndns_targets and node64_dyndns_updates_24h (calls to ipv64.net in 24 hours). Examples and alert rules are under Prometheus.

Export/import: the export contains targets and settings without tokens; on import, Node64 fetches them again with the API key. More under Update & backup.

Something unclear, missing, or a question about Node64? Ask in the official forum v64.tech.

Questions about Node64?
For any questions about the product, use the official forum: setup, troubleshooting, ideas and exchange with the community and the ipv64.net team.
Go to the forum v64.tech