DNS_Tools/Dynamic_DNS/Dynamic_DNS_Cloudflare
2025-10-05 22:16:38 +01:00
..
logs Updated script to fix issues in put command 2025-10-05 20:21:48 +01:00
zones Updated script so it uses a zone API key now instead of the Global API key and Email address. 2025-10-05 21:58:55 +01:00
README.md Updated script to fix issues in put command 2025-10-05 20:21:48 +01:00
update_cloudflare_ip.sh Forgot to remove -H "X-Auth-Email: $CLOUDFLARE_EMAIL" from script 2025-10-05 22:16:38 +01:00

🔁 Dynamic DNS Updater for Cloudflare with Mullvad IP

This script updates A records in Cloudflare with your current public IP as reported by Mullvad's IP check service. It supports:

  • Multiple domains/zones via .env files
  • Secure API access using Cloudflare API Tokens
  • Smart updates: only changes DNS if your IP has changed
  • Daily logging to ./logs/

🚀 Features

  • Fetches current public IP from Mullvad API (https://ipv4.am.i.mullvad.net/json)
  • Uses .env files to manage multiple Cloudflare DNS records
  • Supports API Tokens (safer than global keys)
  • Skips unnecessary updates if IP hasn't changed
  • Logs every run to logs/update_YYYY-MM-DD.log

📁 Project Structure

.
├── update_cloudflare_ip.sh # Main script
├── zones/ # Folder for per-domain config files
│ ├── example_com.env
│ └── another_domain.env
└── logs/ # Auto-created daily log files
  └── update_2025-10-05.log

⚙️ Configuration

  1. Create a zones/ folder (already included in repo).
  2. Add one .env file per domain/zone, named descriptively. Example:

zones/subdomain.domain.com.env

ZONE_ID="your_cloudflare_zone_id"
DNS_RECORD_ID="your_dns_record_id"
CLOUDFLARE_API_TOKEN="your_cloudflare_api_token"
DNS_NAME="subdomain.domain.com"

Use Cloudflare API Tokens with permission:

Zone → DNS → Edit for the required zone.

🧪 Usage

Make the script executable:

chmod +x update_cloudflare_ip.sh

Run it manually:

./update_cloudflare_ip.sh

Check logs:

cat logs/update_$(date +%F).log

🕒 Automation (Cron Example)

To run the script every 10 minutes, edit your crontab:

crontab -e

Add this line:

*/10 * * * * /path/to/update_cloudflare_ip.sh >> /dev/null 2>&1

Or, if you want to keep logs automatically:

*/10 * * * * /path/to/update_cloudflare_ip.sh >> /path/to/logs/cron.log 2>&1

Requirements

Install jq if missing:

# Debian/Ubuntu
sudo apt install jq

# macOS (Homebrew)
brew install jq

🔐 Security Tip

Never share your .env files or commit them to public repositories. They contain sensitive credentials.

Use .gitignore to ignore your secrets:

.gitignore

zones/*.env
logs/

🙋 FAQ

Q: What happens if the IP hasn't changed? A: The script detects it and skips the update.

Q: What if one domain fails? A: The script continues to process the remaining .env files.

Q: Can I use IPv6? A: Not currently. This script uses Mullvad's IPv4 API. IPv6 support can be added if needed.