Self-hosted dynamic DNS php-based Docker container to update netcup DNS API from consumer routers etc.
- Felix Kretschmer @fernwerker
- Philipp Tempel @philipptempel
- Branko Wilhelm @b2un0
- Nils Blume @niiwiicamo
This docker image only provides a basic http server as default. You should never expose this to the internet! Use a reverse proxy or run everything locally.
Take a look at docker-compose.yaml for inspiration.
env | description |
---|---|
DDNS_USER DDNS_PASS |
The username and password that the DynDNS client (e.g. your router) uses to authenticate to this container |
NETCUP_APIKEY NETCUP_APIPASS NETCUP_CUSTOMERID |
Your netcup credentials so this container can authorize against netcup |
env | default | description |
---|---|---|
DDNS_DEBUG | 0 | Includes debug information in the web response |
DDNS_LOG | 1 | Creates a json log file |
DDNS_LOGFILE | log.json | Log file location, relative to webroot |
DDNS_RETURNIP | 1 | Returns the updated DNS record (IPv4, IPv6, TXT) |
DDNS_ALLOWCREATE | 0 | Allows for a new DNS entry to be created and set instead of only updating existing |
DDNS_RESTRICTDOMAIN | 0 | Allows you to override the DNS entry to be updated |
DDNS_FORCEDDOMAIN | "" | When DDNS_RESTRICTDOMAIN is set, enter the registered domain name (e.g. example.com) |
DDNS_FORCEDHOST | "" | When DDNS_RESTRICTDOMAIN is set, enter the DNS entry host name (e.g. _acme-challenge.test.home) |
You must include: user, password, domain and one of ipv4, ipv6 and txt
parameter | example | description |
---|---|---|
user | dnsupdater | The DDNS_USER |
password | secretpleasechange | The DDNS_PASS |
domain | a) home.example.com b) example.com c) example.com |
a) The FQDN to update b) The registered domain only, for multi part host names c) The domain if you want to update the @ or * record |
host | nas.home | optional; case b) If your domain contains more than 3 levels, e.g. "nas.home.example.com" |
ipv4 | 1.2.3.4 | the ipv4 address to update a A record |
ipv6 | fe80::12:34:56 | the ipv6 address to update a AAAA record |
txt | acme-challenge-text | the content to update a TXT record |
force | true | optional; ignore checking if the record needs to be updated, just do it anyways. Default: false |
mode | * | optional; case c) If domain is your registered domain "example.com". Possible values: * or both . Default: @ |
create | true | optional; create all entries if none exist. e.g. will not create A if AAAA exists. Needs DDNS_ALLOWCREATE=1 |
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=home.example.com
&ipv4=IPv4
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=example.com
&ipv6=IPv6
&force=true
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=home.example.com
&ipv4=IPv4
&ipv6=IPv6
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=_acme-challenge.example.com
&txt=textcontent
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=example.com
&host=nas.home
&ipv4=IPv4
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=example.com
&mode=*
https://dyndns.example.com
/update.php?user=username
&password=password
&domain=new.example.com
&ipv4=IPv4
&txt=textcontent
&create=true
- Go to "Internet" -> "Freigaben" -> "DynDNS"
- Choose "Benutzerdefiniert"
- Update-URL:
https://<url of your webspace>/update.php?user=<username>&password=<pass>&ipv4=<ipaddr>&ipv6=<ip6addr>&domain=<domain>
- only the url needs to be adjusted, the rest is automatically filled by your AVM FRITZ!Box
- http or https is possible if valid SSL certificate (e.g. Let's Encrypt)
- Single Domain:
- Domainname:
<host record that is supposed to be updated>
- Domainname:
- Multiple Domains:
- Domainname:
<first host record that is supposed to be updated>,<second host record that is supposed to be updated>,....
- Domainname:
- Username:
<DDNS_USER>
- Password:
<DDNS_PASS>
- Go to "Control Panel" -> "External Access" -> "DDNS"
- Click on "Customize Provider" to create a profile for your own DDNS server
- Service Provider: This is the display name of your custom provider
- Update-URL:
https://<url of your webspace>/update.php?user=__USERNAME__&password=__PASSWORD__&ipv4=__MYIP__&domain=__HOSTNAME__
- Attention: The variables are delimited by two underscores
- Currently Synology custom DDNS does not support IPv6, for whatever reason.
- Save your custom provider
- Click on "Add" to create a DDNS job
- Select your custom provider. Notice that an asterisk [*] has appeared in front of the name to signify that this is a custom provider.
- Hostname:
<host record that is supposed to be updated>
- Username/Email:
<DDNS_USER>
- Password/Key:
<DDNS_PASS>
- External Address (IPv4): probably "Auto", uses Synology service to find own external IP
- External Address (IPv6): doesn't matter, currently not supported by Synology
- Go to "Services" -> "Dynamic DNS"
- Click on "Add" to create a DDNS profile
- Service Type: "Custom"
- Interface to monitor:
<select you WAN interface>
- Interface to send update from:
<select your WAN interface>
- Update URL:
https://<url of your webspace>/update.php?user=<DDNS_USER>&password=<DDNS_PASS>&ipv4=%IP%&domain=<host record to update>
- Leave all other fields empty / default
- see examples
- DNS API Documentation: https://ccp.netcup.net/run/webservice/servers/endpoint.php
- Source of dnsapi.php: https://ccp.netcup.net/run/webservice/servers/endpoint.php?PHPSOAPCLIENT
Published under GNU General Public License v3.0
Original: © Felix Kretschmer, 2021