Condividi tramite


Risolvere i problemi di esaurimento delle porte

Si applica a: Windows 10

I protocolli TCP e UDP funzionano in base ai numeri di porta usati per stabilire la connessione. Qualsiasi applicazione o servizio che deve stabilire una connessione TCP/UDP richiederà una porta sul lato.

Esistono due tipi di porte:

  • Le porte temporanee, che sono porte dinamiche, sono il set di porte che ogni computer dovrà per impostazione predefinita stabilire una connessione in uscita.
  • Le porte note sono le porte definite per un'applicazione o un servizio specifico. Ad esempio, il servizio file server è sulla porta 445, HTTPS è sulla porta 443, HTTP è sulla porta 80 e RPC è sulla porta 135. Le applicazioni personalizzate avranno anche numeri di porta definiti.

Quando viene stabilita una connessione con un'applicazione o un servizio, i dispositivi client usano una porta temporanea dal dispositivo per connettersi a una porta nota definita per tale applicazione o servizio. Un browser in un computer client userà una porta temporanea a cui connettersi https://www.microsoft.com sulla porta 443.

In uno scenario in cui lo stesso browser crea molte connessioni a più siti Web, per qualsiasi nuova connessione che il browser sta tentando, viene usata una porta temporanea. Dopo qualche tempo, si noterà che le connessioni inizieranno a non riuscire e una possibilità elevata per questo errore sarebbe dovuto al fatto che il browser ha usato tutte le porte disponibili per stabilire connessioni esterne e qualsiasi nuovo tentativo di stabilire una connessione avrà esito negativo perché non sono disponibili più porte. Quando vengono usate tutte le porte in un computer, viene definita come esaurimento delle porte.

Intervallo di porte dinamiche predefinito per TCP/IP

Per rispettare le raccomandazioni di Internet Assigned Numbers Authority (IANA), Microsoft ha aumentato l'intervallo di porte client dinamiche per le connessioni in uscita. La nuova porta iniziale predefinita è 49152, mentre la nuova porta finale predefinita è 65535. Questo aumento è una modifica rispetto alla configurazione delle versioni precedenti di Windows che usavano un intervallo di porte predefinito compreso tra 1025 e 5000.

È possibile visualizzare l'intervallo di porte dinamiche in un computer usando i comandi seguenti netsh :

  • netsh int ipv4 show dynamicport tcp
    
  • netsh int ipv4 show dynamicport udp
    
  • netsh int ipv6 show dynamicport tcp
    
  • netsh int ipv6 show dynamicport udp
    

L'intervallo viene impostato separatamente per ogni trasporto (TCP o UDP). L'intervallo di porte è ora un intervallo con un punto iniziale e un punto finale. I clienti Microsoft che distribuiscono server che eseguono Windows Server potrebbero avere problemi che influiscono sulla comunicazione RPC tra server se i firewall vengono usati nella rete interna. In queste situazioni, è consigliabile riconfigurare i firewall per consentire il traffico tra server nell'intervallo di porte dinamiche compreso tra 49152 e 65535. Questo intervallo è oltre alle porte note usate da servizi e applicazioni. In alternativa, l'intervallo di porte utilizzato dai server può essere modificato in ogni server. Per regolare questo intervallo, usare il comando netsh, come indicato di seguito. Il comando precedente imposta l'intervallo di porte dinamiche per TCP.

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

La porta iniziale è il numero e il numero totale di porte è compreso nell'intervallo. Di seguito sono riportati i comandi di esempio:

  • 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
    

