# WAN IP Guard Bewaakt het publieke WAN IP en update automatisch DNS records bij wijziging, plus WhatsApp notificatie. ## Wat doet het? - Controleert elke 5 minuten het publieke WAN IP - Bij wijziging: - Updatet A-records via de DirectAdmin API - Stuurt een WhatsApp notificatie naar de admin - Draait als systemd timer ## Installatie ### 1. Clone op je server ```bash cd ~ git clone wan-ip-guard cd wan-ip-guard ``` ### 2. Configureer ```bash # .env naar /etc (nodig vanwege systemd beperkingen op nieuwere Fedora) sudo mkdir -p /etc/wan-ip-guard sudo cp .env.example /etc/wan-ip-guard/.env sudo nano /etc/wan-ip-guard/.env ``` ### 3. Installeer dependencies ```bash npm install --omit=dev ``` ### 4. Systemd setup ```bash # State directory sudo mkdir -p /var/lib/wan-ip-guard sudo chown $USER:$USER /var/lib/wan-ip-guard # Pas de paden in systemd/*.service aan naar jouw setup # (gebruiker, WorkingDirectory, ExecStart) # Systemd units sudo cp systemd/wan-ip-guard.service /etc/systemd/system/ sudo cp systemd/wan-ip-guard.timer /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now wan-ip-guard.timer ``` ## Configuratie (.env) | Variabele | Beschrijving | Voorbeeld | |-----------|-------------|-----------| | `DA_LOGIN_KEY` | DirectAdmin Login Key | `your_login_key` | | `DA_USERNAME` | DirectAdmin gebruiker | `your_username` | | `DA_BASE_URL` | DirectAdmin base URL | `https://panel.example.com:2222` | | `DA_DOMAIN` | Domeinnaam | `example.com` | | `WHATSAPP_API_ENDPOINT` | wwebjs-api URL | `http://localhost:3001` | | `WHATSAPP_SESSION` | WhatsApp sessie naam | `your_session` | | `ADMIN_PHONE` | Admin telefoonnummer | `31600000000` | | `DNS_RECORDS` | Komma-gescheiden records | `example.com,git,www` | | `STATE_FILE` | Pad naar state file | `/var/lib/wan-ip-guard/current_ip` | ## DirectAdmin Login Key aanmaken 1. Log in op het DirectAdmin panel 2. Ga naar **Accountbeheer** → **Login Keys** 3. Maak een nieuwe key aan met rechten voor **DNS Control** 4. Sla de key op (het wordt maar één keer getoond) ## Beheer ```bash # Timer status systemctl status wan-ip-guard.timer # Logs volgen journalctl -u wan-ip-guard -f # Handmatig draaien cd ~/wan-ip-guard && node index.js # Timer herstarten sudo systemctl restart wan-ip-guard.timer # State bestand resetten (forceer update bij volgende run) rm /var/lib/wan-ip-guard/current_ip ``` ## Probleemoplossing ### "Failed to load environment files: Permission denied" Systemd (met name versie 259+ op Fedora 44) kan soms geen `EnvironmentFile` lezen vanuit een user home directory met beperkte rechten (`drwx------`). **Symptoom:** Timer is actief, maar de service faalt elke run met: ``` wan-ip-guard.service: Failed to load environment files: Permission denied wan-ip-guard.service: Failed to spawn 'start' task: Permission denied ``` **Oplossing:** Verplaats `.env` naar `/etc/wan-ip-guard/.env` (zoals de installatie instructies voorschrijven). Systemd kan bestanden in `/etc` altijd lezen ongeacht user-rechten. ## Hoe het werkt 1. **IP detectie:** Haalt het WAN IP op via `ifconfig.me` met fallback naar `api.ipify.org` en `icanhazip.com` 2. **State vergelijking:** Vergelijkt met het laatst opgeslagen IP in de state file 3. **DNS update:** Voor elke record worden eerst alle bestaande A-records met de exacte oude waarde verwijderd en daarna één nieuw A-record toegevoegd via DirectAdmin API. De delete-aanroep gebruikt `action=select` en een URL-gecodeerde waarde `name=&value=` in parameter `arecs0`. De waarde moet dus niet `recordnaam=ip` zijn. 4. **State persist:** Het nieuwe IP wordt pas opgeslagen als **alle** DNS-updates gelukt zijn. Bij gedeeltelijke mislukking retried de volgende timer-run. 5. **Notificatie:** Stuurt WhatsApp bericht met oud/nieuw IP en status per record. ### DirectAdmin A-record verwijderen De bewezen API-vorm voor één exact A-record is: ```text CMD_API_DNS_CONTROL?domain=eddydevink.nl&action=select&arecs0=&value=> ``` Voorbeeld vóór URL-encoding: ```text name=changeme&value=94.157.123.170 ``` Encodeer het volledige `name=...&value=...`-paar. Controleer na de API-call de zone opnieuw; een API-antwoord `Records verwijderd` is onvoldoende bewijs wanneer het oude record nog in de zone staat. ## Files ``` wan-ip-guard/ ├── index.js # Hoofdscript ├── package.json ├── .env.example # Config template ├── deploy.sh # Deployment script ├── systemd/ │ ├── wan-ip-guard.service │ └── wan-ip-guard.timer ``` ## Serverstructuur (nextcloud) ``` /etc/wan-ip-guard/ ├── .env # Config (door root beheerd) /var/lib/wan-ip-guard/ ├── current_ip # Huidig opgeslagen IP /home/aiaiaiaiagent/wan-ip-guard/ ├── index.js # Broncode ├── node_modules/ └── ... ```