Monitors WAN IP changes and updates DNS records + sends WhatsApp notification
  • JavaScript 80.6%
  • Shell 19.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-31 15:51:34 +02:00
systemd fix: track all configured DNS records 2026-08-31 15:17:50 +02:00
.env.example feat: mirror WAN reports to Matrix 2026-08-31 15:51:34 +02:00
.gitignore feat: WAN IP Guard - dynamic DNS updater with WhatsApp notifications 2026-06-21 09:53:28 +02:00
deploy.sh feat: WAN IP Guard - dynamic DNS updater with WhatsApp notifications 2026-06-21 09:53:28 +02:00
index.js feat: mirror WAN reports to Matrix 2026-08-31 15:51:34 +02:00
package-lock.json feat: WAN IP Guard - dynamic DNS updater with WhatsApp notifications 2026-06-21 09:53:28 +02:00
package.json feat: WAN IP Guard - dynamic DNS updater with WhatsApp notifications 2026-06-21 09:53:28 +02:00
README.md feat: mirror WAN reports to Matrix 2026-08-31 15:51:34 +02:00

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

cd ~
git clone <jouw-repo-url> wan-ip-guard
cd wan-ip-guard

2. Configureer

# .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

npm install --omit=dev

4. Systemd setup

# 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
MATRIX_API_ENDPOINT Matrix homeserver API https://whatsed.eddydevink.nl
MATRIX_TOKEN_FILE Bestand met Sherpa compat-token /home/aiaiaiaiagent/whatsed-new/secrets/sherpa-token
MATRIX_ROOM_FILE Bestand met DM-room voor Eddy /home/aiaiaiaiagent/whatsed-new/secrets/eddy-report-room
DNS_RECORDS Komma-gescheiden records example.com,git,www
STATE_FILE Pad naar state file /var/lib/wan-ip-guard/current_ip

WAN IP Guard verstuurt het rapport naast WhatsApp ook via de Matrix-bot @sherpa:whatsed.eddydevink.nl naar de bestaande DM-room met @eddy:whatsed.eddydevink.nl. Het compat-token en room-ID staan uitsluitend in de aangegeven bestanden en worden niet in de repository opgeslagen.

DirectAdmin Login Key aanmaken

  1. Log in op het DirectAdmin panel
  2. Ga naar AccountbeheerLogin Keys
  3. Maak een nieuwe key aan met rechten voor DNS Control
  4. Sla de key op (het wordt maar één keer getoond)

Beheer

# 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=<recordnaam>&value=<oude-ip> 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:

CMD_API_DNS_CONTROL?domain=eddydevink.nl&action=select&arecs0=<urlencoded name=<recordnaam>&value=<oude-ip>>

Voorbeeld vóór URL-encoding:

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/
└── ...