Problemen met poortuitputting oplossen
Van toepassing op: Windows 10
TCP- en UDP-protocollen werken op basis van poortnummers die worden gebruikt voor het tot stand brengen van verbinding. Elke toepassing of een service die een TCP/UDP-verbinding tot stand moet brengen, vereist een poort aan de zijkant.
Er zijn twee typen poorten:
- Tijdelijke poorten, die dynamische poorten zijn, zijn de set poorten die elke computer standaard nodig heeft om een uitgaande verbinding te maken.
- Bekende poorten zijn de gedefinieerde poorten voor een bepaalde toepassing of service. De bestandsserverservice is bijvoorbeeld op poort 445, HTTPS is 443, HTTP is 80 en RPC is 135. Aangepaste toepassingen hebben ook hun eigen gedefinieerde poortnummers.
Wanneer een verbinding tot stand wordt gebracht met een toepassing of service, gebruiken clientapparaten een tijdelijke poort van het apparaat om verbinding te maken met een bekende poort die is gedefinieerd voor die toepassing of service. Een browser op een clientcomputer gebruikt een tijdelijke poort om verbinding mee https://www.microsoft.com
te maken op poort 443.
In een scenario waarin dezelfde browser veel verbindingen met meerdere websites maakt, wordt voor elke nieuwe verbinding die de browser probeert, een tijdelijke poort gebruikt. Na enige tijd zult u merken dat de verbindingen mislukken en dat een hoge mogelijkheid voor deze fout zou zijn omdat de browser alle beschikbare poorten heeft gebruikt om verbindingen buiten te maken en een nieuwe poging om een verbinding tot stand te brengen mislukt omdat er geen poorten meer beschikbaar zijn. Wanneer alle poorten op een computer worden gebruikt, wordt dit aangeduid als poortuitputting.
Standaard dynamisch poortbereik voor TCP/IP
Om te voldoen aan IANA-aanbevelingen (Internet Assigned Numbers Authority), heeft Microsoft het dynamische poortbereik van de client verhoogd voor uitgaande verbindingen. De nieuwe standaardstartpoort is 49152 en de nieuwe standaardpoort is 65535. Deze toename is een wijziging ten opzichte van de configuratie van eerdere versies van Windows die een standaardpoortbereik van 1025 tot en met 5000 gebruikt.
U kunt het dynamische poortbereik op een computer weergeven met behulp van de volgende netsh
opdrachten:
-
netsh int ipv4 show dynamicport tcp
-
netsh int ipv4 show dynamicport udp
-
netsh int ipv6 show dynamicport tcp
-
netsh int ipv6 show dynamicport udp
Het bereik wordt afzonderlijk ingesteld voor elk transport (TCP of UDP). Het poortbereik is nu een bereik met een begin- en eindpunt. Microsoft-klanten die servers met Windows Server implementeren, hebben mogelijk problemen die van invloed zijn op RPC-communicatie tussen servers als firewalls worden gebruikt in het interne netwerk. In deze situaties wordt u aangeraden de firewalls opnieuw te configureren om verkeer tussen servers in het dynamische poortbereik van 49152 tot en met 65535 toe te staan. Dit bereik is naast bekende poorten die worden gebruikt door services en toepassingen. Of het poortbereik dat door de servers wordt gebruikt, kan op elke server worden gewijzigd. U past dit bereik als volgt aan met behulp van de netsh-opdracht. Met de bovenstaande opdracht wordt het dynamische poortbereik voor TCP ingesteld.
netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range
De beginpoort is een getal en het totale aantal poorten is bereik. Hier volgen voorbeeldopdrachten:
-
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
Met deze voorbeeldopdrachten stelt u het dynamische poortbereik in op poort 10000 en eindigt u op poort 10999 (1000 poorten). Het minimale bereik van poorten dat kan worden ingesteld, is 255. De minimale beginpoort die kan worden ingesteld, is 1025. De maximale eindpoort (op basis van het bereik dat wordt geconfigureerd) mag niet groter zijn dan 65535. Als u het standaardgedrag van Windows Server 2003 wilt dupliceren, gebruikt u 1025 als de startpoort en gebruikt u vervolgens 3976 als het bereik voor zowel TCP als UDP. Dit gebruikspatroon resulteert in een beginpoort van 1025 en een eindpoort van 5000.
Voor uitgaande verbindingen als binnenkomende verbindingen is geen tijdelijke poort vereist voor het accepteren van verbindingen.
Omdat uitgaande verbindingen mislukken, ziet u veel exemplaren van het onderstaande gedrag:
Kan niet aanmelden bij de computer met domeinreferenties, maar aanmelden met een lokaal account werkt wel. Als u zich aanmeldt bij het domein, moet u contact opnemen met de domeincontroller voor verificatie. Dit is opnieuw een uitgaande verbinding. Als u referenties in de cache hebt ingesteld, werkt domein aanmelden mogelijk nog steeds.
Groepsbeleid updatefouten:
Bestandsshares zijn niet toegankelijk:
RDP van de betrokken server mislukt:
Alle andere toepassingen die op de computer worden uitgevoerd, geven fouten op
Als de server opnieuw wordt opgestart, wordt het probleem tijdelijk opgelost, maar u ziet dat alle symptomen na een bepaalde periode terugkomen.
Als u vermoedt dat de machine de status van poortuitputting heeft:
Probeer een uitgaande verbinding te maken. Open vanaf de server/computer een externe share of probeer een RDP naar een andere server of telnet naar een server op een poort. Als de uitgaande verbinding voor al deze opties mislukt, gaat u naar de volgende stap.
Open logboeken en zoek onder de systeemlogboeken naar de gebeurtenissen die duidelijk de huidige status aangeven:
Gebeurtenis-id 4227
Gebeurtenis-id 4231
Verzamel een
netstat -anob
uitvoer van de server. In de uitvoer van netstat ziet u een groot aantal vermeldingen voor TIME_WAIT status voor één PID.Na een respijtvolle sluiting of een plotselinge sluiting van een sessie, na een periode van 4 minuten (standaard), wordt de poort die door het proces of de toepassing wordt gebruikt, teruggezet naar de beschikbare groep. Gedurende deze 4 minuten wordt de status van de TCP-verbinding TIME_WAIT status. In een situatie waarin u vermoedt dat poortuitputting, kan een toepassing of proces niet alle poorten vrijgeven die het heeft verbruikt en blijft deze in de status TIME_WAIT.
Mogelijk ziet u ook CLOSE_WAIT statusverbindingen in dezelfde uitvoer; CLOSE_WAIT status is echter een status wanneer aan één kant van de TCP-peer geen gegevens meer moeten worden verzonden (FIN sent), maar wel gegevens van het andere uiteinde kunnen worden ontvangen. Deze status geeft niet noodzakelijkerwijs poortuitputting aan.
Notitie
Het hebben van enorme verbindingen in TIME_WAIT status geeft niet altijd aan dat de server momenteel niet meer poorten heeft, tenzij de eerste twee punten zijn geverifieerd. Veel verbindingsverbindingen TIME_WAIT geven aan dat het proces veel TCP-verbindingen maakt en uiteindelijk kan leiden tot uitputting van de poort.
Netstat is bijgewerkt in Windows 10 met de toevoeging van de
-Q
switch om poorten weer te geven die buiten de tijd hebben gewacht zoals in de STATUS AFHANKELIJK. Er is een update Windows 8.1 en Windows Server 2012 R2 uitgebracht die deze functionaliteit bevat. In de PowerShell-cmdletGet-NetTCPConnection
in Windows 10 worden deze AFHANKELIJKe poorten ook weergegeven.Tot 10-2016 was de netstat onnauwkeurig. Oplossingen voor netstat, back-ported naar 2012 R2, toegestane Netstat.exe en
Get-NetTcpConnection
om het gebruik van TCP- of UDP-poorten correct te rapporteren in Windows Server 2012 R2. Zie Windows Server 2012 R2: Tijdelijke poorten hotfixes voor meer informatie.Open een opdrachtprompt in de beheermodus en voer de onderstaande opdracht uit.
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
Open het bestand server.etl met Network Monitor en pas in de filtersectie het filter
Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209
toe. Als het goed is, ziet u vermeldingen met de tekst STATUS_TOO_MANY_ADDRESSES. Als u geen vermeldingen vindt, is de server nog steeds niet buiten de poorten. Als u ze vindt, kunt u controleren of de server onder poortuitputting is.
Problemen met poortuitputting oplossen
Het belangrijkste is om te bepalen welk proces of welke toepassing alle poorten gebruikt. Hieronder vindt u enkele van de hulpprogramma's die u kunt gebruiken om te isoleren tot één proces
Methode 1
Kijk eerst naar de netstat-uitvoer. Als u Windows 10 of Windows Server 2016 gebruikt, kunt u de opdracht netstat -anobq
uitvoeren en controleren op de proces-id met maximale vermeldingen als AFHANKELIJK. U kunt ook de onderstaande PowerShell-opdracht uitvoeren om het proces te identificeren:
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
De meeste poortlekken worden veroorzaakt doordat processen in de gebruikersmodus de poorten niet correct hebben gesloten toen er een fout werd aangetroffen. Op gebruikersmodusniveau zijn poorten (eigenlijk sockets) ingangen. Zowel TaskManager als ProcessExplorer kunnen het aantal ingangen weergeven, zodat u kunt bepalen welk proces alle poorten verbruikt.
Voor Windows 7 en Windows Server 2008 R2 kunt u uw PowerShell-versie bijwerken met de bovenstaande cmdlet.
Methode 2
Als methode 1 u niet helpt bij het identificeren van het proces (vóór Windows 10 en Windows Server 2012 R2), raadpleegt u Taakbeheer:
Voeg een kolom toe met de naam 'handles' onder details/processen.
Sorteer de kolomingangen om het proces met het hoogste aantal ingangen te identificeren. Meestal kan het proces met ingangen groter dan 3000 de verantwoordelijke zijn, met uitzondering van processen zoals System, lsass.exe, store.exe, sqlsvr.exe.
Als een ander proces dan deze processen een hoger aantal heeft, stopt u dat proces en probeert u zich aan te melden met domeinreferenties en controleert u of dit lukt.
Methode 3
Als Taakbeheer u niet heeft geholpen bij het identificeren van het proces, gebruikt u Process Explorer om het probleem te onderzoeken.
Stappen voor het gebruik van Procesverkenner:
Download Process Explorer en voer deze uit met verhoogde bevoegdheid.
Alt + selecteer de kolomkop, selecteer Kolommen kiezen en voeg op het tabblad Procesprestaties het aantal ingangen toe.
Selecteer Weergave>weergeven, onderste deelvenster.
Selecteer Weergavegrepen in het onderste deelvenster weergeven>.>
Selecteer de kolom Handles om op die waarde te sorteren.
Bekijk de processen met een hoger aantal ingangen dan de rest (is waarschijnlijk meer dan 10.000 als u geen uitgaande verbindingen kunt maken).
Klik om een van de processen met een hoog aantal ingangen te markeren.
In het onderste deelvenster zijn de onderstaande ingangen sockets. (Sockets zijn technisch gezien bestandsingangen).
Bestand \Device\AFD
Sommige zijn normaal, maar grote aantallen zijn niet (honderden tot duizenden). Sluit het proces in kwestie. Als hiermee uitgaande connectiviteit wordt hersteld, hebt u verder bewezen dat de app de oorzaak is. Neem contact op met de leverancier van die app.
Als de bovenstaande methoden u niet hebben geholpen het proces te isoleren, raden we u aan een volledige geheugendump van de machine te verzamelen met de probleemstatus. De dump geeft aan welk proces de meeste ingangen heeft.
Als tijdelijke oplossing krijgt het opnieuw opstarten van de computer de normale status en kunt u het probleem voorlopig oplossen. Wanneer opnieuw opstarten echter niet praktisch is, kunt u ook overwegen het aantal poorten op de computer te verhogen met behulp van de onderstaande opdrachten:
netsh int ipv4 set dynamicport tcp start=10000 num=1000
Met deze opdracht wordt het dynamische poortbereik ingesteld om te beginnen bij poort 10000 en te eindigen op poort 10999 (1000 poorten). Het minimale bereik van poorten dat kan worden ingesteld, is 255. De minimale beginpoort die kan worden ingesteld, is 1025. De maximale eindpoort (op basis van het bereik dat wordt geconfigureerd) mag niet groter zijn dan 65535.
Notitie
Houd er rekening mee dat het verhogen van het dynamische poortbereik geen permanente oplossing is, maar alleen tijdelijk. U moet bijhouden welke proces-/processors maximaal aantal poorten verbruiken en problemen oplossen vanuit dat procespunt om te bepalen waarom het zo'n groot aantal poorten verbruikt.
Voor Windows 7 en Windows Server 2008 R2 kunt u het onderstaande script gebruiken om de netstat-uitvoer met een gedefinieerde frequentie te verzamelen. In de uitvoer ziet u de trend voor poortgebruik.
@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
Meer informatie
- Poortuitputting en jij! - dit artikel bevat een gedetailleerde informatie over netstat-statussen en hoe u netstat-uitvoer kunt gebruiken om de poortstatus te bepalen
- Tijdelijke poortuitputting detecteren: dit artikel bevat een script dat in een lus wordt uitgevoerd om de poortstatus te rapporteren. (Van toepassing op Windows 2012 R2, Windows 8, Windows 10 en Windows 11)