Türen schließen
Autor: Gerd Raudenbusch Stand: 06.06.2026
Es gibt jede Menge Momente, wo man sich auf das Heimnetz beschränken möchte, z.B. beim Musik hören oder beim Sortieren der Bildersammlung. Während der eigene Medienserver und der Homeassistent noch erreichbar sein sollen, möchte man gleichzeitig sicher sein, dass die Software, die gerade die Gesichtserkennung für die Bildersammlung macht, nicht heimlich mit PimEyes redet. Natürlich kann man sich die DNS-Logs in den Augenwinkel legen; man kann aber auch einfach auf dem Client die Tür zu machen.
Tür zu in Linux
Selbst mit einem einfachen Linux-Client ist das problemlos zu
erreichen, z.B. mit ufw. Man erlaubt einfach nur die als lokal
spezifizierten Adressbereiche und blockiert den Rest. Das folgende
nette, kleine Skript kennt folgende Parameter:
onzum Abschotten vom öffentlichen Netzprivfür nur ausgehend initiierte Verbindungen ins Netzofffür das erlauben eingehender und ausgehender Verbindungen (falls ein Server aktiv ist).
#!/usr/bin/env bash
#set -euo pipefail
if test -t 1; then
ncolors=$(tput colors)
if test -n "$ncolors" && test $ncolors -ge 8; then
BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BOLD=$(tput bold)
RESET=$(tput sgr0)
fi
fi
log() {
>&2 echo -n "${1}"
}
loghead() {
log "${BOLD}${WHITE}${1}${RESET}"
}
logwarning() {
log "${BOLD}${YELLOW}${1}${RESET}"
}
loginfo() {
log "${BOLD}${GREEN}${1}${RESET}"
}
logerror() {
log "${BOLD}${RED}${1}${RESET}"
}
ACTION="${1:-}"
PRIV_NETS=(
"10.0.0.0/8"
"172.16.0.0/12"
"192.168.0.0/16"
)
usage() {
echo "Usage: $0 on|off"
}
require_root() {
if [[ $EUID -ne 0 ]]; then
echo "Please run as root (sudo)." >&2
exit 1
fi
}
enable_lan_only() {
ufw --force reset >/dev/null 2>&1
ufw default deny incoming >/dev/null 2>&1
ufw default deny outgoing >/dev/null 2>&1
for net in "${PRIV_NETS[@]}"; do
ufw allow out to "$net" >/dev/null 2>&1
ufw allow in from "$net" >/dev/null 2>&1
done
ufw --force enable >/dev/null 2>&1
}
enable_private_internet() {
ufw --force reset >/dev/null 2>&1
ufw default deny incoming >/dev/null 2>&1
ufw default allow outgoing >/dev/null 2>&1
ufw --force enable >/dev/null 2>&1
}
enable_normal_internet() {
ufw --force reset >/dev/null 2>&1
ufw default allow incoming >/dev/null 2>&1
ufw default allow outgoing >/dev/null 2>&1
ufw --force enable >/dev/null 2>&1
}
test_status() {
local expected="${1}"
local result=0
ping -i1 -n -q -w1 192.168.178.1 >/dev/null 2>&1
if [ "$?" != "0" ]; then
log "${BOLD}${WHITE}LAN: ${RESET}${BOLD}${RED}CLOSED${RESET}, "
log "${BOLD}${WHITE}WAN: ${RESET}${BOLD}${RED}CLOSED${RESET}"
>&2 echo ""
return
else
log "${BOLD}${WHITE}LAN: ${RESET}${BOLD}${GREEN}OPEN${RESET}, "
ping -i1 -n -q -w1 example.org >/dev/null 2>&1
local wan="$?"
if [ "$wan" == "0" ]; then
local in=$(sudo ufw status verbose | sed -n "3p" | awk '{print $2}')
local out=$(sudo ufw status verbose | sed -n "3p" | awk '{print $4}')
if [ "${in}" == "allow" ]; then
log "${BOLD}${WHITE}WAN: ${RESET}${BOLD}${GREEN}OPEN${RESET}"
else
log "${BOLD}${WHITE}WAN: ${RESET}${BOLD}${YELLOW}OUTGOING${RESET}"
fi
>&2 echo ""
elif [ "$wan" != "0" ]; then
if [ "${in}" == "allow" ]; then
log "${BOLD}${WHITE}WAN: ${RESET}${BOLD}${YELLOW}INCOMING${RESET}"
else
log "${BOLD}${WHITE}WAN: ${RESET}${BOLD}${RED}CLOSED${RESET}"
fi
>&2 echo ""
fi
fi
}
case "$ACTION" in
on)
require_root
enable_lan_only
test_status 1
;;
off)
require_root
enable_normal_internet
test_status 0
;;
priv)
require_root
enable_private_internet
test_status 0
;;
*)
test_status 0
exit 1
;;
esacDas Skript lässt sich leicht auf einem NAS
platzieren. Ohne sich gleich länger in nftables oder
ufwzu versenken, kann man so für Updates und Backups kurz
die Tür öffnen. Wenn unattended-updates
konfiguriert sind, kann das Zeitfenster zunächst fixiert werden, z.B.
auf täglich 23:00:00, mit
systemctl edit apt-daily.timer:
[Timer]
OnCalendar=
OnCalendar=*-*-* 23:00:00
RandomizedDelaySec=0und systemctl edit apt-daily-upgrade.timer
[Timer]
OnCalendar=
OnCalendar=*-*-* 23:05:00
RandomizedDelaySec=0und anschließend kann ein cronjob eingerichet werden mit
sudo crontab -e.
# Tür auf 22:58
58 22 * * * /usr/local/bin/privacy off
# Tür zu 23:30
30 23 * * * /usr/local/bin/privacy onDas ist nicht sehr elegant, aber mit wenigen Handgriffen erledigt.
Tür zu in Window$ ?
So etwas ähnliches könnte man in Window$ versuchen:
# Als Administrator ausführen
$PrivNets = @(
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16"
)
function Enable-LanOnly {
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True
Set-NetFirewallProfile -Profile Domain,Private,Public -DefaultInboundAction Block
Set-NetFirewallProfile -Profile Domain,Private,Public -DefaultOutboundAction Block
foreach ($net in $PrivNets) {
New-NetFirewallRule -DisplayName "Allow Out $net" -Direction Outbound -Action Allow -RemoteAddress $net
New-NetFirewallRule -DisplayName "Allow In $net" -Direction Inbound -Action Allow -RemoteAddress $net
}
}
function Enable-NormalInternet {
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True
Set-NetFirewallProfile -Profile Domain,Private,Public -DefaultInboundAction Block
Set-NetFirewallProfile -Profile Domain,Private,Public -DefaultOutboundAction Allow
}
param(
[ValidateSet("on","off")]
[string]$Action
)
switch ($Action) {
"on" { Enable-LanOnly }
"off" { Enable-NormalInternet }
}
Das ist jedoch recht sinnlos: Window$ gilt seit jeher als ein System, welches ohne aktive Nutzung im Leerlauf vergleichsweise viel mit Micro$oft-Diensten spricht, vor allem wegen Telemetrie, Update- und "Komfortfunktionen". selbst wenn die Firewall streng gesetzt wird, können Windows-Komponenten weiter kommunizieren, weil sie über eigene erlaubte Regeln, Dienste oder Systemfunktionen laufen. Dazu gehören typischerweise:
- Windows Update
- Diagnosedaten
- Telemetriedaten
- Zertifikatsdienste
- Zeitdienste
- andere Microsoft-nahe Systemdienste
Auch bemerkenswert ist der Umstand, dass wenn in der Hosts-Datei von Windows Microsoft- oder Telemetrie-Domains auf 127.0.0.1 umgeleitet werden, dies als Manipulation oder mögliche Umgehung von Schutzfunktionen gedeutet und "korrigiert" wird.