# 🌐 InterNetX DDNS Updater Ein moderner DDNS-Service für InterNetX AutoDNS, der es Routern ermöglicht, DNS-Records automatisch zu aktualisieren. [![Node.js](https://img.shields.io/badge/node-%3E%3D24.0.0-brightgreen)](https://nodejs.org/) [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE) --- ## ✨ Features - 🔒 **Sicherheit**: Token-Authentifizierung, Rate Limiting, Helmet.js Security Headers - 🌍 **IPv4 & IPv6**: Unterstützung für beide IP-Protokolle - 🚀 **InterNetX Integration**: Nutzt das offizielle `js-domainrobot-sdk` - 📊 **Logging**: Winston Logger mit täglicher Log-Rotation - 🐳 **Docker**: Production-ready Container mit Multi-Stage Build - 🎯 **Router-Kompatibel**: Getestet mit DrayTek Vigor-Serie --- ## 📋 Voraussetzungen - Node.js >= 24.0.0 - npm >= 10.0.0 - InterNetX AutoDNS Account mit API-Zugang - Domain/Zone in InterNetX AutoDNS --- ## 🚀 Installation ### Option 1: Node.js (Lokal) ```bash # Repository klonen git clone https://github.com/MrUnknownDE/internetx-ddns-updater.git cd internetx-ddns-updater # Dependencies installieren npm install # .env Datei erstellen cp .env.example .env # .env mit deinen Credentials bearbeiten # Siehe Konfiguration weiter unten # Server starten npm start ``` ### Option 2: Docker ```bash # .env Datei erstellen cp .env.example .env # docker-compose starten docker-compose up -d # Logs anzeigen docker-compose logs -f ``` --- ## ⚙️ Konfiguration Bearbeite die `.env` Datei mit deinen Einstellungen: ### Erforderliche Einstellungen ```env # InterNetX API Credentials INTERNETX_USER=dein-username INTERNETX_PASSWORD=dein-passwort INTERNETX_CONTEXT=4 # DDNS Zone DEFAULT_ZONE=ddns.netstack.berlin # Authentifizierungs-Tokens (mind. 1 Token erforderlich) # Token generieren: node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" AUTH_TOKENS=dein-token-hier,noch-ein-token ``` ### Optionale Einstellungen ```env # Server PORT=3000 NODE_ENV=production # InterNetX API URL (Standard ist OK) INTERNETX_API_URL=https://api.autodns.com/v1 # DNS TTL (in Sekunden) DEFAULT_TTL=300 # IP Whitelist (optional, leer = alle IPs erlaubt) IP_WHITELIST= # Rate Limiting RATE_LIMIT_WINDOW_MS=300000 # 5 Minuten RATE_LIMIT_MAX_REQUESTS=20 # Max 20 Anfragen pro IP # Logging LOG_LEVEL=info LOG_FILE_MAX_SIZE=10m LOG_FILE_MAX_AGE=30d ``` --- ## 🔑 Token Generierung Generiere sichere Tokens mit Node.js: ```bash node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" ``` Kopiere das generierte Token in deine `.env` Datei unter `AUTH_TOKENS`. --- ## 📡 Router-Konfiguration ### DrayTek Vigor-Serie (2927, 3910, etc.) 1. **Router-Admin öffnen**: Login in die Web-Oberfläche 2. **DDNS konfigurieren**: `Applications` → `Dynamic DNS` 3. **Einstellungen**: - **Provider**: Custom DDNS - **Server/Provider**: `ddns.netstack.berlin` (oder deine Domain) - **Hostname**: `@HOSTNAME@` (z.B. `home.ddns.netstack.berlin`) - **URL**: `/update?hostname=@HOSTNAME@&myip=@IP@&token=DEIN_TOKEN_HIER` - **Port**: `443` (HTTPS) 4. **Test**: Klicke auf den Test-Button ### Andere Router Die meisten Router unterstützen "Custom DDNS" mit diesen Parametern: - **URL-Format**: `https://ddns.netstack.berlin/update?hostname=&myip=&token=` - **Parameter**: - `hostname`: Voller Hostname (z.B. `home.ddns.netstack.berlin`) - `myip`: IPv4-Adresse (optional, wird automatisch erkannt) - `myipv6`: IPv6-Adresse (optional) - `token`: Dein Authentifizierungs-Token --- ## 🔒 Sicherheit ### HTTPS ist PFLICHT! ⚠️ **WICHTIG**: Der Service MUSS hinter HTTPS laufen! #### Nginx Reverse Proxy Beispiel ```nginx server { listen 443 ssl http2; server_name ddns.netstack.berlin; ssl_certificate /etc/letsencrypt/live/ddns.netstack.berlin/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ddns.netstack.berlin/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://localhost:3000; 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; } } ``` #### Caddy Reverse Proxy (einfacher) ```caddy ddns.netstack.berlin { reverse_proxy localhost:3000 } ``` Caddy holt automatisch Let's Encrypt Zertifikate! 🎉 ### Sicherheitsmaßnahmen - ✅ Token-basierte Authentifizierung (256-Bit Entropie) - ✅ Rate Limiting (20 Anfragen / 5 Minuten pro IP) - ✅ Input Validation (Joi-Schemas) - ✅ Helmet.js Security Headers - ✅ IP-Whitelisting (optional) - ✅ Audit-Logging aller Anfragen --- ## 📚 API-Dokumentation ### `GET/POST /update` Update DNS-Record für DDNS. #### Parameter | Parameter | Typ | Erforderlich | Beschreibung | |-----------|-----|--------------|--------------| | `hostname` | string | ✅ | Voller Hostname (z.B. `home.ddns.netstack.berlin`) | | `myip` | string | ⚠️ | IPv4-Adresse (optional, auto-detect wenn leer) | | `myipv6` | string | ⚠️ | IPv6-Adresse (optional) | | `token` | string | ✅ | Authentifizierungs-Token | ⚠️ Mindestens eine IP (`myip` oder `myipv6`) erforderlich, oder keine (dann Client-IP) #### Beispiel-Anfragen ```bash # IPv4 Update curl "https://ddns.netstack.berlin/update?hostname=home.ddns.netstack.berlin&myip=1.2.3.4&token=YOUR_TOKEN" # IPv6 Update curl "https://ddns.netstack.berlin/update?hostname=home.ddns.netstack.berlin&myipv6=2001:db8::1&token=YOUR_TOKEN" # Beide gleichzeitig curl "https://ddns.netstack.berlin/update?hostname=home.ddns.netstack.berlin&myip=1.2.3.4&myipv6=2001:db8::1&token=YOUR_TOKEN" # Auto-Detect (Client-IP) curl "https://ddns.netstack.berlin/update?hostname=home.ddns.netstack.berlin&token=YOUR_TOKEN" ``` #### Success Response ```json { "status": "success", "message": "DNS record updated successfully", "hostname": "home.ddns.netstack.berlin", "updates": [ { "type": "A", "action": "updated", "value": "1.2.3.4" } ] } ``` #### Error Response ```json { "status": "error", "message": "Authentication failed" } ``` ### `GET /health` Health Check Endpoint für Monitoring. ```bash curl http://localhost:3000/health ``` ```json { "status": "healthy", "service": "ddns-updater", "version": "1.0.0", "uptime": 12345.67 } ``` --- ## 🐛 Troubleshooting ### Router sendet keine Updates 1. **HTTPS Zertifikat prüfen**: Self-Signed Certs funktionieren oft nicht! 2. **Token überprüfen**: In `.env` und Router-Konfiguration identisch? 3. **Logs checken**: `docker-compose logs -f` oder `logs/combined-*.log` 4. **Router-Test**: Nutze die Test-Funktion des Routers ### DNS-Record wird nicht aktualisiert 1. **InterNetX Credentials**: Login in AutoDNS Control Panel testen 2. **Zone existiert**: Ist die Zone in InterNetX vorhanden? 3. **Berechtigungen**: Hat der API-User DNS-Rechte? 4. **Logs prüfen**: Fehler in `logs/error-*.log`? ### Rate Limit Errors - **Standard**: 20 Anfragen / 5 Minuten - **Lösung**: `RATE_LIMIT_MAX_REQUESTS` in `.env` erhöhen - **Hinweis**: Router machen oft mehrere Retries bei Fehlern ### "Zone not found" Fehler - `DEFAULT_ZONE` in `.env` muss exakt mit InterNetX Zone übereinstimmen - Zone muss in AutoDNS existieren und aktiv sein --- ## 📁 Projektstruktur ``` internetx-ddns-updater/ ├── src/ │ ├── config/ │ │ └── config.js # Konfiguration & Validierung │ ├── middleware/ │ │ ├── auth.middleware.js │ │ ├── validation.middleware.js │ │ └── rateLimiter.middleware.js │ ├── routes/ │ │ └── update.route.js # DDNS Update Endpoint │ ├── services/ │ │ ├── internetx.service.js # InterNetX API Integration │ │ └── ddns.service.js # DDNS Business Logic │ ├── utils/ │ │ ├── logger.js # Winston Logger │ │ └── ipHelper.js # IP-Validierung │ └── index.js # Express App Entry ├── public/ │ ├── index.html # Easter Egg Homepage │ └── logo.png # Dein Logo hier ├── logs/ # Log-Dateien (auto-generiert) ├── .env.example # Konfiguration Example ├── package.json ├── Dockerfile └── docker-compose.yml ``` --- ## 🏗️ Development ```bash # Development Mode (mit Nodemon) npm run dev # Tests ausführen (wenn implementiert) npm test # Linting npm run lint ``` --- ## 🌟 Easter Egg Besuche die Homepage des Services im Browser: `https://ddns.netstack.berlin/` Du findest eine nette Überraschung! 🎉 --- ## 📄 Lizenz MIT License - siehe [LICENSE](LICENSE) Datei --- ## 🤝 Support Bei Fragen oder Problemen: - **Issues**: [GitHub Issues](https://github.com/netstack/internetx-ddns-updater/issues) - **Email**: support@netstack.berlin - **Website**: [netstack.berlin](https://www.netstack.berlin) --- ## 👨‍💻 Made with ❤️ by [Netstack GmbH](https://www.netstack.berlin) **Interesse an coolen Projekten?** [Wir stellen ein!](https://www.netstack.berlin/karriere)