159 lines
4.8 KiB
Markdown
159 lines
4.8 KiB
Markdown
# 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 <jouw-repo-url> 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=<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:
|
|
|
|
```text
|
|
CMD_API_DNS_CONTROL?domain=eddydevink.nl&action=select&arecs0=<urlencoded name=<recordnaam>&value=<oude-ip>>
|
|
```
|
|
|
|
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/
|
|
└── ...
|
|
```
|