← Alle Beiträge
Sicherheit und Betrieb//10 Min. Lesezeit

WSUS Downloads hinter Caddy gezielt untersuchen

Die Updatesuche funktionierte, der Download blieb stehen. Wie Graylog, das Windows-Updateprotokoll und ein Range-Test die abweichende Content-Adresse zeigten und der alternative Downloadserver den Fehler auf dem Testclient behob.

Windows Update fand neue Updates, zeigte sie an und meldete regelmässig seinen Status. Trotzdem blieb ein Download hängen. Weil der Zugang über einen Caddy-Reverse-Proxy lief, lag der erste Verdacht beim Proxy: Verbindungen, Zeitlimits, vielleicht ein Problem mit grösseren Dateien.

Die entscheidende Spur lag jedoch in der Adresse, die Windows tatsächlich für die Installationsdatei verwendete. Die Updatesuche lief bereits über den neuen HTTPS-Zugang. Der Dateiabruf versuchte weiterhin den bisherigen HTTP-Downloadzugang zu erreichen. Dieser Zugang antwortete beim Test nicht.

Wir haben den Fehler mit Graylog, dem Windows-Updateprotokoll und zwei vergleichbaren Dateiabrufen eingegrenzt. Die Korrektur bestand darin, den erreichbaren Proxy auch als alternativen Downloadserver einzutragen. Auf dem untersuchten Client wurden Download und Installation danach erfolgreich abgeschlossen.

Alle Hostnamen, Dateinamen und frei gewählten Pfade in den folgenden Beispielen sind Platzhalter. Der Artikel beschreibt die untersuchte Konfiguration und ihre Abnahme im Oktober 2026.

Warum Updatesuche und Download getrennt betrachtet werden müssen

Ein Update besteht aus Informationen über seine Anwendbarkeit und den eigentlichen Installationsdateien. Ein Client kann deshalb erfolgreich mit WSUS kommunizieren, ohne die benötigten Dateien erreichen zu können.

In unserem Aufbau war der öffentliche HTTPS-Zugang auf Caddy eingerichtet. Caddy leitete die Anfragen intern an den WSUS-Webserver weiter. Die Clientrichtlinie enthielt bereits den neuen Proxy-Namen für die Updatesuche und das Reporting. Für einen Download verwendete der Client dennoch eine Content-URL über den bisherigen HTTP-Downloadzugang.

Vereinfacht sah die Situation so aus:

Updatesuche und Reporting
Client -> https://updates-proxy.example.net:443 -> Caddy -> WSUS
Ergebnis: HTTP 200

Dateiabruf vor der Korrektur
Client -> bisheriger HTTP-Downloadzugang -> /Content/...
Ergebnis: Verbindungs-Timeout

Diese Trennung ist bei der Fehlersuche wichtig. Microsoft beschreibt für WSUS unterschiedliche Verbindungen für Metadaten und Update-Dateien. Eine erfolgreiche TLS-Verbindung zum Suchdienst belegt daher noch keinen funktionierenden Content-Zugang. Die konkrete URL muss am Client geprüft werden. Microsoft zur WSUS-Konfiguration

Zuerst den Proxyzustand prüfen

Zu Beginn aktualisierten wir das Caddy-Containerimage innerhalb der verwendeten Versionsreihe. Dabei blieben Konfiguration, Netzwerkzuordnung und persistente Mounts erhalten. Anschliessend zeigte Portainer den Stack mit aktuellem Imageindikator an.

Damit war der Softwarestand als Ausgangspunkt geklärt. Daraus folgte aber noch keine Erklärung für den Downloadfehler. Eine grüne Imageanzeige beschreibt den Imagezustand; sie prüft keine Update-Datei vom Client bis zum Ziel.

Wir stiessen deshalb auf einem betroffenen Client einen neuen Updateversuch an und untersuchten dessen Anfragen. So liessen sich aktuelle Meldungen vom allgemeinen Hintergrundverkehr trennen.

Was die Caddy-Zugriffe in Graylog zeigten

Die HTTP-Zugriffslogs von Caddy liefen bereits zentral in Graylog ein. Unsere Verarbeitung extrahiert unter anderem Hostname, Client-IP, URI, Statuscode, Antwortgrösse und Dauer aus dem JSON-Zugriffslog. Die folgenden Feldnamen stammen aus dieser eigenen Verarbeitung; andere Installationen können sie anders benennen.

Für den ersten Überblick verwendeten wir einen begrenzten Zeitraum rund um den Test und diese Suche:

http_host:"updates-proxy.example.net"

Interessant waren dabei diese Felder:

timestamp
client_ip
http_uri
http_status
http_duration_ms
http_response_bytes

Wir exportierten zunächst alle Statuscodes. Wer sofort nur Fehler ab HTTP 400 betrachtet, übersieht möglicherweise Antworten, die bereits mit 200 oder 206 begonnen haben, deren Übertragung aber nicht vollständig war.

Der untersuchte Export enthielt 56 Anfragen. Davon wurden 36 mit HTTP 200 beantwortet. Weitere 20 erhielten HTTP 403 und gehörten zu einer anderen öffentlichen Quell-IP. Diese Ablehnungen passten zur vorgeschalteten IP-Freigabe im Caddy-Routing und blieben ein eigener Befund. Sie durften dem untersuchten Client nicht allein deshalb zugeordnet werden, weil sie im selben Zeitfenster auftraten.

Für den Standort des Testclients sahen wir erfolgreiche Aufrufe der WSUS-Webdienste. Im Export fehlten jedoch Anfragen nach Update-Dateien unter dem Content-Pfad. Das war der Anlass, das Windows-Updateprotokoll auf dem Client zu untersuchen. Der Export war auf den neuen Proxy-Namen gefiltert und konnte Zugriffe auf ein anderes Downloadziel nicht abbilden.

Das Clientprotokoll lieferte die tatsächliche Downloadadresse

Zunächst prüften wir Warnungen und Fehler im Windows-Update-Ereignisprotokoll. Im gewählten Zeitraum gab es keine passenden Einträge. Auch die Abfrage laufender BITS-Aufträge blieb leer.

Beides zusammen genügte nicht als Aussage über den Downloadzustand. Das ausführliche Windows-Updateprotokoll zeigte anschliessend, dass der betroffene Auftrag Delivery Optimization verwendete. Eine leere BITS-Liste erfasst diesen Auftrag nicht.

Das lesbare Protokoll erzeugten wir in einer administrativen PowerShell:

Get-WindowsUpdateLog -LogPath "$env:PUBLIC\WindowsUpdate-Diagnose.log"

Darin fanden wir den fehlgeschlagenen Download einer WebView2-Installationsdatei. Der Fehlercode lautete 0x80D02002. Die Microsoft-Fehlerdefinition bezeichnet ihn als DO_E_DOWNLOAD_NO_PROGRESS: Innerhalb des vorgesehenen Zeitraums machte der Dateiabruf keinen Fortschritt. Das Protokoll zeigte rund 220 MB erwartete Daten und null übertragene Bytes. Microsoft-Definition der Delivery-Optimization-Fehler

Neben dem Fehlercode war die vollständige Datei-URL entscheidend. Sie zeigte auf den bisherigen HTTP-Downloadzugang. Auch der neu angestossene Auftrag verwendete dieses Ziel. Die Updatesuche nutzte dagegen bereits den neuen HTTPS-Proxy.

Damit hatten wir einen konkreten Ansatzpunkt: Dieselbe Datei über beide Zugänge testen, statt weitere allgemeine Änderungen an Caddy vorzunehmen.

Dieselbe Datei mit einem Range Request vergleichen

Für den Vergleich forderten wir nur die ersten 1024 Bytes der betroffenen Datei an. Die Beispiele verwenden einen neutralisierten Dateinamen; in einer eigenen Untersuchung müssen hier der exakte Pfad und die vollständige bisherige Download-URL aus dem Clientprotokoll eingesetzt werden.

$pfad = '/Content/AB/BEISPIELDATEI.exe'
$bisherigeDateiUrl = '<vollstaendige Download-URL aus dem Clientprotokoll>'

curl.exe --connect-timeout 10 --max-time 20 --range 0-1023 `
    --dump-header - --output NUL $bisherigeDateiUrl

curl.exe --connect-timeout 10 --max-time 20 --range 0-1023 `
    --dump-header - --output NUL "https://updates-proxy.example.net$pfad"

Beim ersten Aufruf lief bereits der Verbindungsaufbau nach zehn Sekunden in einen Timeout. Über den neuen Proxy wurde dieselbe Datei mit HTTP 206 Partial Content beantwortet. Die Antwort enthielt Accept-Ranges: bytes, eine Content-Length von 1024 und einen dazu passenden Content-Range.

Die Range-Angabe ist eine Anforderung an den Server. Ein Server kann sie ignorieren und die gesamte Datei senden; deshalb begrenzten wir zusätzlich die Laufzeit und prüften die tatsächlichen Antwortheader. Bei unserem Test wurden genau die angeforderten 1024 Bytes übertragen.

Dieser Vergleich belegte die Erreichbarkeit der Datei über den Proxy und einen funktionierenden Teilabruf. Den vollständigen Download mussten wir anschliessend weiterhin mit Windows Update prüfen. Die genaue Sperrstelle am bisherigen Zugang war durch den Timeout allein ebenfalls noch nicht bestimmt.

Den Proxy als alternativen Downloadserver setzen

Die Korrektur nutzte die Windows-Update-Einstellung für einen alternativen Downloadserver. Sie weist den Updateclient an, die Dateien über den angegebenen Server zu beziehen. In unserem Fall konnte Caddy die vorhandenen Content-Pfade bereits korrekt weiterleiten. Microsoft zum alternativen Downloadserver

