Skip to main content

🌐 Setting Up Dynamic DNS for Home Networks

Introduction​

This guide walks you through setting up Dynamic DNS (DDNS) for your home network. Most home internet connections have dynamic IP addresses that change periodically, making it difficult to access your home services remotely. Dynamic DNS solves this by:

  1. Providing a stable domain name that always points to your current IP
  2. Automatically updating DNS records when your IP changes
  3. Enabling remote access to your home services (VPN, NAS, cameras, etc.)
  4. Eliminating the need to constantly check your current IP address

We'll cover multiple DDNS providers and setup methods to find the best solution for your needs.

Prerequisites​

  • Home router with internet connection
  • Basic understanding of networking concepts
  • Access to router administration panel
  • Email address for DDNS account registration

1. Choose a Dynamic DNS Provider​

Free Options:​

  • No-IP - 3 free hostnames, 30-day confirmation required
  • DuckDNS - Unlimited subdomains, no confirmation needed
  • Cloudflare - Free tier with full DNS management
  • FreeDNS (afraid.org) - Multiple domain options
  • No-IP Plus - $24.95/year, no confirmation needed
  • DynDNS - $55/year, enterprise features
  • Namecheap - $4.88/year with domain purchase

We'll use DuckDNS as it's completely free, reliable, and doesn't require periodic confirmation.

2. Setting Up DuckDNS Account​

Create Your Account​

  1. Visit duckdns.org
  2. Sign in with Google, GitHub, or create an account
  3. Choose your subdomain (e.g., myhomelab.duckdns.org)
  4. Note your token - you'll need this for updates

Get Your Current IP​

DuckDNS will automatically detect and set your current public IP address.

3. Router-Based DDNS Setup​

Most modern routers support DDNS natively. This is the easiest method.

Access Router Settings​

  1. Open your router's admin panel (usually 192.168.1.1 or 192.168.0.1)
  2. Login with admin credentials
  3. Navigate to Dynamic DNS or DDNS section

Common Router Interfaces:​

For ASUS routers:

  • Go to Advanced Settings → WAN → DDNS
  • Enable DDNS Client: Yes
  • Server: Custom
  • Host Name: yourdomain.duckdns.org
  • Username: nouser
  • Password: your_duckdns_token

For TP-Link routers:

  • Go to Dynamic DNS
  • Service Provider: No-IP or Custom
  • Domain Name: yourdomain.duckdns.org
  • Username: nouser
  • Password: your_duckdns_token

For Netgear routers:

  • Go to Dynamic DNS
  • Use Dynamic DNS Service: Yes
  • Service Provider: No-IP.com or Custom
  • Host Name: yourdomain.duckdns.org
  • Username: nouser
  • Password: your_duckdns_token

4. Server-Based DDNS Setup​

If your router doesn't support DDNS or you prefer server-side control, set up a DDNS client on your server.

Install DDNS Client​

For DuckDNS:

sudo apt update
sudo apt install -y curl

Create Update Script​

sudo mkdir -p /etc/ddns
sudo nano /etc/ddns/duckdns-update.sh

Add the following content:

#!/bin/bash
# DuckDNS Update Script

DOMAIN="yourdomain"
TOKEN="your_duckdns_token"

# Update IP address
curl -s "https://www.duckdns.org/update?domains=${DOMAIN}&token=${TOKEN}&ip=" > /dev/null

# Log the update
echo "$(date): DuckDNS updated for ${DOMAIN}.duckdns.org" >> /var/log/ddns-update.log

Make it executable:

sudo chmod +x /etc/ddns/duckdns-update.sh

Test the Script​

sudo /etc/ddns/duckdns-update.sh

Check if your domain resolves:

nslookup yourdomain.duckdns.org

5. Automate Updates with Cron​

Set up automatic updates every 5 minutes:

sudo crontab -e

Add this line:

*/5 * * * * /etc/ddns/duckdns-update.sh

