Zugriffskontrolle
Was macht ACL?
Jede Route in GateControl ist standardmäßig über ihre Domain öffentlich erreichbar. Jeder im Internet kann nas.example.com aufrufen. ACL ändert das:
Ohne ACL:
Internet (jede IP) → Caddy → nas.example.com → Backend ✓
VPN-Peer 10.8.0.3 → Caddy → nas.example.com → Backend ✓
VPN-Peer 10.8.0.5 → Caddy → nas.example.com → Backend ✓
Mit ACL (nur Peer "Laptop" erlaubt):
Internet (jede IP) → Caddy → nas.example.com → BLOCKIERT ✕
VPN-Peer 10.8.0.3 → Caddy → nas.example.com → Backend ✓ (Laptop)
VPN-Peer 10.8.0.5 → Caddy → nas.example.com → BLOCKIERT ✕ (iPhone)
ACL macht die Route effektiv nur über VPN erreichbar und zusätzlich nur für ausgewählte Peers.
Wie funktioniert es technisch?
Caddy prüft bei jeder Anfrage die IP-Adresse des Clients mit dem remote_ip Matcher (src/services/caddyConfig.js, acl_enabled-Block):
- Anfragen über das VPN haben eine WireGuard-IP (z.B.
10.8.0.3) - Anfragen aus dem Internet haben eine öffentliche IP (z.B.
203.0.113.50) - Für jeden ausgewählten Peer wird die erste IP aus
peers.allowed_ipsgenommen und als/32-Range in den Matcher geschrieben (z. B.10.8.0.3/32) - Öffentliche IPs sind nie in der Liste → werden immer blockiert
Die ACL-Konfiguration wird automatisch in die Caddy JSON-Config geschrieben. Es gibt keine manuelle Konfiguration.
Use Case: Admin-Panel nur für den Laptop
Ausgangssituation:
Du betreibst ein Synology NAS Zuhause. GateControl erstellt die Route nas.example.com die auf Port 5001 (DSM Web UI) zeigt. Ohne weitere Einschränkung kann jeder im Internet die Login-Seite deines NAS sehen.
Ziel:
Nur dein Arbeits-Laptop soll auf nas.example.com zugreifen können. Nicht dein Smartphone, nicht das Internet.
Einrichtung:
- Öffne die Route
nas.example.comim Edit-Modal - Aktiviere Peer-Zugriffskontrolle
- In der Peer-Checkliste: Nur "Laptop Büro" (10.8.0.3) auswählen
- Speichern
Ergebnis:
| Quelle | IP bei Caddy | Zugriff |
|---|---|---|
| Laptop Büro (VPN aktiv) | 10.8.0.3 | Erlaubt |
| iPhone (VPN aktiv) | 10.8.0.5 | Blockiert |
| Beliebiger Internet-User | 203.0.113.x | Blockiert |
| Hacker / Bot | 45.33.x.x | Blockiert |
Dein NAS Admin-Panel ist jetzt nur erreichbar wenn du am Laptop sitzt und der VPN-Tunnel aktiv ist.
Weitere Use Cases
Entwicklungsserver nur für das Dev-Team
Route staging.example.com → Dev-Server auf Port 3000
ACL: Nur Peers "Dev-Laptop-1", "Dev-Laptop-2", "Dev-Laptop-3" erlaubt. QA-Team und Management können die Staging-Umgebung nicht sehen.
Monitoring-Dashboard nur vom Office
Route grafana.example.com → Grafana auf Port 3000
ACL: Nur Peer "Office-Server" erlaubt. Mitarbeiter im Home-Office haben keinen Zugriff auf das Monitoring.
Verschiedene Dienste für verschiedene Gruppen
| Route | Erlaubte Peers | Zweck |
|---|---|---|
nas.example.com |
Laptop, Smartphone | Dateizugriff für den Admin |
admin.example.com |
Nur Laptop | Sensibles Admin-Panel |
public-api.example.com |
Keine ACL | Öffentliche API ohne Einschränkung |
Kombination mit anderen Features
ACL lässt sich mit anderen Sicherheits-Features kombinieren:
| Kombination | Wirkung |
|---|---|
| ACL + Route Auth | Erst VPN-IP prüfen, dann Login mit Passwort/2FA |
| ACL + Rate Limiting | VPN-only Zugang mit Anfragen-Begrenzung |
| ACL + IP Access Control | ACL für VPN-Peers + IP-Filter für zusätzliche Einschränkung |
| ACL allein | Einfachste Variante: nur ausgewählte VPN-Geräte kommen durch |
Wichtige Hinweise
- ACL blockiert nur den Zugriff über Caddy (HTTP/HTTPS Routen). Der direkte VPN-Zugang zwischen Peers wird nicht eingeschränkt.
- Wenn ein Peer deaktiviert oder gelöscht wird, wird er automatisch aus der ACL entfernt.
- ACL funktioniert nur für HTTP-Routen, nicht für L4 (TCP/UDP) Routen.
- Die ACL-Prüfung ist die erste Prüfung die Caddy durchführt — noch vor Auth, Rate Limiting oder anderen Handlern.
Was macht es?
IP Access Control filtert Anfragen basierend auf der IP-Adresse des Clients, bevor sie das Backend erreichen. Im Gegensatz zur Peer ACL (die nur VPN-Peer-IPs filtert) arbeitet der IP-Filter mit jeder IP-Adresse — aus dem Internet, VPN oder lokalen Netzwerk.
Whitelist-Modus (nur diese IPs erlauben):
203.0.113.50 (Büro-IP) → Caddy → Backend ✓ (in Whitelist)
198.51.100.10 (Home-IP) → Caddy → BLOCKIERT ✕ (nicht in Whitelist)
45.33.32.1 (Bot) → Caddy → BLOCKIERT ✕ (nicht in Whitelist)
Blacklist-Modus (diese IPs blockieren):
203.0.113.50 (Büro-IP) → Caddy → Backend ✓ (nicht in Blacklist)
198.51.100.10 (Angreifer) → Caddy → BLOCKIERT ✕ (in Blacklist)
45.33.32.1 (CN-Bot) → Caddy → BLOCKIERT ✕ (Land CN in Blacklist)
Wie funktioniert es technisch?
Die IP-Filterung erfolgt über eine Forward-Auth-Subrequest an GateControl (Node.js), die vor dem Reverse Proxy ausgeführt wird.
Drei Regeltypen:
| Typ | Beispiel | Prüfung |
|---|---|---|
| Einzelne IP | 203.0.113.50 |
Exakter Vergleich |
| CIDR-Bereich | 10.0.0.0/8 |
Bitmaske: (clientIP & mask) === (rangeIP & mask) |
| Ländercode | DE, US, CN |
GeoIP-Lookup via ip2location.io API |
Ablauf bei jeder Anfrage:
- Caddy leitet Anfrage an GateControl Forward-Auth weiter
- GateControl extrahiert die Client-IP (strippt
::ffff:IPv6-Prefix) - Prüft jede Regel sequentiell (IP → CIDR → Country)
- Country-Lookup: API-Call zu ip2location.io mit 24h Cache (max 10.000 Einträge)
- Whitelist: Match → erlaubt, kein Match → blockiert
- Blacklist: Match → blockiert, kein Match → erlaubt
Regeln werden als JSON in der Datenbank gespeichert:
[
{ "type": "ip", "value": "203.0.113.50" },
{ "type": "cidr", "value": "10.0.0.0/8" },
{ "type": "country", "value": "CN" }
]
Use Cases
Nur Büro-Netzwerk erlauben
Route internal.example.com → Interne App. Whitelist mit CIDR 185.10.20.0/24 (Büro-IP-Range). Nur Mitarbeiter im Büro (oder über Büro-VPN) können zugreifen.
Bot-Traffic aus bestimmten Ländern blockieren
Route shop.example.com → Webshop. Blacklist mit Ländercodes CN, RU, KP. Reduziert automatisierten Spam und Brute-Force-Versuche erheblich.
Bekannte Angreifer-IPs blockieren
Route api.example.com → API. Blacklist mit einzelnen IPs die in Logs als Angreifer aufgefallen sind. Schnelle Reaktion ohne Firewall-Zugang.
Kombination mit anderen Features
| Kombination | Wirkung |
|---|---|
| IP-Filter + Peer ACL | Doppelte Filterung: ACL für VPN-Peers, IP-Filter für zusätzliche Internet-IPs |
| IP-Filter + Rate Limiting | Erlaubte IPs werden zusätzlich rate-limited |
| IP-Filter + Route Auth | IP-Prüfung vor Login — blockierte IPs sehen nicht mal die Login-Seite |
| IP-Filter + Basic Auth | IP-Filter wird über Forward Auth geprüft (funktioniert nicht mit Basic Auth) |
Wichtige Hinweise
- Unterschied zu Peer ACL: ACL filtert nur WireGuard-Peer-IPs (10.8.0.x). IP Access Control filtert jede beliebige IP-Adresse.
- Country-Lookup erfordert einen ip2location.io API Key. Ohne Key werden Country-Regeln ignoriert.
- Der GeoIP-Cache speichert bis zu 10.000 Einträge für 24 Stunden. Bei Cache-Miss wird ein API-Call ausgeführt (max 5 Sekunden Timeout).
- IPv6-mapped IPv4-Adressen (
::ffff:192.168.1.1) werden automatisch auf IPv4 reduziert. - IP Access Control funktioniert nur mit Route Auth oder als eigenständiger Forward-Auth-Check. Bei Basic Auth ist der IP-Filter nicht verfügbar.
- Eine leere Whitelist erlaubt niemanden. Eine leere Blacklist blockiert niemanden.
- IP-Filter ist nur für HTTP-Routen verfügbar, nicht für L4 (TCP/UDP).