Files
adguard-shield/docs/docker.md
2026-05-01 01:17:05 +02:00

4.7 KiB

Docker-Installationen

AdGuard Shield läuft auf dem Host und liest weiterhin das Querylog von AdGuard Home über die API. Der Unterschied zwischen klassischer Installation und Docker-Setup betrifft nur die Stelle, an der die Firewall eine gesperrte Client-IP abfangen muss.

Modus wählen

Die Wahl des Firewall-Modus hängt davon ab, wie AdGuard Home betrieben wird:

Installation Einstellung Parent-Chain
AdGuard Home direkt auf dem Host FIREWALL_MODE="host" INPUT
Docker mit network_mode: host FIREWALL_MODE="docker-host" INPUT
Docker Bridge mit veröffentlichten Ports FIREWALL_MODE="docker-bridge" DOCKER-USER
Gemischtes Setup oder Migration FIREWALL_MODE="hybrid" INPUT + DOCKER-USER

Warum verschiedene Modi?

Host und Docker Host Network: DNS-Pakete landen direkt in der INPUT-Chain des Hosts. Die Firewall-Regeln werden dort eingehängt.

Docker Bridge mit Port-Publishing: Docker veröffentlicht Ports über NAT (DNAT). Die Pakete durchlaufen nach dem DNAT die FORWARD-Chain, nicht die INPUT-Chain. Docker stellt dafür die Chain DOCKER-USER bereit, die genau für eigene Admin-Regeln vor Dockers Container-Regeln vorgesehen ist.

Hybrid: Hängt Regeln in beide Chains ein. Nützlich bei Migrationen oder wenn unklar ist, welcher Weg die Pakete nehmen.


Konfigurationsbeispiele

Klassisch oder Docker Host Network

FIREWALL_MODE="host"
BLOCKED_PORTS="53 443 853"

docker-host verhält sich technisch identisch zu host:

FIREWALL_MODE="docker-host"
BLOCKED_PORTS="53 443 853"

Docker Bridge mit Port-Publishing

FIREWALL_MODE="docker-bridge"
BLOCKED_PORTS="53 443 853"

Unklarer Übergangszustand

FIREWALL_MODE="hybrid"
BLOCKED_PORTS="53 443 853"

Regelstruktur nach Modus

Host / Docker Host Network

INPUT
  ├── tcp/53  → ADGUARD_SHIELD
  ├── udp/53  → ADGUARD_SHIELD
  ├── tcp/443 → ADGUARD_SHIELD
  ├── udp/443 → ADGUARD_SHIELD
  ├── tcp/853 → ADGUARD_SHIELD
  └── udp/853 → ADGUARD_SHIELD

ADGUARD_SHIELD
  ├── src in adguard_shield_v4 → DROP
  └── src in adguard_shield_v6 → DROP

Docker Bridge

DOCKER-USER
  ├── tcp/53  → ADGUARD_SHIELD
  ├── udp/53  → ADGUARD_SHIELD
  ├── tcp/443 → ADGUARD_SHIELD
  ├── udp/443 → ADGUARD_SHIELD
  ├── tcp/853 → ADGUARD_SHIELD
  └── udp/853 → ADGUARD_SHIELD

ADGUARD_SHIELD
  ├── src in adguard_shield_v4 → DROP
  └── src in adguard_shield_v6 → DROP

Hybrid

Beide Strukturen gleichzeitig: INPUT und DOCKER-USER springen in ADGUARD_SHIELD.


Wichtige Details

Thema Beschreibung
DOCKER-USER Chain docker-bridge benötigt eine vorhandene IPv4-Chain DOCKER-USER. Wenn Docker nicht läuft oder iptables für Docker deaktiviert ist, meldet firewall-create einen Fehler.
IPv6 in Docker IPv6 über Docker wird nur eingehängt, wenn Docker auch eine ip6tables-Chain DOCKER-USER angelegt hat. Fehlt sie, wird IPv4 trotzdem geschützt.
Port-Mapping In DOCKER-USER wird nach Dockers DNAT gematcht. Bei ungewöhnlichen Port-Mappings sollten BLOCKED_PORTS die Container-Zielports enthalten (nicht die Host-Ports).
Hybrid-Warnung hybrid kann mehr Verkehr treffen, weil sowohl Host-Ports als auch Docker-Forwarding geprüft werden. Nur bei Migrationen oder unklaren Setups verwenden.
API-URL Die ADGUARD_URL muss vom Host aus erreichbar sein. Bei Docker Bridge ist das oft http://127.0.0.1:<host-port>.

Typisches Docker-Bridge-Setup

docker-compose.yml (AdGuard Home)

services:
  adguardhome:
    image: adguard/adguardhome
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "443:443/tcp"
      - "853:853/tcp"
      - "3000:3000/tcp"
    volumes:
      - ./data:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf
    restart: unless-stopped

adguard-shield.conf

ADGUARD_URL="http://127.0.0.1:3000"
ADGUARD_USER="admin"
ADGUARD_PASS="geheim"
FIREWALL_MODE="docker-bridge"
BLOCKED_PORTS="53 443 853"

Nach einer Änderung prüfen

sudo systemctl restart adguard-shield
sudo /opt/adguard-shield/adguard-shield firewall-status
sudo /opt/adguard-shield/adguard-shield status

Firewall neu aufbauen

Falls der Modus gewechselt wurde:

sudo /opt/adguard-shield/adguard-shield firewall-remove
sudo systemctl restart adguard-shield
sudo /opt/adguard-shield/adguard-shield firewall-status

Der Daemon erstellt die Firewall-Struktur beim Start automatisch neu und überträgt aktive Sperren aus SQLite.