6. Alternative: Cloudflare DDNS​

For those using Cloudflare, here's a more advanced setup:

Install Dependencies​

sudo apt install -y curl jq

Create Cloudflare Update Script​

sudo nano /etc/ddns/cloudflare-update.sh
#!/bin/bash
# Cloudflare DDNS Update Script

ZONE_ID="your_zone_id"
RECORD_NAME="home.yourdomain.com"
API_TOKEN="your_cloudflare_api_token"

# Get current public IP
CURRENT_IP=$(curl -s http://checkip.amazonaws.com)

# Get DNS record IP
DNS_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?name=${RECORD_NAME}" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" | jq -r '.result[0].content')

# Update if different
if [ "$CURRENT_IP" != "$DNS_IP" ]; then
RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?name=${RECORD_NAME}" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" | jq -r '.result[0].id')

curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"${RECORD_NAME}\",\"content\":\"${CURRENT_IP}\"}"

echo "$(date): IP updated from ${DNS_IP} to ${CURRENT_IP}" >> /var/log/cloudflare-ddns.log
fi

7. Test Your Setup​

Check DNS Resolution​

nslookup yourdomain.duckdns.org
dig yourdomain.duckdns.org

Test from External Network​

Use your mobile data or ask a friend to test:

ping yourdomain.duckdns.org

Monitor Logs​

sudo tail -f /var/log/ddns-update.log

8. Security Considerations​

Use HTTPS When Possible​

Always use HTTPS URLs for DDNS updates to protect your tokens.

Secure Your Tokens​

# Set proper permissions on scripts
sudo chmod 700 /etc/ddns/
sudo chmod 600 /etc/ddns/*.sh

Regular Token Rotation​

Rotate your DDNS tokens periodically:

  1. Generate new token from provider
  2. Update scripts with new token
  3. Test the update

9. Troubleshooting​

Common Issues​

Domain not resolving:

  • Check your DDNS token/credentials
  • Verify internet connectivity
  • Test manual update script

Router DDNS not working:

  • Try server-based setup instead
  • Check router firmware updates
  • Verify provider compatibility

IP not updating:

  • Check cron job is running: sudo crontab -l
  • Review update logs: sudo tail /var/log/ddns-update.log
  • Test script manually

Debug Commands​

# Check current public IP
curl -s http://checkip.amazonaws.com

# Test DNS resolution
nslookup yourdomain.duckdns.org 8.8.8.8

# Check cron jobs
sudo crontab -l

# Monitor real-time logs
sudo tail -f /var/log/ddns-update.log

10. Advanced Configuration​

Multiple Domains​

You can update multiple domains in one script:

#!/bin/bash
DOMAINS="domain1,domain2,domain3"
TOKEN="your_token"
curl -s "https://www.duckdns.org/update?domains=${DOMAINS}&token=${TOKEN}&ip="

Webhook Notifications​

Get notified when IP changes:

# Add to your update script
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
curl -s -X POST "https://hooks.slack.com/your-webhook-url" \
-H "Content-Type: application/json" \
-d "{\"text\":\"Home IP changed to: $CURRENT_IP\"}"
fi

Backup DNS Providers​

Use multiple providers for redundancy:

# Update both DuckDNS and No-IP
curl -s "https://www.duckdns.org/update?domains=yourdomain&token=duckdns_token"
curl -s "https://dynupdate.no-ip.com/nic/update?hostname=yourdomain.ddns.net" \
--user "username:password"

Conclusion​

You now have a reliable Dynamic DNS setup that will keep your home network accessible even when your IP address changes. Key benefits:

  • Consistent access to your home services
  • Automatic updates when IP changes
  • Multiple provider options for redundancy
  • Easy integration with other home services

Your dynamic DNS setup is now ready to be used with VPN servers, web services, security cameras, and any other home network services you want to access remotely.

Next up: Use your new dynamic DNS domain in your VPN server setup for seamless remote access! 🏠➡️🌐