Problembehandlung für Portmangel
Gilt für: Windows 10
TCP- und UDP-Protokolle funktionieren basierend auf Portnummern, die zum Herstellen der Verbindung verwendet werden. Jede Anwendung oder ein Dienst, der eine TCP/UDP-Verbindung herstellen muss, erfordert einen Port auf seiner Seite.
Es gibt zwei Arten von Ports:
- Ephemerale Ports, bei denen es sich um dynamische Ports handelt, sind die Ports, die standardmäßig für jeden Computer eine ausgehende Verbindung herstellen müssen.
- Bekannte Ports sind die definierten Ports für eine bestimmte Anwendung oder einen bestimmten Dienst. Beispielsweise befindet sich der Dateiserverdienst an Port 445, HTTPS ist an 443, HTTP an 80 und RPC an 135. Benutzerdefinierte Anwendungen verfügen außerdem über eigene definierte Portnummern.
Wenn eine Verbindung mit einer Anwendung oder einem Dienst hergestellt wird, verwenden Clientgeräte einen kurzlebigen Port vom Gerät, um eine Verbindung mit einem bekannten Port herzustellen, der für diese Anwendung oder diesen Dienst definiert ist. Ein Browser auf einem Clientcomputer verwendet einen kurzlebigen Port, um eine Verbindung mit Port 443 herzustellen https://www.microsoft.com
.
In einem Szenario, in dem derselbe Browser viele Verbindungen zu mehreren Websites erstellt, wird für jede neue Verbindung, die der Browser versucht, ein kurzlebiger Port verwendet. Nach einiger Zeit werden Sie feststellen, dass die Verbindungen fehlschlagen werden, und eine hohe Möglichkeit für diesen Fehler wäre, da der Browser alle verfügbaren Ports verwendet hat, um Verbindungen außerhalb herzustellen, und jeder neue Versuch, eine Verbindung herzustellen, fehlschlägt, da keine weiteren Ports verfügbar sind. Wenn alle Ports auf einem Computer verwendet werden, bezeichnen wir sie als Portausschöpfung.
Standardmäßiger dynamischer Portbereich für TCP/IP
Um die Empfehlungen der Internet Assigned Numbers Authority (IANA) einzuhalten, hat Microsoft den dynamischen Clientportbereich für ausgehende Verbindungen erhöht. Der neue Standardstartport ist 49152, und der neue Standardendport ist 65535. Diese Erhöhung ist eine Änderung der Konfiguration früherer Versionen von Windows, die einen Standardportbereich von 1025 bis 5000 verwendet haben.
Sie können den dynamischen Portbereich auf einem Computer anzeigen, indem Sie die folgenden netsh
Befehle verwenden:
-
netsh int ipv4 show dynamicport tcp
-
netsh int ipv4 show dynamicport udp
-
netsh int ipv6 show dynamicport tcp
-
netsh int ipv6 show dynamicport udp
Der Bereich wird für jeden Transport (TCP oder UDP) separat festgelegt. Der Portbereich ist jetzt ein Bereich, der über einen Startpunkt und einen Endpunkt verfügt. Microsoft-Kunden, die Server bereitstellen, die Windows Server ausführen, können Probleme haben, die die RPC-Kommunikation zwischen Servern beeinträchtigen, wenn Firewalls im internen Netzwerk verwendet werden. In diesen Fällen wird empfohlen, die Firewalls neu zu konfigurieren, um datenverkehr zwischen Servern im dynamischen Portbereich von 49152 bis 65535 zuzulassen. Dieser Bereich ist zusätzlich zu bekannten Ports, die von Diensten und Anwendungen verwendet werden. Oder der Portbereich, der von den Servern verwendet wird, kann auf jedem Server geändert werden. Sie passen diesen Bereich mithilfe des Netsh-Befehls wie folgt an. Der obige Befehl legt den dynamischen Portbereich für TCP fest.
netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range
Der Startport ist "Number", und die Gesamtanzahl der Ports ist Bereich. Im Folgenden sind Beispielbefehle aufgeführt:
-
netsh int ipv4 set dynamicport tcp start=10000 num=1000
-
netsh int ipv4 set dynamicport udp start=10000 num=1000
-
netsh int ipv6 set dynamicport tcp start=10000 num=1000
-
netsh int ipv6 set dynamicport udp start=10000 num=1000
Diese Beispielbefehle legen den dynamischen Portbereich so fest, dass er bei Port 10000 beginnt und an Port 10999 (1000 Ports) endet. Der minimale Bereich von Ports, der festgelegt werden kann, ist 255. Der minimale Startport, der festgelegt werden kann, ist 1025. Der maximale Endport (basierend auf dem konfigurierten Bereich) darf 65535 nicht überschreiten. Um das Standardverhalten von Windows Server 2003 zu duplizieren, verwenden Sie 1025 als Startport, und verwenden Sie dann 3976 als Bereich für TCP und UDP. Dieses Verwendungsmuster führt zu einem Startport von 1025 und einem Endport von 5000.
Insbesondere für ausgehende Verbindungen, da eingehende Verbindungen keinen ephemeralen Port für die Annahme von Verbindungen erfordern.
Da ausgehende Verbindungen mit einem Fehler beginnen, werden viele Instanzen der folgenden Verhaltensweisen angezeigt:
Die Anmeldung beim Computer mit Domänenanmeldeinformationen ist nicht möglich, die Anmeldung mit einem lokalen Konto funktioniert jedoch. Bei der Domänenanmeldung müssen Sie sich mit dem DC für die Authentifizierung in Verbindung setzen, was wiederum eine ausgehende Verbindung ist. Wenn Sie Anmeldeinformationen zwischenspeichern, funktioniert die Domänenanmeldung möglicherweise noch.
Fehler bei Aktualisierung der Gruppenrichtlinie:
Kein Zugriff auf Dateifreigaben möglich:
RDP vom betroffenen Server schlägt fehl:
Jede andere Anwendung, die auf dem Computer ausgeführt wird, gibt Fehler aus.
Durch den Neustart des Servers wird das Problem vorübergehend behoben, aber alle Symptome werden nach einer bestimmten Zeit wieder angezeigt.
Wenn Sie vermuten, dass sich der Computer in einem Zustand der Portausschöpfung befindet:
Versuchen Sie, eine ausgehende Verbindung herzustellen. Greifen Sie vom Server/Computer auf eine Remotefreigabe zu, oder versuchen Sie es mit einem RDP auf einen anderen Server oder telnet auf einen Server auf einem Port. Wenn die ausgehende Verbindung für alle diese Optionen fehlschlägt, fahren Sie mit dem nächsten Schritt fort.
Öffnen Sie die Ereignisanzeige, und suchen Sie unter den Systemprotokollen nach den Ereignissen, die eindeutig den aktuellen Zustand angeben:
Ereignis-ID 4227
Ereignis-ID 4231
Sammeln Sie eine
netstat -anob
Ausgabe vom Server. Die Netstat-Ausgabe zeigt Ihnen eine große Anzahl von Einträgen für TIME_WAIT Zustand für eine einzelne PID.Nach einer ordnungsgemäßen Schließung oder einer abrupten Schließung einer Sitzung, nach einem Zeitraum von 4 Minuten (Standard), wird der vom Prozess oder der Anwendung verwendete Port wieder in den verfügbaren Pool freigegeben. Während dieser 4 Minuten lautet der TCP-Verbindungsstatus TIME_WAIT. In einer Situation, in der Sie die Portausschöpfung vermuten, kann eine Anwendung oder ein Prozess nicht alle ports freigeben, die sie verbraucht hat, und verbleiben im TIME_WAIT Zustand.
Möglicherweise werden auch CLOSE_WAIT Zustandsverbindungen in derselben Ausgabe angezeigt; CLOSE_WAIT Zustand ist jedoch ein Zustand, wenn eine Seite des TCP-Peers keine daten mehr zu senden (FIN gesendet) hat, aber Daten vom anderen Ende empfangen kann. Dieser Zustand zeigt nicht unbedingt die Portausschöpfung an.
Notiz
Wenn große Verbindungen in TIME_WAIT Zustand vorhanden sind, wird nicht immer angegeben, dass der Server derzeit nicht über Ports verfügt, es sei denn, die ersten beiden Punkte werden überprüft. Wenn viele Verbindungen im TIME_WAIT-Zustand vorhanden sind, deutet dies darauf hin, dass der Prozess viele TCP-Verbindungen erstellt und schließlich möglicherweise zur Portauslastung führen kann.
Netstat wurde in Windows 10 mit dem Hinzufügen des
-Q
Switchs aktualisiert, um Ports anzuzeigen, die außerhalb der Zeit abgelaufen sind, wie im BOUND-Zustand. Es wurde ein Update für Windows 8.1 Windows Server 2012 R2 veröffentlicht, das diese Funktionalität enthält. Das PowerShell-CmdletGet-NetTCPConnection
in Windows 10 zeigt auch diese BOUND-Ports an.Bis Oktober 2016 war netstat ungenau. Fixes für netstat, back-ported to 2012 R2, allowed Netstat.exe and
Get-NetTcpConnection
to korrekt report TCP or UDP port usage in Windows Server 2012 R2. Weitere Informationen finden Sie unter Windows Server 2012 R2: Ephemeral Ports Hotfixes .Öffnen Sie eine Eingabeaufforderung im Administratormodus, und führen Sie den folgenden Befehl aus.
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
Öffnen Sie die Datei "server.etl " mit Netzwerkmonitor , und wenden Sie im Filterabschnitt den Filter
Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209
an. Einträge, die STATUS_TOO_MANY_ADDRESSES sagen, sollten angezeigt werden. Wenn Sie keine Einträge finden, befindet sich der Server immer noch nicht außerhalb der Ports. Wenn Sie Einträge finden, können Sie bestätigen, dass bei dem Server Portauslastung vorliegt.
Beheben von Problemen bei der Portauslastung
Entscheidend ist die Feststellung, welcher Prozess oder welche Anwendung alle Ports auslastet. Im Folgenden sind einige der Tools aufgeführt, mit denen Sie einzelne Prozesse isolieren können:
Methode 1
Sehen Sie sich zunächst die netstat-Ausgabe an. Wenn Sie Windows 10 oder Windows Server 2016 verwenden, können Sie den Befehl netstat -anobq
ausführen und nach der Prozess-ID suchen, die maximale Einträge als BOUND enthält. Alternativ dazu können Sie auch den folgenden PowerShell-Befehl ausführen, um den Prozess zu identifizieren:
Get-NetTCPConnection | Group-Object -Property State, OwningProcess | Select -Property Count, Name, @{Name="ProcessName";Expression={(Get-Process -PID ($_.Name.Split(',')[-1].Trim(' '))).Name}}, Group | Sort Count -Descending
Die meisten Portverluste werden durch Benutzermodusprozesse verursacht, die die Ports nicht ordnungsgemäß schließen, wenn ein Fehler erkannt wurde. Auf Benutzermodusebene werden Ports (tatsächlich Sockets) behandelt. Sowohl TaskManager als auch ProcessExplorer können Handle-Anzahlen anzeigen, mit denen Sie ermitteln können, welcher Prozess alle Ports verwendet.
Für Windows 7 und Windows Server 2008 R2 können Sie ein Update für Ihre PowerShell-Version durchführen, damit sie das obige Cmdlet enthält.
Methode 2
Wenn Methode 1 Ihnen nicht hilft, den Prozess zu identifizieren (vor Windows 10 und Windows Server 2012 R2), sehen Sie sich den Task-Manager an:
Fügen Sie eine Spalte namens "Handles" unter Details/Prozessen hinzu.
Sortieren Sie die Spalte „Handles“, um den Prozess mit der höchsten Anzahl von Handles zu identifizieren. In der Regel könnte der Prozess mit Handles größer als 3000 der Schuldige sein, mit Ausnahme von Prozessen wie System, lsass.exe, store.exe, sqlsvr.exe.
Wenn ein anderer Prozess als diese Prozesse eine höhere Zahl aufweist, beenden Sie diesen Vorgang, und versuchen Sie dann, sich mit Domänenanmeldeinformationen anzumelden und festzustellen, ob er erfolgreich ist.
Methode 3
Wenn Der Task-Manager Ihnen nicht dabei hilft, den Prozess zu identifizieren, verwenden Sie den Prozess-Explorer, um das Problem zu untersuchen.
Schritte zur Verwendung des Prozess-Explorers:
Laden Sie den Prozess-Explorer herunter, und führen Sie ihn mit erhöhten Rechten aus.
ALT+ wählen Sie die Spaltenüberschrift aus, wählen Sie "Spalten auswählen" aus, und fügen Sie auf der Registerkarte "Prozessleistung" "Handle Count" hinzu.
Wählen Sie "Ansicht>anzeigen" aus.
Wählen Sie "Untere Ansichtsansichtsziehpunkte>">aus.
Wählen Sie die Spalte "Handles" aus, um nach diesem Wert zu sortieren.
Untersuchen Sie die Prozesse, deren Handleanzahl höher ist als die der anderen (wahrscheinlich über 10.000, wenn Sie keine ausgehenden Verbindungen herstellen können).
Klicken Sie auf einen der Prozesse mit einer hohen Handleanzahl, um ihn hervorzuheben.
Im unteren Bereich sind die wie unten aufgeführten Handles Sockets. (Sockets sind technisch gesehen Dateihandles).
Datei\Gerät\AFD
Einige sind normal, aber viele davon sind nicht (Hunderte bis Tausende). Schließen Sie den fraglichen Prozess. Wenn die ausgehende Konnektivität wiederhergestellt wird, haben Sie sich weiter als Ursache erwiesen. Wenden Sie sich an den Anbieter dieser App.
Wenn Ihnen die oben genannten Methoden nicht dabei helfen, den Prozess zu isolieren, empfehlen wir, ein vollständiges Speicherabbild des Computers im Problemzustand zu sammeln. Das Speicherabbild gibt an, welcher Prozess über die meisten Handles verfügt.
Als Problemumgehung wird das Neustarten des Computers wieder in den normalen Zustand versetzt und hilft Ihnen, das Problem vorerst zu beheben. Wenn ein Neustart jedoch unpraktisch ist, können Sie auch die Anzahl der Ports auf dem Computer erhöhen, indem Sie die folgenden Befehle verwenden:
netsh int ipv4 set dynamicport tcp start=10000 num=1000
Mit diesem Befehl wird der dynamische Portbereich so festgelegt, dass er am Port 10000 beginnt und am Port 10999 (1000 Ports) endet. Der minimale Bereich von Ports, der festgelegt werden kann, ist 255. Der minimale Startport, der festgelegt werden kann, ist 1025. Der maximale Endport (basierend auf dem konfigurierten Bereich) darf 65535 nicht überschreiten.
Notiz
Beachten Sie, dass das Erhöhen des dynamischen Portbereichs keine dauerhafte Lösung, sondern nur vorübergehend ist. Sie müssen ermitteln, welche Prozesse/Prozessoren die maximale Anzahl von Ports und Problembehandlungen aus diesem Prozess verwenden, um zu ermitteln, warum diese hohe Anzahl von Ports verbraucht wird.
Für Windows 7 und Windows Server 2008 R2 können Sie das folgende Skript verwenden, um die Netstat-Ausgabe mit definierter Häufigkeit zu erfassen. Aus den Ausgaben können Sie den Trend zur Portnutzung sehen.
@ECHO ON
set v=%1
:loop
set /a v+=1
ECHO %date% %time% >> netstat.txt
netstat -ano >> netstat.txt
PING 1.1.1.1 -n 1 -w 60000 >NUL
goto loop
Weitere Informationen
- Portausschöpfung und Sie! - Dieser Artikel enthält ein Detail zu netstat-Zuständen und wie Sie die Netstat-Ausgabe verwenden können, um den Portstatus zu bestimmen.
- Erkennen der ephemeren Portausschöpfung: Dieser Artikel enthält ein Skript, das in einer Schleife ausgeführt wird, um den Portstatus zu melden. (Gilt für Windows 2012 R2, Windows 8, Windows 10 und Windows 11)