Configure Dynamic DNS Updater #45

Open
opened 2025-09-14 08:10:49 +00:00 by tonym · 0 comments
Owner

Dynamic DNS Updater Configuration Guide

Overview

Dynamic DNS (DDNS) automatically updates DNS records when your public IP address changes, essential for accessing your home server from outside your network when using dynamic IP addresses from ISPs.


Container Installation

Docker Run Command (DDClient)

docker run -d \
  --name=ddclient \
  --restart=unless-stopped \
  -e PUID=99 \
  -e PGID=100 \
  -e TZ=America/Chicago \
  -v /mnt/user/appdata/ddclient:/config \
  linuxserver/ddclient:latest

Docker Compose (DDClient)

version: "3.8"
services:
  ddclient:
    image: linuxserver/ddclient:latest
    container_name: ddclient
    restart: unless-stopped
    environment:
      - PUID=99
      - PGID=100
      - TZ=America/Chicago
    volumes:
      - /mnt/user/appdata/ddclient:/config

Alternative: Duck DNS

version: "3.8"
services:
  duckdns:
    image: linuxserver/duckdns:latest
    container_name: duckdns
    restart: unless-stopped
    environment:
      - PUID=99
      - PGID=100
      - TZ=America/Chicago
      - SUBDOMAINS=yoursubdomain
      - TOKEN=your-duckdns-token
      - LOG_FILE=false
    volumes:
      - /mnt/user/appdata/duckdns:/config

Container Configuration

Volume Mounts

  • /mnt/user/appdata/ddclient:/config: Configuration and logs
  • /mnt/user/appdata/duckdns:/config: Duck DNS configuration

Environment Variables

  • PUID=99: User ID (nobody)
  • PGID=100: Group ID (users)
  • TZ: Timezone setting
  • SUBDOMAINS: Duck DNS subdomain(s)
  • TOKEN: Duck DNS token

Initial Configuration

DDClient Configuration

Create /mnt/user/appdata/ddclient/ddclient.conf:

Cloudflare Configuration

# Cloudflare DDNS Configuration
protocol=cloudflare
use=web
login=your-email@domain.com
password=your-global-api-key
zone=yourdomain.com
home.yourdomain.com
nas.yourdomain.com
*.yourdomain.com

Google Domains Configuration

# Google Domains DDNS
protocol=googledomains
login=your-username
password=your-password
yourdomain.com

No-IP Configuration

# No-IP DDNS
protocol=noip
login=your-username
password=your-password
yourhost.ddns.net

Namecheap Configuration

# Namecheap DDNS
protocol=namecheap
server=dynamicdns.park-your-domain.com
login=yourdomain.com
password=your-ddns-password
home,nas,*

Duck DNS Configuration

  1. Register at DuckDNS.org:

    • Create account
    • Choose subdomain (e.g., yourname.duckdns.org)
    • Get token
  2. Set Environment Variables:

    environment:
      - SUBDOMAINS=yourname
      - TOKEN=your-token-here
    

Service Configuration

Advanced DDClient Configuration

Create /mnt/user/appdata/ddclient/ddclient.conf:

# Global settings
daemon=300                    # Check every 5 minutes
syslog=yes                    # Use syslog
mail=root                     # Mail errors to root
mail-failure=root             # Mail failures to root
pid=/var/run/ddclient.pid     # PID file location
ssl=yes                       # Use SSL

# IP detection method
use=web                       # Get IP from web service
web=checkip.dyndns.org/, web-skip="IP Address"
# Alternative: use=if, if=eth0  # Get IP from interface

# Multiple providers example
# Cloudflare
protocol=cloudflare
zone=yourdomain.com
login=your-email@domain.com
password=your-api-key
home.yourdomain.com,nas.yourdomain.com

# No-IP backup
protocol=noip
login=noip-username
password=noip-password
yourbackup.ddns.net

Failover Configuration

# Primary and backup DDNS providers
# Primary: Cloudflare
protocol=cloudflare
zone=primary-domain.com
login=primary@email.com
password=primary-api-key
nas.primary-domain.com

