161 lines
4.7 KiB
Markdown
161 lines
4.7 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
FIREWALL_MODE="host"
|
|
BLOCKED_PORTS="53 443 853"
|
|
```
|
|
|
|
`docker-host` verhält sich technisch identisch zu `host`:
|
|
|
|
```bash
|
|
FIREWALL_MODE="docker-host"
|
|
BLOCKED_PORTS="53 443 853"
|
|
```
|
|
|
|
### Docker Bridge mit Port-Publishing
|
|
|
|
```bash
|
|
FIREWALL_MODE="docker-bridge"
|
|
BLOCKED_PORTS="53 443 853"
|
|
```
|
|
|
|
### Unklarer Übergangszustand
|
|
|
|
```bash
|
|
FIREWALL_MODE="hybrid"
|
|
BLOCKED_PORTS="53 443 853"
|
|
```
|
|
|
|
---
|
|
|
|
## Regelstruktur nach Modus
|
|
|
|
### Host / Docker Host Network
|
|
|
|
```text
|
|
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
|
|
|
|
```text
|
|
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)
|
|
|
|
```yaml
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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.
|