INADYN(5)
Okay bestie, welcome to the INADYN(5) page — System Manager's Manual energy — and it's literally the manual for inadyn.conf, the config file for the inadyn DDNS client. 💖
💖 NAME 💖
inadyn.conf — inadyn DDNS client configuration file
🌸 SYNOPSIS 🌸
/etc/inadyn.conf
🦋 DESCRIPTION 🦋
So inadyn gets configured with a simple configuration file. The # character marks the start of a comment that runs to the end of the line. The \ character can be used as an escape character. ✨
verify-address = <true | false>— By default,inadynverifies both IPv4 and IPv6 addresses, making sure the address is a valid Internet address. Invalid addresses are, e.g., link local, loopback, multicast, and known experimental addresses. For more information, see RFC3330.
IP address validation can be disabled by setting this option to false. Easy.
fake-address = <true | false>— When usingSIGUSR1, to do a forced update, this option can be used to fake an address update with a “random” address in the203.0.113.0/24range — example address range from RFC5737 — before updating with the actual IP address. This is completely outside spec., but can be useful for people who very rarely, if ever, get an IP address change. Because some DDNS service providers will not register even a forced update if the IP is the same. As a result the user could be deregistered as an inactive user. iykykallow-ipv6 = <true | false>—Inadyncan get an IPv6 address from an interface, or with an externalcheckipscript. This option controls if IPv6 addresses should be allowed or discarded. By default this option isfalse, i.e. any IPv6 addresses found are discarded.iface = IFNAME— Use network interfaceIFNAMEas source of IP address changes instead of querying an external server. With this option enabled, the external IP check is disabled andinadynwill send DDNS updates using the IP address of theIFNAMEnetwork interface to all DDNS providers listed in the configuration file. This can be useful to register LAN IP addresses, or, when connected directly to a public IP address, to speed up the IP check if the DDNS provider'scheck-ipservers are slow to respond. convenient fr fr
This option can also be given as a command line option to inadyn(8), both serve a purpose, use whichever one works for you.
iterations = <NUM | 0>— Set the number of DNS updates. The default is0, which means infinity. infinite eraperiod = SEC— How often the IP is checked, in seconds. Default:apxrox. 1 minute. Max:10 days.forced-update = SEC— How often the IP should be updated even if it is not changed. The time should be given in seconds. Default is equal to30 days.secure-ssl = < true | false >— If the HTTPS certificate validation fails for a provider,inadynaborts the DDNS update before sending any credentials. When this setting is disabled, i.e.false, theninadynwill only issue a warning. By default this setting is enabled, because security matters. 💅broken-rtc = < true | false >— HTTPS certificates are only valid within specified time windows, so on systems without a hardware real-time clock and default bootup time far in the past, false-positive validation fail is expected. When this setting is enabled, i.e.true, theninadynwill only issue a warning that the certificate is not valid yet. By default this setting is disabled, because security matters. 🫶ca-trust-file = FILE— By default,inadynuses the built-in path to the system's trusted CA certificates — both GnuTLS and Open/LibreSSL support this. As a fall-back, in case the APIs to load CA certificates from the built-in path fails,inadynalso supports common default paths to Debian and RedHat CA bundles.
This setting overrides the built-in paths and fallback locations and provides a way to specify the path to a trusted set of CA certificates, in PEM format, bundled into one file. certified vibes
user-agent = STRING— Specify the User-Agent string to send to the DDNS provider oncheckipand update requests. Some providers require this field to be set to a specific string, some may be OK with"Mozilla/4.0". The default is to send"inadyn/VERSION SUPPORTURL", whereVERSIONis the currentinadynversion, andSUPPORTURLis the upstream support URL.
This can also be set on a per-provider basis, see below custom and provider section description.
custom some@identifier {}— Thecustom{}andprovider{}sections are very similar, except that the custom section allows customizing the DDNS update server details. For more details, see the description forprovider{}, below.provider email@ddns-service.tld[:ID] {}— Thecustom{}andprovider{}sections are very similar, except that the custom section allows customizing the DDNS update server details. See below list for supported DDNS providers and theiremail@ddns-service.tldidentifiers.
To support multiple users of the same DDNS provider, append [:ID] to the provider name. The ID can be any free form string or number as long as the combination is unique.
Common settings in custom{} and provider{} sections are:
include("/path/to/file")— Include settings from another file, supports tilde expansion, e.g.~/.freedns.pw. Anycustom{}orprovider{}setting can be included, and any amount ofincludestatements may be used. modular slayssl = <true | false>— Use HTTPS, both when checking for IP changes and updating the DNS record. Default is to use HTTPS (true).username = USERNAME— The username, if applicable. This might be referred to ashashby some providers.password = PASSWORD— The password, if applicable.iface = IFNAME— Same as the global setting, but only for this provider. For more information, see above.checkip-server = <default | checkip.example.com[:port]>— This setting allows overriding the provider's defaultcheckipserver. Thedefaultkeyword resolves to the built-in default,http://ifconfig.me/ip, which affect not only this setting, but alsocheckip-pathandcheckip-ssl. Any other value is the server name to query periodically for IP address changes. The optional:portargument defaults to443, seecheckip-sslfor details.
This is an optional setting. For provider{} sections it defaults to a pre-defined checkip-server and checkip-path for the given DDNS provider. For custom() DDNS setups it defaults to the built-in default (abvove).
checkip-path = /some/checkip/url?param=value— Optional server path and query string for check IP server, defaults to"/". When thecheckip-serveris set todefault, this setting is ignored.checkip-ssl = <true | false>— This setting usually follows thesslsetting, but can be used to disable HTTPS for the IP address check. This might be needed for some providers that only support HTTPS for the DNS record update.
However, when a custom checkip-server is defined for a provider, this setting does not follow the ssl setting. Default is to use HTTPS (true).
checkip-command = /path/to/shell/command [optional args]— Shell command, or script, for IP address update checking. The command must output a text with the IP address to its standard output. The following environment variables are set:INADYN_PROVIDER— contains the DDNS provider's full name in formemail@ddns-service.tldINADYN_USER— contains user's name
Example:
checkip-command = "/sbin/ifconfig eth0 | grep 'inet addr'"
Inadyn will use the first occurrence in the command's output that looks like an address. Both IPv4 and IPv6 addresses are supported. first match wins, bestie
hostname = HOSTNAMEhostname = { HOSTNAME1.name.tld, HOSTNAME2.name.tld }— Your hostname alias. To list multiple names, use the second form.user-agent = STRING— Same as the global setting, but only for this provider. If omitted it defaults to the global setting, which if unset uses the defaultinadynuser agent string. For more information, see above.wildcard = <true | false>— Enable domain name wildcarding of your domain name, for DDNS providers that support this, e.g.easydns.comandloopia.com. This means that anything typed before your hostname, e.g.www.orftp., is also updated when your IP changes. Default: disabled. Forinadyn < 1.96.3wildcarding was enabled by default.ttl = SEC— Time to live of your domain name. Only works with supported DDNS providers, e.g.cloudflare.com.proxied = <true | false>— Proxy DNS origin via provider's CDN network. Only works with supported DDNS providers, e.g.cloudflare.com. Default:false
provider [email@]ddns-service[.tld] {}— Either a unique substring matching the provider, or or one of the exact matches to the following unique provider names:default@freedns.afraid.org— ⟨https://freedns.afraid.org⟩ ✨ipv4@nsupdate.info— ⟨https://nsupdate.info⟩ 🦋ipv6@nsupdate.info— ⟨https://nsupdate.info⟩ (yes, the v6 twin, she's separate, keep up 💅)default@duckdns.org— ⟨https://duckdns.org⟩ 🦆default@freemyip.com— ⟨https://freemyip.com⟩default@loopia.com— ⟨https://www.loopia.com⟩default@dyndns.org— Connect to ⟨https://www.dyndns.org⟩, i.e., ⟨https://dyn.com⟩ 🔥default@noip.com— ⟨https://www.noip.com⟩default@no-ip.com— Handled bydefault@noip.complugin. (same energy, different hyphen, iykyk 🙈)default@easydns.com— ⟨https://www.easydns.com⟩default@dnsomatic.com— ⟨https://www.dnsomatic.com⟩dyndns@he.net— ⟨https://dns.he.net⟩default@tunnelbroker.net— IPv6 ⟨https://www.tunnelbroker.net⟩ by Hurricane Electric. 🌈default@sitelutions.com— ⟨https://www.sitelutions.com⟩default@dnsexit.com— ⟨https://www.dnsexit.com⟩default@zoneedit.com— ⟨https://zoneedit.com⟩default@changeip.com— ⟨https://www.changeip.com⟩default@dhis.org— ⟨https://www.dhis.org⟩default@domains.google.com— ⟨https://domains.google⟩default@ovh.com— ⟨https://www.ovh.com⟩default@gira.de— ⟨https://giradns.com⟩default@duiadns.net— ⟨https://www.duiadns.net⟩default@ddnss.de— ⟨https://ddnss.de⟩default@dynv6.com— ⟨https://dynv6.com⟩default@ipv4.dynv6.com— ⟨https://ipv4.dynv6.com⟩default@spdyn.de— ⟨https://spdyn.de⟩default@strato.com— ⟨https://www.strato.com⟩default@cloudxns.net— ⟨https://www.cloudxns.net⟩dyndns@3322.org— ⟨https://www.3322.org⟩default@dnspod.cn— ⟨https://www.dnspod.cn⟩default@dynu.com— ⟨https://www.dynu.com⟩default@selfhost.de— ⟨https://www.selfhost.de⟩default@pdd.yandex.ru— ⟨https://connect.yandex.ru⟩default@cloudflare.com— ⟨https://www.cloudflare.com⟩ 🔥default@goip.de— ⟨https://www.goip.de⟩
🎀 custom some@identifier {}
Okay bestie, this is the build-your-own-provider era. The things that are specific to the custom provider section are these settings right here 👇
ddns-server = update.example.com— the DDNS server name. Not the full URL, bestie, just the name — don't be out here pasting whole URLs, it's giving wrong vibe. 💅ddns-path = /update?domain=— the DDNS server path. By default the hostname gets appended to the path, unlessappend-myip=trueis set. Alternatively,printf(3)-like format specifiers can be used to build a fully customizable HTTP GET update request. These are the format specifiers that are currently supported:%u— username%p— password, if HTTP basic auth is not used%h— hostname%i— IP address
So take this example, right:
username = myuser
password = mypass
ddns-path = "/update?user=%u&password=%p&domain=%h&myip=%i"
hostname = YOURDOMAIN.TLD
and the resulting update URL would be expanded to:
/update?user=myuser&password=mypass&domain=YOURDOMAIN.TLD&myip=1.2.3.4
✨ slay, it works. But — and this is the serious bit, no cap 😭 — the password is usually never sent in clear text in the HTTP GET URL. Most DDNS providers instead rely on HTTP basic auth., which inadyn always relays to the server in the HTTP header of update requests. inadyn.conf v2.1 and later defaults to HTTPS to protect your credentials, but some providers still do not support HTTPS. 🫶
append-myip = true— appends your current IP to the DDNS server update path. By default this setting isfalseand the hostname is what gets appended instead. Unless theddns-pathis given with format specifiers, in which case this setting is unused. 🦋
✨ EXAMPLES ✨
okay so this is where inadyn really shows off its fits 💅 the first thing to clock is that two different user accounts can absolutely use the same DDNS provider, No-IP.com, by using the concept of instances :N — yes bestie, :1, :2, etc. it’s giving “same app, different profiles” energy 🎀
period = 300
# Dyn.com
provider dyndns.org {
username = account1
password = secret1
hostname = { "my.example.com", "other.example.org" }
}
# FreeDNS. Remember the username must be in lower case
# and password (max 16 chars) is case sensitive.
provider freedns {
username = lower-case-username
password = case-sensitive-pwd
hostname = some.example.com
}
# No-IP.com #1
# With multiple usernames at the same provider, index with :#
provider no-ip.com:1 {
checkip-server = "dynamic.zoneedit.com"
checkip-path = "/checkip.html"
checkip-ssl = false
username = account21
password = secret21
hostname = example.no-ip.com
}
# No-IP.com #2
provider no-ip.com:2 {
username = account22
password = secret22
hostname = another.no-ip.com
}
# Google Domains - notice use of '@' to update root entry
provider domains.google.com:1 {
hostname = @.mydomain.com
username = your_username
password = your_password
}
# Wildcard subdomains - notice the quoutes (required!)
provider domains.google.com:2 {
hostname = "*.mydomain.com"
username = your_username
password = your_password
}
# Loopia
provider loopia.com {
wildcard = true
username = account3
password = secret3
hostname = example.com
}
# ddnss.de
provider ddnss.de {
username = your_username
password = your_password
hostname = your_host.ddnss.de
}
# spdyn.de
provider spdyn.de {
username = your_username
password = your_password
hostname = your_host.spdyn.de
}
# www.strato.com
provider strato.com {
username = your_username
password = your_password
hostname = example.com
}
# dynv6.com update using a custom checkip-command, which works
# if you have access to an Internet-connected interface. Make
# sure to verify the command works on your system first
allow-ipv6 = true # required option for IPv6 atm.
provider default@dynv6.com {
username = your_token
password = not_used
hostname = { my.dynv6.net } # second host with comma
checkip-command = "/sbin/ip -6 addr | grep inet6 | awk -F '[ ]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80"
}
# IPv6 account at https://tunnelbroker.net
provider tunnelbroker.net {
username = xyzzy
password = update-key-in-advanced-tab
hostname = tunnel-id
}
# www.freemyip.com
provider freemyip.com {
password = your_token
hostname = your_hostname.freemyip.com
}
# www.cloudxns.net
provider cloudxns.net {
username = your_api_key
password = your_secret_key
hostname = yourhost.example.com
}
# www.dnspod.cn
provider dnspod.cn {
username = your_api_id
password = your_api_token
hostname = yourhost.example.com
}
# www.cloudflare.com #1
provider cloudflare.com {
username = zone.name
password = api_token # Create a unique custom api token with the following permissions: Zone.Zone - Read, Zone.DNS - Edit.
hostname = hostname.zone.name
ttl = 1 # optional, value of 1 is 'automatic'.
proxied = false # optional.
}
# www.cloudflare.com #2
provider cloudflare.com {
username = zone.name
password = api_token # Create a unique custom api token with the following permissions: Zone.Zone - Read, Zone.DNS - Edit.
hostname = fc9f4f7feb9f9ff8710c2b4f3fb6b5a0 # The Cloudflare identifier of this dns record. Useful when updating round-robin DNS entries.
ttl = 1 # optional, value of 1 is 'automatic'.
proxied = false # optional.
}
# www.goip.de
provider goip.de {
username = username
password = password
hostname = hostname.goip.de
}
# www.namecheap.com
custom namecheap {
username = YOURDOMAIN.TLD
password = mypass
ddns-server = dynamicdns.park-your-domain.com
ddns-path = "/update?domain=%u&password=%p&host=%h"
hostname = { "@", "www", "test" }
}
# Generic example, check all details for your provider!
custom example {
username = myuser
password = mypass
checkip-server = checkip.example.com
checkip-path = /
checkip-ssl = false
ddns-server = update.example.com
ddns-path = "/update?hostname="
hostname = myhostname.example.net
}
the comments in there are not just decoration — they’re the lore 🫶 FreeDNS bestie, remember: username in lower case, and the password (max 16 chars) is case sensitive. Google Domains? that @ is how you update the root entry, and wildcard subdomains need the quotes — required! (yes, the original says “quoutes”, we’re keeping the typo and the drama 😭).
As of Inadyn 1.99.14 the generic plugin can also be used with providers that require the client’s IP in the update request, which for example ⟨https://dyn.com⟩ requires:
# This emulates dyndns.org
custom dyn.com {
username = DYNUSERNAME
password = DYNPASSWORD
ddns-server = members.dyndns.org
ddns-path = "/nic/update?hostname=YOURHOST.dyndns.org&myip="
append-myip = true
hostname = YOURHOST
}
Notice the use of append-myip, which differs from the previous examples above. Without this option set, the default — and yes, it’s backwards compatible — behavior is to append the hostname. lowkey iconic that it still respects the old way 💖
An alternative, and perhaps more intuitive approach introduced in Inadyn v2.0, is to use the printf(3) like format specifiers mentioned previously. The same example looks like this:
# This emulates dyndns.org
custom dyn.com {
ssl = false
username = DYNUSERNAME
password = DYNPASSWORD
ddns-server = members.dyndns.org
ddns-path = "/nic/update?hostname=%h.dyndns.org&myip=%i"
hostname = YOURHOST
}
🌈 SEE ALSO 🌈
The inadyn home page is ⟨https://github.com/troglobit/inadyn⟩ — go say hi to the repo bestie, it’s right there 🦋
👑 AUTHORS 👑
This manual page was initially written for the Debian GNU/Linux system by Shaul Karl shaul@debian.org. Currently maintained by Joachim Wiberg troglobit@gmail.com. absolute legends, no cap 👏
okay that’s the whole INADYN(5) page, bestie — it’s from Debian and dated February 20, 2020. mwah 💋
📦 where this page comes from
- alpine 3.24: inadyn-doc 2.13.0-r0 · GPL-2.0-or-later
- nixos 26.05: inadyn 2.13.0
- nixpkgs unstable: inadyn 2.13.0
- Copyright 2005, by Shaul Karl
- Copyright 2010-2020, by Joachim Wiberg
- 💖 girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms