Alle Beispiele mit fiktiven Daten: Server beispielserver.example.com.
Ausgangslage
Am Morgen meldete der tägliche Health-Check eines frisch eingerichteten Debian-13-Servers:
[WARN] unexpected public port 5355 listening
Port 5355 hatten wir bei der Einrichtung nicht geöffnet und für den Server auch nicht vorgesehen.
Die erste Frage war deshalb nicht, wie wir den Port schließen, sondern: Welches Programm hat ihn überhaupt geöffnet?
1. Listener und Prozess identifizieren
ss zeigt mit den passenden Optionen nicht nur die offenen Listener, sondern auch den zugehörigen Prozess:
sudo ss -lntup | grep ':5355'
Auf dem Server ergab das:
udp UNCONN 0 0 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=384,fd=11))
udp UNCONN 0 0 [::]:5355 [::]:* users:(("systemd-resolve",pid=384,fd=13))
tcp LISTEN 0 4096 0.0.0.0:5355 0.0.0.0:* users:(("systemd-resolve",pid=384,fd=12))
tcp LISTEN 0 4096 [::]:5355 [::]:* users:(("systemd-resolve",pid=384,fd=14))
Damit war der Verursacher klar: systemd-resolved.
Der Dienst lauschte auf Port 5355 sowohl über TCP als auch UDP und jeweils auf allen IPv4- und IPv6-Adressen.
2. Ursache prüfen
Port 5355 wird von LLMNR (Link-Local Multicast Name Resolution) verwendet.
Zunächst haben wir geprüft, ob LLMNR auf dem Server ausdrücklich konfiguriert worden war:
grep -R '^[[:space:]]*LLMNR' \
/etc/systemd/resolved.conf \
/etc/systemd/resolved.conf.d/ 2>/dev/null
Keine Ausgabe - wir hatten dafür keine eigene Konfiguration angelegt.
Der tatsächliche Zustand von systemd-resolved ließ sich mit resolvectl prüfen:
resolvectl status
Auszug:
Global
Protocols: +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (ens18)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
LLMNR war also aktiv, obwohl wir es bei der Servereinrichtung nicht selbst konfiguriert hatten.
3. LLMNR gezielt deaktivieren
systemd-resolved selbst wird weiterhin für die DNS-Auflösung benötigt. Deshalb haben wir nicht den ganzen Dienst abgeschaltet, sondern nur die nicht benötigte LLMNR-Funktion.
Dafür ein eigenes Drop-in-Verzeichnis anlegen:
sudo mkdir -p /etc/systemd/resolved.conf.d
Dann beispielsweise /etc/systemd/resolved.conf.d/10-disable-llmnr.conf anlegen:
[Resolve]
LLMNR=no
Anschließend systemd-resolved neu starten:
sudo systemctl restart systemd-resolved
4. Konfiguration verifizieren
Zuerst erneut den Resolver-Status prüfen:
resolvectl status
Danach zeigte der Server:
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (ens18)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
LLMNR ist jetzt sowohl global als auch auf dem Netzwerkinterface deaktiviert.
Entscheidend ist aber der tatsächliche Listener. Deshalb zum Abschluss noch einmal:
sudo ss -lntup | grep ':5355'
Keine Ausgabe mehr - Port 5355 ist geschlossen.
systemd-resolved bleiben dabei erhalten. Mit LLMNR=no wird nicht die DNS-Auflösung deaktiviert, sondern nur LLMNR.
Der Health-Check dahinter
Der Fund kam nicht aus einem gezielten Scan nach LLMNR. Der tägliche Health-Check vergleicht öffentliche Listener mit den Ports, die auf dem Server erwartet werden.
Dadurch fiel Port 5355 überhaupt erst auf:
[WARN] unexpected public port 5355 listening
Der Check soll künftig zusätzlich die Firewall-Regeln berücksichtigen. Dann lässt sich besser unterscheiden, ob ein unerwarteter Listener durch die Firewall bereits blockiert wird oder tatsächlich über einen freigegebenen Port erreichbar ist.
Den verwendeten Debian Health Check findet ihr im öffentlichen Lazy Admin Tools Repository. Das Projekt wird zusätzlich auf GitHub gespiegelt.
Ergebnis
Health-Check-Warnung → Listener mit ss identifiziert → systemd-resolved als Ursache gefunden → LLMNR mit resolvectl bestätigt → gezielt deaktiviert → Port 5355 verschwunden.
Kein großes Tutorial über systemd-resolved oder LLMNR, sondern ein kleiner Fund aus dem täglichen Serverbetrieb - und genau der Grund, warum der Health-Check nicht nur bekannte Dienste, sondern auch unerwartete öffentliche Listener im Blick behält.