Für einen einzelnen Testclient sicherten wir zuerst den bestehenden Windows-Update-Richtlinienzweig. Danach ergänzten wir den Wert UpdateServiceUrlAlternate als REG_SZ. Der folgende Befehl zeigt die eigentliche Änderung mit einer Beispieladresse; die Eingabeaufforderung muss als Administrator laufen.

reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v UpdateServiceUrlAlternate /t REG_SZ /d "https://updates-proxy.example.net" /f

Wir trugen die Basisadresse ein, ohne einen zusätzlichen Content-Pfad anzuhängen. Suche und Reporting behielten ihre bestehenden Adressen. Die Option FillEmptyContentUrls benötigten wir nicht: Die Metadaten enthielten bereits eine Datei-URL, deren Zugangsweg hier ersetzt werden sollte.

Nach der Änderung starteten wir den Windows-Update-Dienst auf dem Testclient neu und stiessen den Updateversuch erneut an. Der Download wurde vollständig abgeschlossen. Anschliessend lief auch die Installation erfolgreich durch. Damit ging die Abnahme über den vorherigen Teilabruf hinaus.

Die Einstellung dauerhaft verteilen

Für verwaltete Clients gehört diese Konfiguration in die zuständige Gruppenrichtlinie. In der Richtlinie zur Angabe des internen Microsoft-Updatedienstes lässt sich der alternative Downloadserver als zusätzlicher Wert hinterlegen. Wenn die verwendete Verwaltungsoberfläche dieses Feld nicht anbietet, kann derselbe Registrywert über eine Registrierungseinstellung der Gruppenrichtlinien-Einstellungen verteilt werden.

Wir wählten dafür die Aktion Aktualisieren, die Struktur HKEY_LOCAL_MACHINE, den Schlüssel SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate und den benannten Zeichenfolgenwert UpdateServiceUrlAlternate. Dabei muss tatsächlich der benannte Wert angelegt werden; der Standardwert des Schlüssels erfüllt diese Aufgabe nicht.

Für Geräte ausserhalb einer Domäne lässt sich der Wert lokal setzen. Entscheidend bleibt, dass deren übrige WSUS-Konfiguration und die Zugriffsfreigabe am Proxy ebenfalls passen. Der Eintrag allein richtet keinen vollständigen WSUS-Client ein.

Nach der Richtlinienaktualisierung kontrollierten wir den Wert mit:

reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v UpdateServiceUrlAlternate

Ein bereits manuell korrigierter Pilotclient beweist dabei noch keine zentrale Verteilung. Dafür ist die Kontrolle auf einem weiteren Gerät erforderlich. Auch bestehende Downloadaufträge können noch die vorherige URL enthalten. Bleibt ein Auftrag hängen, prüfen wir deshalb dessen aktuelle Adresse erneut, bevor wir Caches oder Warteschlangen zurücksetzen.

Die beiden TLS Verbindungen unterscheiden

Bei einem Reverse-Proxy müssen die Verbindung zum Client und die Verbindung zum Backend getrennt betrachtet werden. Eine erfolgreiche HTTPS-Verbindung zum Proxy beschreibt zunächst nur die erste Strecke. Der Transport zum Backend wird unabhängig davon konfiguriert und geprüft.

Client -- HTTPS --> Caddy -- separate Backendverbindung --> WSUS

Der Registryeintrag verschlüsselt nicht automatisch die zweite Strecke. Er wählt den Downloadzugang des Clients. Wer zusätzlich die Backendverbindung mit HTTPS betreiben möchte, muss dafür Zertifikat und Vertrauen auf Caddy einrichten. Die externen Clients sehen weiterhin nur das Frontendzertifikat des Proxys und brauchen deshalb nicht allein wegen dieses Backendwechsels die interne CA. Caddy zu HTTPS-Upstreams

Was wir bei der nächsten Umstellung prüfen

Eine erreichbare WSUS-Webservice-Seite ist ein sinnvoller Verbindungstest. Für die Abnahme einer Umstellung reicht sie uns künftig nicht mehr. Dazu gehören die tatsächliche Datei-URL auf dem Client, ein erfolgreicher Content-Abruf und ein vollständiger Update-Download mit anschliessender Installation.

In diesem Fall führte uns die Kombination der Werkzeuge zur Korrektur: Graylog zeigte funktionierende Webservice-Aufrufe und einen getrennten Freigabefehler. Das Clientprotokoll zeigte den Downloadauftrag und sein abweichendes Ziel. Der Vergleich derselben Datei machte den Unterschied der beiden Zugänge sichtbar.

Der Proxy konnte die Datei liefern. Windows musste diesen Zugang auch für den Download verwenden. Genau diese Lücke schloss der alternative Downloadserver auf dem getesteten Client.

Erfahrungsbericht · Stand Oktober 2026 · Aus interner Dokumentation zusammengefasst und anonymisiert.