Questi comandi di esempio impostano l'intervallo di porte dinamiche da avviare alla porta 10000 e terminare alla porta 10999 (1000 porte). L'intervallo minimo di porte che è possibile impostare è 255. Il numero minimo di porta iniziale che è possibile impostare è 1025. La porta finale massima (in base all'intervallo configurato) non può superare 65535. Per duplicare il comportamento predefinito di Windows Server 2003, usare 1025 come porta iniziale e quindi usare 3976 come intervallo per TCP e UDP. Questo modello di utilizzo genera una porta iniziale 1025 e una porta finale di 5000.

In particolare, le connessioni in uscita come connessioni in ingresso non richiedono una porta temporanea per l'accettazione delle connessioni.

Poiché le connessioni in uscita iniziano a non riuscire, vengono visualizzate molte istanze dei comportamenti seguenti:

  • Non è possibile accedere al computer con le credenziali di dominio, ma è possibile farlo con l'account locale. L'accesso al dominio richiederà di contattare il controller di dominio per l'autenticazione, che è di nuovo una connessione in uscita. Se sono state impostate le credenziali della cache, l'accesso al dominio potrebbe comunque funzionare.

    Screenshot dell'errore per NETLOGON in Visualizzatore eventi.

  • Errori di aggiornamento di Criteri di gruppo:

    Screenshot delle proprietà dell'evento per l'errore di Criteri di gruppo.

  • Le condivisioni file non sono accessibili:

    Screenshot del messaggio di errore a cui Windows non può accedere.

  • La connessione tramite RDP dal server interessato ha esito negativo:

    Screenshot dell'errore quando Desktop remoto non è in grado di connettersi.

  • Qualsiasi altra applicazione in esecuzione nel computer inizierà a restituire errori

Il riavvio del server risolve temporaneamente il problema, ma tutti i sintomi vengono restituiti dopo un periodo di tempo.

Se si sospetta che il computer si trovi in uno stato di esaurimento delle porte:

  1. Provare a stabilire una connessione in uscita. Dal server o dal computer, accedere a una condivisione remota o provare un RDP a un altro server o telnet a un server su una porta. Se la connessione in uscita non riesce per tutte queste opzioni, andare al passaggio successivo.

  2. Aprire il visualizzatore eventi e nei log di sistema cercare gli eventi che indicano chiaramente lo stato corrente:

    1. ID evento 4227

      Screenshot dell'ID evento 4227 in Visualizzatore eventi.

    2. ID evento 4231

      Screenshot dell'ID evento 4231 in Visualizzatore eventi.

  3. Raccogliere un netstat -anob output dal server. L'output netstat mostrerà un numero enorme di voci per TIME_WAIT stato per un singolo PID.

    Screenshot dell'output del comando netstate.

    Dopo una chiusura normale o una chiusura brusca di una sessione, dopo un periodo di 4 minuti (impostazione predefinita), la porta usata dal processo o dall'applicazione verrà rilasciata nuovamente al pool disponibile. Durante questi 4 minuti, lo stato della connessione TCP sarà TIME_WAIT. In una situazione in cui si sospetta l'esaurimento delle porte, un'applicazione o un processo non sarà in grado di rilasciare tutte le porte utilizzate e rimarrà nello stato TIME_WAIT.

    È anche possibile visualizzare CLOSE_WAIT connessioni di stato nello stesso output; tuttavia, CLOSE_WAIT stato è uno stato quando un lato del peer TCP non contiene più dati da inviare (FIN sent) ma è in grado di ricevere dati dall'altra estremità. Questo stato non indica necessariamente l'esaurimento delle porte.

    Note

    La presenza di connessioni enormi nello stato TIME_WAIT non indica sempre che il server è attualmente fuori porta, a meno che non vengano verificati i primi due punti. La presenza di molte connessioni con stato TIME_WAIT indica che il processo sta creando molte connessioni TCP e potrebbe alla fine comportare l'esaurimento delle porte.

    Netstat è stato aggiornato in Windows 10 con l'aggiunta del -Q commutatore per visualizzare le porte che hanno superato il tempo di attesa come nello stato BOUND. È stato rilasciato un aggiornamento per Windows 8.1 e Windows Server 2012 R2 che contiene questa funzionalità. Il cmdlet Get-NetTCPConnection di PowerShell in Windows 10 mostra anche queste porte BOUND.

    Fino al mese di ottobre 2016, netstat presentava degli errori. Correzioni per netstat, con back-porting a 2012 R2, consentite Netstat.exe e Get-NetTcpConnection segnalare correttamente l'utilizzo delle porte TCP o UDP in Windows Server 2012 R2. Per altre informazioni, vedere Windows Server 2012 R2: Hotfix delle porte temporanee.

  4. Aprire un prompt dei comandi in modalità amministratore ed eseguire il comando seguente.

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  5. Aprire il file server.etl con Monitoraggio di rete e nella sezione filtro applicare il filtro Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209. Dovrebbero essere visualizzate voci che dicono STATUS_TOO_MANY_ADDRESSES. Se non vengono trovate voci, il server non è ancora fuori porta. Se vengono rilevate, è possibile confermare che il server sta per esaurire le porte.

Risolvere i problemi di esaurimento delle porte

La soluzione consiste nell'identificare il processo o l'applicazione che usa tutte le porte. Sotto sono riportati alcuni degli strumenti che è possibile usare per isolare un solo processo

Metodo 1

Per iniziare, esaminare l'output di netstat. Se usi Windows 10 o Windows Server 2016, puoi eseguire il comando netstat -anobq e verificare la presenza dell'ID processo con voci massime associate. In alternativa, è anche possibile eseguire il comando di PowerShell seguente per identificare il processo:

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 

La maggior parte delle perdite di porte è causata da processi in modalità utente che non chiudono correttamente le porte quando si verifica un errore. A livello di utente, le porte (in realtà socket) sono handle. Sia TaskManager che ProcessExplorer sono in grado di visualizzare i conteggi di handle, che consente di identificare il processo che utilizza tutte le porte.

Per Windows 7 e Windows Server 2008 R2, è possibile aggiornare la versione di PowerShell per includere il cmdlet precedente.

Metodo 2

Se il metodo 1 non consente di identificare il processo (prima di Windows 10 e Windows Server 2012 R2), vedere Gestione attività:

  1. Aggiungere una colonna denominata "handle" in dettagli/processi.

  2. Ordinare gli handle della colonna per identificare il processo con il numero più elevato di handle. In genere il processo con handle maggiori di 3000 può essere il colpevole, ad eccezione di processi come System, lsass.exe, store.exe, sqlsvr.exe.

    Screenshot della colonna handle in Gestione attività di Windows.

  3. Se un altro processo rispetto a questi processi ha un numero maggiore, arrestare il processo e quindi provare ad accedere usando le credenziali di dominio e verificare se ha esito positivo.

Metodo 3

Se Gestione attività non consente di identificare il processo, usare Esplora processi per analizzare il problema.

Passaggi per usare Esplora processi:

  1. Scaricare Esplora processi ed eseguirlo con privilegi elevati.

  2. Alt + selezionare l'intestazione di colonna, selezionare Scegli colonne e nella scheda Prestazioni processo aggiungere Handle Count (Conteggio handle).

  3. Selezionare Visualizza>mostra riquadro inferiore.

  4. Selezionare Visualizza>quadratini di visualizzazione>riquadro inferiore.

  5. Selezionare la colonna Handle per ordinare in base a tale valore.

  6. Esaminare i processi con un numero di handle elevato. Probabilmente saranno oltre 10.000 se non è possibile effettuare connessioni in uscita.

  7. Fare clic per evidenziare un processo con un numero elevato di handle.

  8. Nel riquadro inferiore gli handle elencati come quelli seguenti sono socket. I socket sono tecnicamente handle di file.

    File \Dispositivo\AFD

    Screenshot di Esplora processi con i processi ordinati in base agli handle.

  9. Alcuni sono normali, ma un numero elevato di loro non sono (centinaia a migliaia). Chiudere il processo in questione. Se ripristina la connettività in uscita, si è ulteriormente dimostrato che l'app è la causa. Contattare il fornitore dell'app.

Infine, se i metodi precedenti non consentono di isolare il processo, è consigliabile raccogliere un dump di memoria completo del computer nello stato del problema. Il dump consente di individuare il processo con il numero massimo di handle.

Come soluzione alternativa, il riavvio del computer restituirà lo stato normale e consente di risolvere il problema per il momento. Tuttavia, quando il riavvio non può essere eseguito, è anche possibile aumentare il numero di porte del computer usando i comandi seguenti:

netsh int ipv4 set dynamicport tcp start=10000 num=1000

Questo comando imposta l'intervallo di porte dinamiche per iniziare alla porta 10000 e terminare alla porta 10999 (1000 porte). L'intervallo minimo di porte che è possibile impostare è 255. Il numero minimo di porta iniziale che è possibile impostare è 1025. La porta finale massima (in base all'intervallo configurato) non può superare 65535.

Note

Si noti che l'aumento dell'intervallo di porte dinamiche non è una soluzione permanente, ma solo temporanea. È necessario tenere traccia del processo o dei processori che utilizzano il numero massimo di porte e risolvere i problemi dal punto di vista del processo per il motivo per cui utilizza un numero così elevato di porte.

Per Windows 7 e Windows Server 2008 R2, è possibile usare lo script seguente per raccogliere l'output netstat alla frequenza definita. Negli output è possibile visualizzare la tendenza di utilizzo delle porte.

@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

Ulteriori informazioni

  • Esaurimento delle porte e voi! - Questo articolo fornisce informazioni dettagliate sugli stati netstat e su come usare l'output netstat per determinare lo stato della porta
  • Rilevamento dell'esaurimento delle porte temporanee: questo articolo include uno script che verrà eseguito in un ciclo per segnalare lo stato della porta. (Applicabile per Windows 2012 R2, Windows 8, Windows 10 e Windows 11)