This commit is contained in:
Andre
2026-10-22 21:00:05 +02:00
commit 9c278f49b6
20 changed files with 909 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
services:
wstunnel:
image: ghcr.io/erebe/wstunnel:v11.1.0
container_name: wstunnel
restart: unless-stopped
networks:
npm: # nur fuer den Proxy Manager erreichbar, kein ports:
ipv4_address: ${TUNNEL_IP:-172.20.250.250} # feste IP: NPM haengt nicht von Docker-DNS ab
command:
- /home/app/wstunnel # Image startet ueber dumb-init, Binaerpfad noetig
- server
- --restrict-config=/home/app/restrictions.yaml
- --dns-resolver=dns://1.1.1.1 # oeffentliches DNS: lokale Namen sind nicht aufloesbar
- --dns-resolver=dns://9.9.9.9
- --dns-resolver-prefer-ipv4
- ws://0.0.0.0:8090 # NPM terminiert TLS, intern reicht ws
volumes:
- ./restrictions.yaml:/home/app/restrictions.yaml:ro
read_only: true
cap_drop: [ALL]
security_opt: [no-new-privileges:true]
mem_limit: 64m
logging:
driver: json-file
options:
max-size: 1m
max-file: "3"
# Werte aus .env (siehe docs/installation.md), Standard = bestehende Installation
networks:
npm:
external: true
name: ${NPM_NETWORK:-nginx_default}
+14
View File
@@ -0,0 +1,14 @@
[Unit]
Description=tunnler: wstunnel-Container vom Heimnetz trennen
After=docker.service
PartOf=docker.service
[Service]
Type=oneshot
EnvironmentFile=-/etc/default/tunnler-firewall
RemainAfterExit=yes
ExecStart=/usr/local/sbin/tunnler-firewall.sh
ExecStop=/usr/local/sbin/tunnler-firewall.sh --remove
[Install]
WantedBy=multi-user.target docker.service
+27
View File
@@ -0,0 +1,27 @@
#!/bin/sh
# Trennt den wstunnel-Container (feste IP, TUNNEL_IP aus /etc/default/tunnler-firewall) vom Heimnetz
# und vom Pi selbst. Hostnamen, die per oeffentlichem DNS auf private IPs zeigen
# (z. B. 192-168-0-1.nip.io), kann wstunnel selbst nicht abfangen.
# tunnler-firewall.sh Regeln setzen (idempotent)
# tunnler-firewall.sh --remove Regeln entfernen
set -e
SRC=${TUNNEL_IP:-172.20.250.250}
for chain in DOCKER-USER INPUT; do
while iptables -D "$chain" -s "$SRC" -j TUNNLER 2>/dev/null; do :; done
done
if [ "$1" = "--remove" ]; then
iptables -F TUNNLER 2>/dev/null || true
iptables -X TUNNLER 2>/dev/null || true
exit 0
fi
iptables -N TUNNLER 2>/dev/null || iptables -F TUNNLER
iptables -A TUNNLER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
for net in 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16; do
iptables -A TUNNLER -d "$net" -j DROP
done
iptables -N DOCKER-USER 2>/dev/null || true
iptables -I DOCKER-USER -s "$SRC" -j TUNNLER
iptables -I INPUT -s "$SRC" -j TUNNLER
+99
View File
@@ -0,0 +1,99 @@
# wstunnel-Server: Zugriffsregeln (wird bei Aenderung automatisch neu geladen).
# Vorlage: Platzhalter im PathPrefix durch das Secret ersetzen, als restrictions.yaml speichern.
#
# Wirkung:
# - Nur Clients mit dem geheimen Pfad-Praefix werden akzeptiert.
# - Nur Forward-Tunnel (keine Reverse-Tunnel), nur TCP, nur Ziel-Port 80/443.
# - Hostnamen: mindestens ein Punkt, TLD aus Buchstaben, nie *.localhost.
# Lokale Namen (pi.hole, *.home, Container-Namen) loest der Server nicht auf,
# weil er per --dns-resolver nur oeffentliches DNS fragt (siehe docker-compose.yml).
# - IP-Adressen als Ziel: nur oeffentliche IPv4-Bereiche (privat, Loopback,
# Link-Local, CGNAT, Multicast ausgeschlossen) und globales IPv6.
restrictions:
- name: "tunnler"
description: "Forward-Tunnel mit Secret, TCP 80/443, keine privaten Ziele"
match:
- !PathPrefix "^__SECRET__$"
allow:
- !Tunnel
protocol:
- Tcp
port:
- 80
- 443
host: '(?i)^([a-z0-9_-]+\.)+([a-z]{2,8}|[a-z]{10,63}|[a-km-z][a-z]{8}|l[a-np-z][a-z]{7}|lo[a-bd-z][a-z]{6}|loc[b-z][a-z]{5}|loca[a-km-z][a-z]{4}|local[a-gi-z][a-z]{3}|localh[a-np-z][a-z]{2}|localho[a-rt-z][a-z]|localhos[a-su-z]|xn--[a-z0-9-]+)$'
cidr:
- 1.0.0.0/8
- 2.0.0.0/7
- 4.0.0.0/6
- 8.0.0.0/7
- 11.0.0.0/8
- 12.0.0.0/6
- 16.0.0.0/4
- 32.0.0.0/3
- 64.0.0.0/3
- 96.0.0.0/6
- 100.0.0.0/10
- 100.128.0.0/9
- 101.0.0.0/8
- 102.0.0.0/7
- 104.0.0.0/5
- 112.0.0.0/5
- 120.0.0.0/6
- 124.0.0.0/7
- 126.0.0.0/8
- 128.0.0.0/3
- 160.0.0.0/5
- 168.0.0.0/8
- 169.0.0.0/9
- 169.128.0.0/10
- 169.192.0.0/11
- 169.224.0.0/12
- 169.240.0.0/13
- 169.248.0.0/14
- 169.252.0.0/15
- 169.255.0.0/16
- 170.0.0.0/7
- 172.0.0.0/12
- 172.32.0.0/11
- 172.64.0.0/10
- 172.128.0.0/9
- 173.0.0.0/8
- 174.0.0.0/7
- 176.0.0.0/4
- 192.0.1.0/24
- 192.0.2.0/23
- 192.0.4.0/22
- 192.0.8.0/21
- 192.0.16.0/20
- 192.0.32.0/19
- 192.0.64.0/18
- 192.0.128.0/17
- 192.1.0.0/16
- 192.2.0.0/15
- 192.4.0.0/14
- 192.8.0.0/13
- 192.16.0.0/12
- 192.32.0.0/11
- 192.64.0.0/10
- 192.128.0.0/11
- 192.160.0.0/13
- 192.169.0.0/16
- 192.170.0.0/15
- 192.172.0.0/14
- 192.176.0.0/12
- 192.192.0.0/10
- 193.0.0.0/8
- 194.0.0.0/7
- 196.0.0.0/7
- 198.0.0.0/12
- 198.16.0.0/15
- 198.20.0.0/14
- 198.24.0.0/13
- 198.32.0.0/11
- 198.64.0.0/10
- 198.128.0.0/9
- 199.0.0.0/8
- 200.0.0.0/5
- 208.0.0.0/4
- 2000::/3