Domains & DNS konfigurieren
Einrichtung
Voraussetzung: DNS-Server im VPN
Der DNS-Server (Pi-Hole/AdGuard) muss über das WireGuard-VPN erreichbar sein:
- Pi-Hole/AdGuard als WireGuard-Peer in GateControl anlegen
- Der Peer bekommt eine VPN-IP (z.B.
10.8.0.50) - Pi-Hole/AdGuard so konfigurieren, dass es auf der VPN-IP lauscht
Globalen DNS konfigurieren
- Einstellungen → Allgemein → DNS Server
- IP-Adresse des DNS-Servers eintragen (z.B.
10.8.0.50) - Speichern klicken
Mehrere DNS-Server können komma-getrennt eingetragen werden (z.B. 10.8.0.50,1.1.1.1).
Per-Peer DNS Override
Einzelne Peers können einen abweichenden DNS-Server nutzen:
- Peers → Peer bearbeiten (Edit-Icon)
- DNS Server (Override) — IP-Adresse eintragen
- Speichern
Leer lassen = globaler DNS wird verwendet.
Bestehende Peers aktualisieren
Wichtig: Bestehende Peers müssen nach einer DNS-Änderung ihre WireGuard-Konfiguration neu herunterladen. GateControl kann DNS-Einstellungen nicht live an verbundene Peers pushen — das ist eine WireGuard-Limitation.
So geht's:
- Peer-Seite öffnen → QR-Code oder Config-Download
- Auf dem Endgerät: alte WireGuard-Config löschen, neue importieren
- Verbindung neu aufbauen
Neue Peers erhalten die aktuelle DNS-Konfiguration automatisch.
Anwendungsbeispiele
Ad-Blocking für alle VPN-Clients
- Pi-Hole als Peer verbinden →
10.8.0.50 - Settings → DNS Server →
10.8.0.50 - Alle Peers sind werbefrei
Gemischte Konfiguration
- Smartphones/Laptops → Pi-Hole DNS (global,
10.8.0.50) - IoT-Geräte → Standard-DNS (Per-Peer Override:
1.1.1.1) — weil Pi-Hole manche IoT-Domains blockt - Kinder-Tablet → AdGuard mit Familienfilter (Per-Peer Override:
10.8.0.51)
Interner DNS-Server
Firmen-DNS-Server als Custom DNS eintragen. VPN-Peers können interne Hostnamen auflösen (z.B. intranet.firma.local).
API
Globalen DNS lesen
GET /api/v1/settings/dns
Response:
{
"ok": true,
"data": {
"dns": "10.8.0.50",
"is_custom": true,
"default_dns": "1.1.1.1,8.8.8.8"
}
}
Globalen DNS setzen
curl -X PUT /api/v1/settings/dns \
-H "Content-Type: application/json" \
-d '{"dns": "10.8.0.50"}'
Leerer String setzt auf den Default zurück:
curl -X PUT /api/v1/settings/dns \
-H "Content-Type: application/json" \
-d '{"dns": ""}'
Per-Peer DNS setzen
# Beim Erstellen
curl -X POST /api/v1/peers \
-H "Content-Type: application/json" \
-d '{"name": "Laptop", "dns": "10.8.0.50"}'
# Beim Bearbeiten
curl -X PUT /api/v1/peers/:id \
-H "Content-Type: application/json" \
-d '{"dns": "1.1.1.1"}'
# Override entfernen (zurück zu global)
curl -X PUT /api/v1/peers/:id \
-H "Content-Type: application/json" \
-d '{"dns": ""}'
Validierung
- DNS-Adressen müssen gültige IPv4-Adressen sein
- Mehrere Adressen werden komma-getrennt akzeptiert (z.B.
10.8.0.50,1.1.1.1) - Format-Validierung:
/^(\d{1,3}\.){3}\d{1,3}$/pro Eintrag
Einschränkungen
- Kein automatisches Update bestehender Peers — Peers müssen Config neu herunterladen (WireGuard-Limitation)
- Nur IPv4 — IPv6-DNS-Server werden nicht validiert
- Kein DNS-over-HTTPS/TLS — Standard-DNS über UDP/TCP
- Client-seitig — DNS wird nur in der Client-Config gesetzt, nicht serverseitig
Technische Details
Betroffene Dateien
| Datei | Funktion |
|---|---|
src/services/license.js |
Feature-Key custom_dns in COMMUNITY_FALLBACK |
src/services/peers.js |
DNS-Fallback-Kette in getClientConfig() |
src/routes/api/settings.js |
GET/PUT /settings/dns Endpoint |
src/routes/api/peers.js |
dns Feld in POST (Create) |
src/middleware/locals.js |
wgDns an Template-Context |
templates/default/pages/settings.njk |
DNS-Card im General-Tab |
templates/default/partials/modals/peer-add.njk |
DNS-Override-Feld |
templates/default/partials/modals/peer-edit.njk |
DNS-Override-Feld |
public/js/settings.js |
DNS Save-Handler |
public/js/peers.js |
DNS in Create/Edit Payload |
Datenbank
Globaler DNS: Settings-Tabelle, Key custom_dns
Per-Peer DNS: Spalte peers.dns (TEXT) — existierte bereits seit der initialen Migration. Wird bei Backup/Restore automatisch mitgesichert.
WireGuard-Client-Config
[Interface]
PrivateKey = ...
Address = 10.8.0.3/32
DNS = 10.8.0.50 ← Custom DNS aus Fallback-Kette
[Peer]
PublicKey = ...
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Die DNS-Zeile ist ein wg-quick(8) Direktive — sie wird vom WireGuard-Client ausgewertet, nicht vom Server. Der Server-seitige wg syncconf ignoriert DNS korrekt.