# Backup: Duck DNS
protocol=duckdns
login=token
password=your-duckdns-token
yourname.duckdns.org

Integration Points

With Router Configuration

  1. Port Forwarding Setup:

    # Common ports to forward
    HTTP: 80 → 192.168.0.5:80
    HTTPS: 443 → 192.168.0.5:443
    SSH: 22 → 192.168.0.5:22
    Plex: 32400 → 192.168.0.5:32400
    
  2. UPnP Configuration:

    • Enable UPnP on router if available
    • Automatic port forwarding for supported apps

With Reverse Proxy

# Nginx reverse proxy configuration
server {
    listen 80;
    server_name nas.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name nas.yourdomain.com;
    
    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    
    location / {
        proxy_pass http://192.168.0.5:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

With Let's Encrypt

# Automatic SSL certificate renewal
certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /path/to/cloudflare.ini \
  -d nas.yourdomain.com \
  -d *.yourdomain.com

Monitoring & Notifications

IP Change Monitoring

#!/bin/bash
# IP change notification script
CURRENT_IP=$(curl -s checkip.dyndns.org | grep -oP "\d+\.\d+\.\d+\.\d+")
LAST_IP_FILE="/tmp/last_ip.txt"

if [ -f "$LAST_IP_FILE" ]; then
    LAST_IP=$(cat "$LAST_IP_FILE")
    if [ "$CURRENT_IP" != "$LAST_IP" ]; then
        echo "IP changed from $LAST_IP to $CURRENT_IP" | \
        mail -s "IP Address Changed" admin@yourdomain.com
    fi
fi

echo "$CURRENT_IP" > "$LAST_IP_FILE"

DDNS Status Check

#!/bin/bash
# Check if DDNS is working
DOMAIN="nas.yourdomain.com"
EXPECTED_IP=$(curl -s checkip.dyndns.org | grep -oP "\d+\.\d+\.\d+\.\d+")
ACTUAL_IP=$(dig +short $DOMAIN)

if [ "$EXPECTED_IP" != "$ACTUAL_IP" ]; then
    echo "DDNS mismatch: Expected $EXPECTED_IP, got $ACTUAL_IP" | \
    mail -s "DDNS Alert" admin@yourdomain.com
fi

Service Health Check

# Monitor DDClient container
docker logs ddclient --tail 50 | grep -i error

# Check last update time
docker exec ddclient cat /var/log/ddclient.log | tail -10

Backup Configuration

Configuration Backup

#!/bin/bash
# Backup DDNS configuration
DATE=$(date +%Y%m%d)
BACKUP_DIR="/mnt/user/backups/ddclient"

mkdir -p $BACKUP_DIR
cp -r /mnt/user/appdata/ddclient/ $BACKUP_DIR/ddclient_$DATE/
tar -czf $BACKUP_DIR/ddclient_$DATE.tar.gz -C $BACKUP_DIR ddclient_$DATE/
rm -rf $BACKUP_DIR/ddclient_$DATE/

# Keep last 30 days
find $BACKUP_DIR -name "ddclient_*.tar.gz" -mtime +30 -delete

Provider Settings Backup

# Export DNS settings (Cloudflare example)
curl -X GET "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records" \
  -H "X-Auth-Email: your-email@domain.com" \
  -H "X-Auth-Key: your-api-key" \
  -H "Content-Type: application/json" > cloudflare_dns_backup.json

Testing Procedures

Connectivity Tests

# Test external access
curl -I https://nas.yourdomain.com

# Test from different network
# Use mobile hotspot or VPN
curl -I https://nas.yourdomain.com

# DNS propagation test
dig nas.yourdomain.com
nslookup nas.yourdomain.com

DDNS Update Tests

# Force IP update (DDClient)
docker exec ddclient ddclient -daemon=0 -debug -verbose -noquiet

# Check update logs
docker logs ddclient | tail -20

# Manual Duck DNS update
curl "https://www.duckdns.org/update?domains=yourname&token=your-token&ip="

Port Forwarding Tests

# Test specific ports
telnet nas.yourdomain.com 80
telnet nas.yourdomain.com 443
telnet nas.yourdomain.com 22

# Online port checker
# Use online tools like:
# - https://www.yougetsignal.com/tools/open-ports/
# - https://portchecker.co/

Troubleshooting

Common Issues

  1. IP Not Updating:

    # Check configuration
    docker exec ddclient cat /config/ddclient.conf
    
    # Test credentials
    docker exec ddclient ddclient -query
    
  2. Authentication Errors:

    # Verify credentials
    # For Cloudflare: Test API key
    curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
      -H "Authorization: Bearer YOUR_TOKEN"
    
  3. DNS Propagation Issues:

    # Check from multiple DNS servers
    dig @8.8.8.8 nas.yourdomain.com
    dig @1.1.1.1 nas.yourdomain.com
    dig @208.67.222.222 nas.yourdomain.com
    

Log Analysis

# DDClient logs
docker logs ddclient

# System DNS logs
tail -f /var/log/syslog | grep ddclient

# Check for rate limiting
docker logs ddclient | grep -i "rate limit\|too many requests"

Network Troubleshooting

# Check router configuration
# Verify port forwarding rules
# Test UPnP status

# Check firewall rules
sudo iptables -L
sudo ufw status

# Test from internal network
curl -I http://192.168.0.5

Maintenance

Regular Updates

# Update containers
docker pull linuxserver/ddclient:latest
docker pull linuxserver/duckdns:latest

# Recreate containers
docker-compose down && docker-compose up -d

Configuration Review

# Monthly configuration check
#!/bin/bash
echo "Checking DDNS configuration..."

# Verify domains resolve correctly
for domain in nas.yourdomain.com home.yourdomain.com; do
    IP=$(dig +short $domain)
    echo "$domain resolves to $IP"
done

# Check certificate expiry
openssl s_client -connect nas.yourdomain.com:443 2>/dev/null | \
openssl x509 -noout -dates

Performance Monitoring

# Monitor update frequency
grep "updating" /mnt/user/appdata/ddclient/ddclient.log | tail -10

# Check response times
time dig nas.yourdomain.com

Security Considerations

API Key Security

# Restrict file permissions
chmod 600 /mnt/user/appdata/ddclient/ddclient.conf
chown 99:100 /mnt/user/appdata/ddclient/ddclient.conf

Network Security

  • Use strong passwords/tokens
  • Enable 2FA on DNS provider accounts
  • Regular API key rotation
  • Monitor DNS changes

Access Control

# Limit SSH access
# /etc/ssh/sshd_config
AllowUsers admin
Port 2222
PasswordAuthentication no
PubkeyAuthentication yes

Advanced Configuration

Multiple Domain Providers

# /config/ddclient.conf
# Primary domain (Cloudflare)
protocol=cloudflare
zone=primary.com
login=email@primary.com
password=cf-api-key
nas.primary.com

# Backup domain (Duck DNS)
protocol=duckdns
login=token
password=duckdns-token
backup.duckdns.org

# Work domain (Google)
protocol=googledomains
login=google-username
password=google-password
work.example.com

IPv6 Support

# IPv6 configuration
usev6=webv6
webv6=checkipv6.dyndns.org/, webv6-skip="IP Address"
protocol=cloudflare
login=your-email
password=your-key
nas-ipv6.yourdomain.com

Custom Update Scripts

#!/bin/bash
# Custom DDNS update with webhook
CURRENT_IP=$(curl -s checkip.dyndns.org | grep -oP "\d+\.\d+\.\d+\.\d+")

# Update Cloudflare
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"type\":\"A\",\"name\":\"nas\",\"content\":\"$CURRENT_IP\"}"

# Send notification
curl -X POST "https://hooks.slack.com/your/webhook/url" \
  -d "{\"text\":\"IP updated to $CURRENT_IP\"}"

This guide provides comprehensive coverage of Dynamic DNS configuration for maintaining remote access to your home server.

# Dynamic DNS Updater Configuration Guide ## Overview Dynamic DNS (DDNS) automatically updates DNS records when your public IP address changes, essential for accessing your home server from outside your network when using dynamic IP addresses from ISPs. --- ## Container Installation ### Docker Run Command (DDClient) ```bash docker run -d \ --name=ddclient \ --restart=unless-stopped \ -e PUID=99 \ -e PGID=100 \ -e TZ=America/Chicago \ -v /mnt/user/appdata/ddclient:/config \ linuxserver/ddclient:latest ``` ### Docker Compose (DDClient) ```yaml version: "3.8" services: ddclient: image: linuxserver/ddclient:latest container_name: ddclient restart: unless-stopped environment: - PUID=99 - PGID=100 - TZ=America/Chicago volumes: - /mnt/user/appdata/ddclient:/config ``` ### Alternative: Duck DNS ```yaml version: "3.8" services: duckdns: image: linuxserver/duckdns:latest container_name: duckdns restart: unless-stopped environment: - PUID=99 - PGID=100 - TZ=America/Chicago - SUBDOMAINS=yoursubdomain - TOKEN=your-duckdns-token - LOG_FILE=false volumes: - /mnt/user/appdata/duckdns:/config ``` --- ## Container Configuration ### Volume Mounts - `/mnt/user/appdata/ddclient:/config`: Configuration and logs - `/mnt/user/appdata/duckdns:/config`: Duck DNS configuration ### Environment Variables - `PUID=99`: User ID (nobody) - `PGID=100`: Group ID (users) - `TZ`: Timezone setting - `SUBDOMAINS`: Duck DNS subdomain(s) - `TOKEN`: Duck DNS token --- ## Initial Configuration ### DDClient Configuration Create `/mnt/user/appdata/ddclient/ddclient.conf`: #### Cloudflare Configuration ```bash # Cloudflare DDNS Configuration protocol=cloudflare use=web login=your-email@domain.com password=your-global-api-key zone=yourdomain.com home.yourdomain.com nas.yourdomain.com *.yourdomain.com ``` #### Google Domains Configuration ```bash # Google Domains DDNS protocol=googledomains login=your-username password=your-password yourdomain.com ``` #### No-IP Configuration ```bash # No-IP DDNS protocol=noip login=your-username password=your-password yourhost.ddns.net ``` #### Namecheap Configuration ```bash # Namecheap DDNS protocol=namecheap server=dynamicdns.park-your-domain.com login=yourdomain.com password=your-ddns-password home,nas,* ``` ### Duck DNS Configuration 1. **Register at DuckDNS.org**: - Create account - Choose subdomain (e.g., yourname.duckdns.org) - Get token 2. **Set Environment Variables**: ```yaml environment: - SUBDOMAINS=yourname - TOKEN=your-token-here ``` --- ## Service Configuration ### Advanced DDClient Configuration Create `/mnt/user/appdata/ddclient/ddclient.conf`: ```bash # Global settings daemon=300 # Check every 5 minutes syslog=yes # Use syslog mail=root # Mail errors to root mail-failure=root # Mail failures to root pid=/var/run/ddclient.pid # PID file location ssl=yes # Use SSL # IP detection method use=web # Get IP from web service web=checkip.dyndns.org/, web-skip="IP Address" # Alternative: use=if, if=eth0 # Get IP from interface # Multiple providers example # Cloudflare protocol=cloudflare zone=yourdomain.com login=your-email@domain.com password=your-api-key home.yourdomain.com,nas.yourdomain.com # No-IP backup protocol=noip login=noip-username password=noip-password yourbackup.ddns.net ``` ### Failover Configuration ```bash # Primary and backup DDNS providers # Primary: Cloudflare protocol=cloudflare zone=primary-domain.com login=primary@email.com password=primary-api-key nas.primary-domain.com # Backup: Duck DNS protocol=duckdns login=token password=your-duckdns-token yourname.duckdns.org ``` --- ## Integration Points ### With Router Configuration 1. **Port Forwarding Setup**: ```bash # Common ports to forward HTTP: 80 → 192.168.0.5:80 HTTPS: 443 → 192.168.0.5:443 SSH: 22 → 192.168.0.5:22 Plex: 32400 → 192.168.0.5:32400 ``` 2. **UPnP Configuration**: - Enable UPnP on router if available - Automatic port forwarding for supported apps ### With Reverse Proxy ```nginx # Nginx reverse proxy configuration server { listen 80; server_name nas.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name nas.yourdomain.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; location / { proxy_pass http://192.168.0.5:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` ### With Let's Encrypt ```bash # Automatic SSL certificate renewal certbot certonly --dns-cloudflare \ --dns-cloudflare-credentials /path/to/cloudflare.ini \ -d nas.yourdomain.com \ -d *.yourdomain.com ``` --- ## Monitoring & Notifications ### IP Change Monitoring ```bash #!/bin/bash # IP change notification script CURRENT_IP=$(curl -s checkip.dyndns.org | grep -oP "\d+\.\d+\.\d+\.\d+") LAST_IP_FILE="/tmp/last_ip.txt" if [ -f "$LAST_IP_FILE" ]; then LAST_IP=$(cat "$LAST_IP_FILE") if [ "$CURRENT_IP" != "$LAST_IP" ]; then echo "IP changed from $LAST_IP to $CURRENT_IP" | \ mail -s "IP Address Changed" admin@yourdomain.com fi fi echo "$CURRENT_IP" > "$LAST_IP_FILE" ``` ### DDNS Status Check ```bash #!/bin/bash # Check if DDNS is working DOMAIN="nas.yourdomain.com" EXPECTED_IP=$(curl -s checkip.dyndns.org | grep -oP "\d+\.\d+\.\d+\.\d+") ACTUAL_IP=$(dig +short $DOMAIN) if [ "$EXPECTED_IP" != "$ACTUAL_IP" ]; then echo "DDNS mismatch: Expected $EXPECTED_IP, got $ACTUAL_IP" | \ mail -s "DDNS Alert" admin@yourdomain.com fi ``` ### Service Health Check ```bash # Monitor DDClient container docker logs ddclient --tail 50 | grep -i error # Check last update time docker exec ddclient cat /var/log/ddclient.log | tail -10 ``` --- ## Backup Configuration ### Configuration Backup ```bash #!/bin/bash # Backup DDNS configuration DATE=$(date +%Y%m%d) BACKUP_DIR="/mnt/user/backups/ddclient" mkdir -p $BACKUP_DIR cp -r /mnt/user/appdata/ddclient/ $BACKUP_DIR/ddclient_$DATE/ tar -czf $BACKUP_DIR/ddclient_$DATE.tar.gz -C $BACKUP_DIR ddclient_$DATE/ rm -rf $BACKUP_DIR/ddclient_$DATE/ # Keep last 30 days find $BACKUP_DIR -name "ddclient_*.tar.gz" -mtime +30 -delete ``` ### Provider Settings Backup ```bash # Export DNS settings (Cloudflare example) curl -X GET "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records" \ -H "X-Auth-Email: your-email@domain.com" \ -H "X-Auth-Key: your-api-key" \ -H "Content-Type: application/json" > cloudflare_dns_backup.json ``` --- ## Testing Procedures ### Connectivity Tests ```bash # Test external access curl -I https://nas.yourdomain.com # Test from different network # Use mobile hotspot or VPN curl -I https://nas.yourdomain.com # DNS propagation test dig nas.yourdomain.com nslookup nas.yourdomain.com ``` ### DDNS Update Tests ```bash # Force IP update (DDClient) docker exec ddclient ddclient -daemon=0 -debug -verbose -noquiet # Check update logs docker logs ddclient | tail -20 # Manual Duck DNS update curl "https://www.duckdns.org/update?domains=yourname&token=your-token&ip=" ``` ### Port Forwarding Tests ```bash # Test specific ports telnet nas.yourdomain.com 80 telnet nas.yourdomain.com 443 telnet nas.yourdomain.com 22 # Online port checker # Use online tools like: # - https://www.yougetsignal.com/tools/open-ports/ # - https://portchecker.co/ ``` --- ## Troubleshooting ### Common Issues 1. **IP Not Updating**: ```bash # Check configuration docker exec ddclient cat /config/ddclient.conf # Test credentials docker exec ddclient ddclient -query ``` 2. **Authentication Errors**: ```bash # Verify credentials # For Cloudflare: Test API key curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer YOUR_TOKEN" ``` 3. **DNS Propagation Issues**: ```bash # Check from multiple DNS servers dig @8.8.8.8 nas.yourdomain.com dig @1.1.1.1 nas.yourdomain.com dig @208.67.222.222 nas.yourdomain.com ``` ### Log Analysis ```bash # DDClient logs docker logs ddclient # System DNS logs tail -f /var/log/syslog | grep ddclient # Check for rate limiting docker logs ddclient | grep -i "rate limit\|too many requests" ``` ### Network Troubleshooting ```bash # Check router configuration # Verify port forwarding rules # Test UPnP status # Check firewall rules sudo iptables -L sudo ufw status # Test from internal network curl -I http://192.168.0.5 ``` --- ## Maintenance ### Regular Updates ```bash # Update containers docker pull linuxserver/ddclient:latest docker pull linuxserver/duckdns:latest # Recreate containers docker-compose down && docker-compose up -d ``` ### Configuration Review ```bash # Monthly configuration check #!/bin/bash echo "Checking DDNS configuration..." # Verify domains resolve correctly for domain in nas.yourdomain.com home.yourdomain.com; do IP=$(dig +short $domain) echo "$domain resolves to $IP" done # Check certificate expiry openssl s_client -connect nas.yourdomain.com:443 2>/dev/null | \ openssl x509 -noout -dates ``` ### Performance Monitoring ```bash # Monitor update frequency grep "updating" /mnt/user/appdata/ddclient/ddclient.log | tail -10 # Check response times time dig nas.yourdomain.com ``` --- ## Security Considerations ### API Key Security ```bash # Restrict file permissions chmod 600 /mnt/user/appdata/ddclient/ddclient.conf chown 99:100 /mnt/user/appdata/ddclient/ddclient.conf ``` ### Network Security - Use strong passwords/tokens - Enable 2FA on DNS provider accounts - Regular API key rotation - Monitor DNS changes ### Access Control ```bash # Limit SSH access # /etc/ssh/sshd_config AllowUsers admin Port 2222 PasswordAuthentication no PubkeyAuthentication yes ``` --- ## Advanced Configuration ### Multiple Domain Providers ```bash # /config/ddclient.conf # Primary domain (Cloudflare) protocol=cloudflare zone=primary.com login=email@primary.com password=cf-api-key nas.primary.com # Backup domain (Duck DNS) protocol=duckdns login=token password=duckdns-token backup.duckdns.org # Work domain (Google) protocol=googledomains login=google-username password=google-password work.example.com ``` ### IPv6 Support ```bash # IPv6 configuration usev6=webv6 webv6=checkipv6.dyndns.org/, webv6-skip="IP Address" protocol=cloudflare login=your-email password=your-key nas-ipv6.yourdomain.com ``` ### Custom Update Scripts ```bash #!/bin/bash # Custom DDNS update with webhook CURRENT_IP=$(curl -s checkip.dyndns.org | grep -oP "\d+\.\d+\.\d+\.\d+") # Update Cloudflare curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \ -H "X-Auth-Email: $EMAIL" \ -H "X-Auth-Key: $API_KEY" \ -H "Content-Type: application/json" \ --data "{\"type\":\"A\",\"name\":\"nas\",\"content\":\"$CURRENT_IP\"}" # Send notification curl -X POST "https://hooks.slack.com/your/webhook/url" \ -d "{\"text\":\"IP updated to $CURRENT_IP\"}" ``` This guide provides comprehensive coverage of Dynamic DNS configuration for maintaining remote access to your home server.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tonym/NastyNAS#45
No description provided.