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:

#!/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
    ;;
esac

Das 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=0

und systemctl edit apt-daily-upgrade.timer

[Timer]
OnCalendar=
OnCalendar=*-*-* 23:05:00
RandomizedDelaySec=0

und 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 on

Das 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:

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.


Zurück zur Hauptseite