A fast, lightweight Dynamic DNS updater written in Rust that supports multiple DNS providers.
- β 1984.is - DynDNS2-compatible protocol
- β Afraid.org - Token-based update API (v2)
- β Cloudflare - Full API support with zone management
- β ChangeIP - Legacy JSON protocol with basic auth
- β ClouDNS - Simple dynurl-based updates
- β DDNS.FM - DDNS service with REST API
- β DDNSS - Simple token-based GET protocol
- β deSEC - German DNS with token auth (DynDNS2-compatible)
- β DigitalOcean - REST API with token authentication
- β Dinahosting - REST API with basic auth
- β Directnic - Pre-configured URL updates
- β DNS Made Easy - Dynamic DNS endpoint
- β DNSExit2 - JSON API v2 with API key
- β DNSPod - Chinese DNS with token-based API
- β Domeneshop - REST API with basic auth
- β DonDominio - JSON API with key auth
- β DSLReports - DSLReports legacy protocol
- β DuckDNS - Simple token-based updates
- β DynDNS v1 - Legacy DynDNS protocol (pre-DynDNS2)
- β DynDNS2 - Compatible with DynDNS, DNSdynamic, and other DynDNS2-compatible services
- β Dynu - DynDNS2-compatible protocol
- β EasyDNS - REST API with basic auth (10min update interval)
- β Email Only - Send notifications via email instead of updating DNS (requires system sendmail)
- β Enom - Dynamic DNS API
- β Freedns (afraid.org) - Hash-based update protocol
- β Freemyip - Simple token-based updates
- β Gandi - REST API with API key
- β GoDaddy - REST API with key/secret
- β Google Domains - DynDNS2-compatible protocol
- β Hetzner - REST API with API token
- β Hurricane Electric (HE.net) - Simple update protocol
- β Infomaniak - DynDNS2-compatible protocol
- β INWX - DynDNS2-compatible protocol
- β Key-Systems (RRPproxy) - Token-based updates
- β Linode - Linode API v4 with token auth
- β Loopia - DynDNS2-compatible protocol
- β LuaDNS - REST API with email/token auth
- β Mythic Beasts - Modern dual-endpoint API
- β Namecheap - Native Dynamic DNS support
- β NFSN (NearlyFreeSpeech.NET) - Basic auth updates
- β Njalla - Simple API with password auth
- β No-IP - DynDNS2-compatible with No-IP specifics
- β nsupdate - RFC 2136 Dynamic DNS Update protocol (requires DNS library)
- β OVH - REST API (simplified, requires proper signing for production)
- β Porkbun - REST API with key/secret
- β Regfish - DynDNS2-compatible protocol
- β Selfhost.de - German provider with DynDNS2 protocol
- β Sitelutions - DynDNS2-compatible protocol
- β Woima.fi - Finnish DNS with DynDNS2 protocol
- β Yandex - Yandex PDD API
- β Zoneedit - DynDNS2-compatible protocol
- β ZoneEdit v1 - ZoneEdit legacy protocol
The dyndns2 provider also works with many other services that support the DynDNS2 protocol, including but not limited to: DNSdynamic, DuckDNS (alternative), many router DDNS services, and custom DDNS implementations.
- π Blazingly fast - Compiled Rust vs interpreted Perl
- π¦ Super tiny - Single < 1MB self-contained binary vs ddclient's ~64MB+ (Perl runtime + core libraries + modules)
- π― Drop-in replacement - Compatible with ddclient config format and workflows
- π Full IPv6 support - All providers support both A and AAAA records
- π Flexible configuration - ddclient-compatible config files or command-line arguments
- π Smart IP detection - Web services, network interfaces, custom commands, or manual IP
- πΎ State management - Tracks IP changes to minimize unnecessary DNS updates
- βοΈ Easily extensible - Clean architecture for adding new providers
cargo build --release
sudo cp target/release/rddclient /usr/local/bin/See the examples/ directory for:
- Systemd service and timer units
- Cron job examples
- Network hook scripts (DHCP, NetworkManager, PPP)
- Provider-specific configurations
# Cloudflare with API token
rddclient --protocol cloudflare \
--zone example.com \
--login token \
--password YOUR_API_TOKEN \
--host ddns.example.com
# Or use a config file (recommended)
rddclient --file /etc/rddclient/rddclient.conf# /etc/rddclient/rddclient.conf
protocol = cloudflare
zone = example.com
login = token
password = your_api_token_here
host = ddns.example.comFor more examples, see:
examples/cloudflare.conf- Cloudflare setupexamples/duckdns.conf- DuckDNS setupexamples/noip.conf- No-IP setupexamples/namecheap.conf- Namecheap setupexamples/rddclient.conf.example- Multi-provider template
# Use specific network interface
rddclient --file myconfig.conf --use-method if --if-name eth0
# Use custom command (always use HTTPS for security)
rddclient --file myconfig.conf --use-method cmd --cmd 'curl -s https://ifconfig.me'
# Use custom web service
rddclient --file myconfig.conf --use-method web --web https://api64.ipify.org
# Manual IP specification
rddclient --file myconfig.conf --ip 203.0.113.42# Customize update intervals (default: min=30s, max=25d, error=5m)
rddclient --file myconfig.conf --min-interval 5m --max-interval 30d
# Prevent rapid retries after errors
rddclient --file myconfig.conf --min-error-interval 10m
# Force update regardless of intervals
rddclient --file myconfig.conf --forceInterval formats: 30s (seconds), 5m (minutes), 2h (hours), 25d (days)
docs/parity.md- Feature parity with ddclientdocs/testing.md- Testing strategy and coverageexamples/README.md- Deployment examples and integration
- Requires Zone ID (found in domain Overview)
- API token needs
DNS:Editpermissions
- Personal Access Token required
- DNS record must already exist
- Free service, no account needed for basic use
- Token is per-account, works for all your domains
- Hostname should be without
.duckdns.orgsuffix
- Uses unique update token per hostname
- Token is different for each DNS record
- Requires API key/secret from developer.godaddy.com
- Production keys require domain ownership verification
- Free DNS hosting
- Update key is per-hostname (found in DNS management)
- Current implementation is simplified
- Full production use requires proper API request signing
- Requires application key, secret, and consumer key
- Requires API enabled in account settings
- Both API key and secret key needed
rddclient uses a modular architecture with provider-specific clients implementing a common DnsClient trait:
src/
βββ main.rs # Application entry point & orchestration
βββ args.rs # CLI argument parsing (Clap)
βββ config.rs # ddclient config file parser
βββ ip.rs # IP detection with fallback sources
βββ clients/ # DNS provider implementations
βββ mod.rs # DnsClient trait & provider factory
βββ cloudflare.rs # Cloudflare API client
βββ digitalocean.rs # DigitalOcean API client
βββ duckdns.rs # DuckDNS API client
βββ dyndns2.rs # DynDNS2 protocol (40+ providers)
βββ ... # 52 total providers
To add a new DNS provider, see docs/ProviderGuidelines.md for detailed instructions.
Quick overview:
- Create
src/clients/newprovider.rsimplementing theDnsClienttrait - Add module to
src/clients/mod.rs - Add to
create_client()factory function - Add example configuration to
examples/ - Add tests
Example template:
use crate::clients::DnsClient;
use std::error::Error;
use std::net::IpAddr;
pub struct NewProviderClient {
api_key: String,
// provider-specific fields
}
impl DnsClient for NewProviderClient {
fn update_record(&self, hostname: &str, ip: IpAddr) -> Result<(), Box<dyn Error>> {
// Make API call to update DNS record
Ok(())
}
}Automatic IP detection tries multiple sources with fallback. If all fail, specify manually with --ip.
- Verify API credentials in configuration
- Check token/key permissions
- Look for trailing spaces in config values
- Some providers require pre-creating DNS records
- Verify domain ownership in provider dashboard
- Use
--verbosefor detailed request/response logs
For more help, see docs/troubleshooting.md.
GPLv3
Contributions welcome! See docs/ProviderGuidelines.md for comprehensive guidelines on adding new providers.
See docs/parity.md for complete feature parity tracking with ddclient.
Completed:
- β Full IPv6 support (all providers)
- β
--forceflag for forced updates - β ddclient config file compatibility
- β State management & IP change detection (v0.6.0)
- β
--cachefile support for persistent state - β
Advanced IP detection (v0.6.0):
--use-method,--if-name,--cmd,--web - β
Rate limiting (v0.6.0):
--min-interval,--max-interval,--min-error-interval
In Progress:
- Daemon mode with
--daemonflag
Planned:
- Email notifications
- Proxy support