Situatie
DDNS is a service that automatically updates your DNS records whenever your public IP address changes. It ensures that your chosen domain name always points to your current public IP address, even if it’s dynamic.
You need it if you want to acces your home LAN from outside, most ISPs provide you with a dynamic IP (and IP that changes periodically). That means that everytime your home’s IP it’s changed, you need to find your new IP, manually change every DNS entry. You can get a permanent static IP from your provider, but that comes with an extra-cost.
We don’t want that.
Cloudflare provide us with their awesome free plan.
All we need is a domain, they don’t accept some very specific “free” TLDs that are historically associated with high abuse rates (e.g.,
.tk
, .ml
, .ga
, .cf
, .gq
). A bought domain could be a few dollars a year, way less expensive that a static IP and more useful (DDNS is just one of the free benefits provided by Cloudflare).1. Generate token in My profile → API Tokens → Create Token
with Zone.DNS
permission for selected DNS zone.*
Note that it is not possible to select only one subdomain and token will have permission to change all DNS entries.
2. Use the following script to update DNS entry automatically on your server and save it as /usr/local/bin/ddns
:
#!/bin/bash
# Check for current external IP
IP=`dig +short txt ch whoami.cloudflare @1.0.0.1| tr -d '"'`
# Set Cloudflare API
URL="https://api.cloudflare.com/client/v4/zones/DNS_ZONE_ID/dns_records/DNS_ENTRY_ID"
TOKEN="YOUR_TOKEN_HERE"
NAME="DNS_ENTRY_NAME"
# Connect to Cloudflare
cf() {
curl -X ${1} "${URL}" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
${2} ${3}
}
# Get current DNS data
RESULT=$(cf GET)
IP_CF=$(jq -r '.result.content' <<< ${RESULT})
# Compare IPs
if [ "$IP" = "$IP_CF" ]; then
echo "No change."
else
RESULT=$(cf PUT --data "{\"type\":\"A\",\"name\":\"${NAME}\",\"content\":\"${IP}\"}")
echo "DNS updated."
fi
3. Add script to crontab, so it will be executed every minute:
# crontab -e
* * * * * /usr/local/bin/ddns > /dev/null 2>&1
Leave A Comment?