homelab-showcase/02-ct100-adguard.md

154 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CT 100 — AdGuard Home — Rebuild-Runbook
## 1. Container erstellen (via Proxmox Community Script)
Interaktiv am PVE-Host ausführen (whiptail-Dialog):
```bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/adguard.sh)"
```
⚠️ **NICHT TUN:** `adguardhome.sh` als Dateiname verwenden — 404. Der korrekte Dateiname im Repo ist `ct/adguard.sh`.
**Einstellungen im Advanced-Install-Dialog:**
- Unprivileged, Debian 13
- 1 CPU-Core, **1024 MiB RAM** (Standard 512 MiB reicht nicht für die großen Filterlisten, siehe unten), 2 GB Disk
- Bridge `vmbr0`, statische IPv4 `<LAN_IP_ADGUARD>/24`
- IPv6: none (Container bekommt trotzdem automatisch SLAAC-Adressen, unkritisch)
- Timezone Europe/Berlin, kein HTTP-Proxy
Falls mit 512 MiB angelegt, nachträglich erhöhen:
```bash
pct set 100 --memory 1024
```
## 2. Web-Wizard (einmalig, interaktiv unter `http://<LAN_IP_ADGUARD>:3000` bzw. später Port 80)
- Admin-User: `root` (oder eigener Name)
- Passwort: eigenes wählen
- Upstream-DNS: `https://dns10.quad9.net/dns-query` (Quad9 DoH)
Alle folgenden Schritte patchen `/opt/AdGuardHome/AdGuardHome.yaml` direkt (kein Web-UI-Login nötig, da Root-Zugriff auf den Container besteht). **Immer:**
```bash
pct exec 100 -- systemctl stop AdGuardHome
# Datei anpassen (siehe unten)
pct exec 100 -- systemctl start AdGuardHome
```
⚠️ **NICHT TUN:** die Config bei laufendem Dienst editieren — Änderungen werden beim nächsten internen Save von AdGuard überschrieben.
## 3. Conditional Forwarding für `fritz.box`
In `dns:``upstream_dns:` ergänzen:
```yaml
upstream_dns:
- https://dns10.quad9.net/dns-query
- '[/fritz.box/]<LAN_IP_ROUTER>'
```
Private Reverse-DNS aktivieren (für Gerätenamen im Query-Log):
```yaml
local_ptr_upstreams:
- <LAN_IP_ROUTER>
```
(Im Web-UI: Einstellungen → DNS-Einstellungen → Private Reverse-DNS-Server aktivieren, `<LAN_IP_ROUTER>`, privates Subnetz `<LAN_SUBNET>`)
## 4. Filterlisten
`filters:`-Block (Filter-IDs müssen eindeutig sein, 12 sind Standard-AdGuard-Defaults):
```yaml
filters:
- enabled: true
url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt
name: AdGuard DNS filter
id: 1
- enabled: false
url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_2.txt
name: AdAway Default Blocklist
id: 2
- enabled: true
url: https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt
name: HaGeZi's Pro Blocklist
id: 3
- enabled: true
url: https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/tif.txt
name: HaGeZi's Threat Intelligence Feeds
id: 4
- enabled: true
url: https://filters.adtidy.org/extension/chromium/filters/11.txt
name: AdGuard Mobile Ads filter
id: 5
- enabled: true
url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_53.txt
name: AWAvenue Ads Rule
id: 7
- enabled: true
url: https://adguardteam.github.io/HostlistsRegistry/assets/filter_59.txt
name: AdGuard DNS Popup Hosts filter
id: 8
whitelist_filters:
- enabled: true
url: https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/whitelist-referral.txt
name: HaGeZi's Allowlist Referral
id: 6
```
⚠️ **NICHT TUN (bewusst weggelassen, nicht aus Versehen):** oisd NSFW, HaGeZi Anti-Piracy, ShadowWhisperer Dating List, HaGeZi Safesearch Not Supported (reine Content-Filter, kein Ad-Blocking-Zweck), HaGeZi DynDNS-Blocklist (Konflikt mit eigenem STRATO-DynDNS), HaGeZi Encrypted DNS/VPN/TOR/Proxy Bypass (Risiko für den Firmen-VPN-Tunnel der Ehefrau), Dandelion Sprout's Anti-Malware List + ShadowWhisperer's Malware List (redundant zu HaGeZi TIF, nur RAM-Verschwendung).
## 5. DNS-Rewrites (interne Kurznamen)
```yaml
rewrites:
- domain: nas.pve
answer: <LAN_IP_NAS>
enabled: true
- domain: adguard.pve
answer: <LAN_IP_ADGUARD>
enabled: true
```
⚠️ **NICHT TUN:** das Feld `enabled: true` weglassen. AdGuard Home ergänzt es beim nächsten Neustart automatisch mit dem Default `enabled: false` — der Rewrite bleibt dann wirkungslos (Query geht bis zu den Root-DNS-Servern durch, NXDOMAIN), ohne erkennbaren Fehler in der Config selbst.
## 6. Passwort-Reset (falls nötig)
AdGuard speichert nur den bcrypt-Hash, keine Wiederherstellung möglich — neues Passwort setzen statt altes wiederherstellen:
```bash
pct exec 100 -- apt-get install -y apache2-utils # für htpasswd -B
NEWPASS="<neues Passwort>"
HASH=$(pct exec 100 -- htpasswd -bnBC 10 "" "$NEWPASS" | tr -d ':\n')
# In AdGuardHome.yaml, Zeile "password:" unter users: ersetzen durch $HASH
```
Der von `htpasswd -B` erzeugte Hash hat `$2y$`-Präfix statt AdGuards eigenem `$2a$` — wird von Go/AdGuard-Home-bcrypt trotzdem korrekt akzeptiert.
## 7. Fritzbox-DHCP umstellen (manueller Schritt am Router, kein CLI)
Fritzbox-Oberfläche → **Heimnetz → Netzwerk → Netzwerkeinstellungen** → IPv4-Adressen bearbeiten → Abschnitt **DNS-Server** → „Andere DNSv4-Server verwenden" → Bevorzugter DNSv4-Server: `<LAN_IP_ADGUARD>`.
⚠️ **NICHT TUN (verworfene Variante):** Client fragt die Fritzbox, die AdGuard als Upstream nutzt. Stattdessen: Client fragt AdGuard direkt (wie oben), Fritzbox nur noch für `fritz.box`-Auflösung via Conditional Forwarding.
## 8. IPv6-DNS aktivieren
Standardmäßig lauscht AdGuard Home nur auf IPv4 (`bind_hosts: [0.0.0.0]`), obwohl der Container per SLAAC auch IPv6-Adressen bekommt — DNS-Anfragen über IPv6 werden dann gar nicht erst beantwortet, unabhängig davon, was die Fritzbox verteilt.
```yaml
dns:
bind_hosts:
- 0.0.0.0
- "::"
```
⚠️ **NICHT TUN:** direkt vom PVE-Host aus testen, falls der selbst kein SLAAC-IPv6 auf der Bridge hat (`ip -6 addr show vmbr0` prüfen — meist nur Link-Local vorhanden). Test stattdessen von einem Container aus, der eine globale IPv6-Adresse hat (z. B. `pct exec 101 -- dig @<ULA-Adresse> google.com`).
**Manueller Schritt an der Fritzbox:** Heimnetz → Netzwerk → Netzwerkeinstellungen → IPv6-Adressen bearbeiten → DNS-Server → eigenen DNSv6-Server eintragen. **Die ULA-Adresse verwenden** (`fd23:...`, per `ip -6 addr show eth0` im Container ermitteln — steht als "scope global dynamic mngtmpaddr"), **nicht** die GUA (`2a02:...`) — die ULA bleibt stabil, die GUA kann sich bei einem ISP-Präfixwechsel ändern und die Konfiguration stillschweigend brechen.
## Verifikation
```bash
dig @<LAN_IP_ADGUARD> doubleclick.net # sollte 0.0.0.0 liefern (geblockt)
dig @<LAN_IP_ADGUARD> google.com # normale Antwort
dig @<LAN_IP_ADGUARD> fritz.box # <LAN_IP_ROUTER> (Conditional Forwarding)
dig @<LAN_IP_ADGUARD> nas.pve # <LAN_IP_NAS> (Rewrite)
```