Solucionar problemas de esgotamento da porta

Aplica-se a: Windows 10

Os protocolos TCP e UDP funcionam com base em números de porta usados para estabelecer a conexão. Qualquer aplicativo ou serviço que precise estabelecer uma conexão TCP/UDP exigirá uma porta ao seu lado.

Há dois tipos de portas:

  • As portas efêmeras, que são portas dinâmicas, são o conjunto de portas que cada computador por padrão terá que fazer uma conexão de saída.
  • Portas conhecidas são as portas definidas para um determinado aplicativo ou serviço. Por exemplo, o serviço de servidor de arquivo está na porta 445, HTTPS é 443, HTTP 80 e RPC 135. Aplicativos personalizados também terão seus próprios números de porta definidos.

Quando uma conexão está sendo estabelecida com um aplicativo ou serviço, os dispositivos cliente usam uma porta efêmera do dispositivo para se conectar a uma porta conhecida definida para esse aplicativo ou serviço. Um navegador em um computador cliente usará uma porta efêmera para se conectar na https://www.microsoft.com porta 443.

Em um cenário em que o mesmo navegador está criando muitas conexões com vários sites, para qualquer nova conexão que o navegador está tentando, uma porta efêmera é usada. Depois de algum tempo, você perceberá que as conexões começarão a falhar e uma grande possibilidade para essa falha seria porque o navegador usou todas as portas disponíveis para fazer conexões fora e qualquer nova tentativa de estabelecer uma conexão falhará, pois não há mais portas disponíveis. Quando todas as portas de um computador são usadas, nós as chamamos de esgotamento de porta.

Intervalo de porta dinâmico padrão para TCP/IP

Para cumprir as recomendações da IANA (Autoridade de Números Atribuídos à Internet), a Microsoft aumentou o intervalo dinâmico da porta do cliente para conexões de saída. A nova porta de início padrão é 49152 e a nova porta de extremidade padrão é 65535. Esse aumento é uma alteração da configuração de versões anteriores do Windows que usaram um intervalo de porta padrão de 1025 a 5000.

Você pode exibir o intervalo dinâmico de portas em um computador usando os seguintes netsh comandos:

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

O intervalo é definido separadamente para cada transporte (TCP ou UDP). O intervalo de portas agora é um intervalo que tem um ponto de partida e um ponto final. Os clientes da Microsoft que implantam servidores que estão executando o Windows Server podem ter problemas que afetam a comunicação RPC entre servidores se os firewalls forem usados na rede interna. Nessas situações, é recomendável reconfigurar os firewalls para permitir o tráfego entre servidores no intervalo de porta dinâmico de 49152 a 65535. Esse intervalo é além de portas conhecidas que são usadas por serviços e aplicativos. Ou o intervalo de portas usado pelos servidores pode ser modificado em cada servidor. Ajuste esse intervalo usando o comando netsh da seguinte maneira. O comando acima define o intervalo de porta dinâmico para TCP.

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

A porta inicial é o número e o número total de portas é intervalo. Veja a seguir os comandos de exemplo:

  • 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
    

Esses comandos de exemplo definem o intervalo de porta dinâmico para iniciar na porta 10000 e terminar na porta 10999 (1000 portas). O intervalo mínimo de portas que podem ser definidas é 255. A porta inicial mínima que pode ser definida é 1025. A porta final máxima (com base no intervalo que está sendo configurado) não pode exceder 65535. Para duplicar o comportamento padrão do Windows Server 2003, use 1025 como porta inicial e use 3976 como o intervalo para TCP e UDP. Esse padrão de uso resulta em uma porta inicial de 1025 e uma porta final de 5000.

Especificamente, sobre conexões de saída, pois conexões de entrada não exigirão uma porta Efêmera para aceitar conexões.

Como as conexões de saída começam a falhar, você verá muitas instâncias dos comportamentos abaixo:

  • Não é possível entrar no computador com credenciais de domínio, no entanto, a entrada com a conta local funciona. A entrada de domínio exigirá que você entre em contato com o DC para autenticação, que é novamente uma conexão de saída. Se você tiver as credenciais de cache definidas, a entrada no domínio ainda poderá funcionar.

    Captura de tela do erro para NETLOGON no Visualizador de Eventos.

  • Política de Grupo falhas de atualização:

    Captura de tela das propriedades do evento para Política de Grupo falha.

  • Os compartilhamentos de arquivos estão inacessíveis:

    Captura de tela da mensagem de erro que o Windows não pode acessar.

  • Falha no RDP do servidor afetado:

    Captura de tela do erro quando a Área de Trabalho Remota não consegue se conectar.

  • Qualquer outro aplicativo em execução no computador começará a distribuir erros

A reinicialização do servidor resolve o problema temporariamente, mas você verá todos os sintomas voltarem após um período de tempo.

Se você suspeitar que o computador está em um estado de esgotamento da porta:

  1. Tente fazer uma conexão de saída. No servidor/computador, acesse um compartilhamento remoto ou tente um RDP para outro servidor ou telnet para um servidor em uma porta. Se a conexão de saída falhar para todas essas opções, vá para a próxima etapa.

  2. Abra o visualizador de eventos e, nos logs do sistema, procure os eventos que indicam claramente o estado atual:

    1. ID do evento 4227

      Captura de tela da ID do evento 4227 em Visualizador de Eventos.

    2. ID do evento 4231

      Captura de tela da ID do evento 4231 em Visualizador de Eventos.

  3. Colete uma netstat -anob saída do servidor. A saída netstat mostrará um grande número de entradas para TIME_WAIT estado para um único PID.

    Captura de tela da saída do comando netstate.

    Após um fechamento gracioso ou um fechamento abrupto de uma sessão, após um período de 4 minutos (padrão), a porta usada pelo processo ou aplicativo seria liberada de volta para o pool disponível. Durante esses 4 minutos, o estado de conexão TCP será TIME_WAIT estado. Em uma situação em que você suspeita de esgotamento da porta, um aplicativo ou processo não poderá liberar todas as portas consumidas e permanecerá no estado TIME_WAIT.

    Você também pode ver CLOSE_WAIT conexões de estado na mesma saída; no entanto, CLOSE_WAIT estado é um estado quando um lado do par TCP não tem mais dados para enviar (FIN enviado), mas é capaz de receber dados da outra extremidade. Esse estado não indica necessariamente o esgotamento da porta.

    Observação

    Ter conexões enormes em TIME_WAIT estado nem sempre indica que o servidor está fora das portas no momento, a menos que os dois primeiros pontos sejam verificados. Ter muitas conexões TIME_WAIT indica que o processo está criando muitas conexões TCP e pode eventualmente levar ao esgotamento da porta.

    O Netstat foi atualizado em Windows 10 com a adição da opção -Q para mostrar portas que fizeram a transição da espera de tempo como no estado BOUND. Uma atualização para Windows 8.1 e Windows Server 2012 R2 foi lançada que contém essa funcionalidade. O cmdlet Get-NetTCPConnection do PowerShell no Windows 10 também mostra essas portas BOUND.

    Até 10/2016, o netstat era impreciso. Correções para netstat, porta traseira para 2012 R2, permitiram Netstat.exe e Get-NetTcpConnection relatar corretamente o uso da porta TCP ou UDP no Windows Server 2012 R2. Consulte Windows Server 2012 R2: hotfixes de portas efêmeras para saber mais.

  4. Abra um prompt de comando no modo de administração e execute o comando abaixo.

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  5. Abra o arquivo server.etl com o Monitor de Rede e, na seção filtro, aplique o filtro Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209. Você deve ver entradas que dizem STATUS_TOO_MANY_ADDRESSES. Se você não encontrar nenhuma entrada, o servidor ainda não estará fora das portas. Se você encontrá-los, você pode confirmar se o servidor está em esgotamento de porta.

Solucionar problemas de esgotamento da porta

A chave é identificar qual processo ou aplicativo está usando todas as portas. Abaixo estão algumas das ferramentas que você pode usar para isolar em um único processo

Método 1

Comece olhando para a saída netstat. Se você estiver usando Windows 10 ou Windows Server 2016, poderá executar o comando netstat -anobq e marcar para a ID do processo que tem entradas máximas como BOUND. Como alternativa, você também pode executar o comando abaixo do PowerShell para identificar o 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 

A maioria dos vazamentos de porta é causada por processos de modo de usuário que não fecham corretamente as portas quando um erro foi encontrado. No nível do modo de usuário, as portas (na verdade soquetes) são alças. Tanto TaskManager quanto ProcessExplorer são capazes de exibir contagens de identificadores, o que permite identificar qual processo está consumindo todas as portas.

Para Windows 7 e Windows Server 2008 R2, você pode atualizar sua versão do PowerShell para incluir o cmdlet acima.

Método 2

Se o método 1 não ajudar você a identificar o processo (antes de Windows 10 e Windows Server 2012 R2), dê uma olhada no Gerenciador de Tarefas:

  1. Adicione uma coluna chamada "identificadores" em detalhes/processos.

  2. Classifique os identificadores de coluna para identificar o processo com o maior número de identificadores. Normalmente, o processo com identificadores maiores que 3000 pode ser o culpado, exceto por processos como System, lsass.exe, store.exe, sqlsvr.exe.

    Captura de tela da coluna identificadores no Gerenciador de Tarefas do Windows.

  3. Se qualquer outro processo que não esses processos tiver um número maior, pare esse processo e tente entrar usando credenciais de domínio e veja se ele tem êxito.

Método 3

Se o Gerenciador de Tarefas não o ajudou a identificar o processo, use Process Explorer para investigar o problema.

Etapas para usar o Gerenciador de Processos:

  1. Baixe Process Explorer e execute-o elevado.

  2. Alt + selecione o cabeçalho da coluna, selecione Escolher Colunas e, na guia Desempenho do Processo , adicione Contagem de Identificadores.

  3. Selecione Exibir>Mostrar Painel Inferior.

  4. Selecione Exibir>Identificadores de Exibição> doPainel Inferior.

  5. Selecione a coluna Identificadores para classificar por esse valor.

  6. Examine os processos com contagens de identificadores mais altas do que o restante (provavelmente serão mais de 10.000 se você não conseguir fazer conexões de saída).

  7. Clique para realçar um dos processos com uma contagem alta de identificadores.

  8. No painel inferior, as alças listadas como abaixo são soquetes. (Soquetes são identificadores de arquivo tecnicamente).

    Arquivo \Device\AFD

    Captura de tela do Process Explorer com os processos classificados por identificadores.

  9. Alguns são normais, mas um grande número deles não são (centenas a milhares). Feche o processo em questão. Se isso restaurar a conectividade de saída, você ainda provará que o aplicativo é a causa. Entre em contato com o fornecedor desse aplicativo.

Por fim, se os métodos acima não ajudarem você a isolar o processo, sugerimos que você colete um despejo de memória completo do computador no estado de problema. O despejo informará qual processo tem os identificadores máximos.

Como solução alternativa, a reinicialização do computador o colocará de volta no estado normal e ajudará você a resolve o problema por enquanto. No entanto, quando uma reinicialização é impraticável, você também pode considerar aumentar o número de portas no computador usando os comandos abaixo:

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

Esse comando definirá o intervalo de portas dinâmico para iniciar na porta 10000 e terminar na porta 10999 (1000 portas). O intervalo mínimo de portas que podem ser definidas é 255. A porta inicial mínima que pode ser definida é 1025. A porta final máxima (com base no intervalo que está sendo configurado) não pode exceder 65535.

Observação

Observe que aumentar o intervalo dinâmico de portas não é uma solução permanente, mas apenas temporária. Você precisará rastrear quais processos/processadores estão consumindo o número máximo de portas e solucionar problemas desse ponto de vista do processo quanto ao motivo pelo qual ele está consumindo um número tão alto de portas.

Para Windows 7 e Windows Server 2008 R2, você pode usar o script abaixo para coletar a saída netstat em frequência definida. Nas saídas, você pode ver a tendência de uso da porta.

@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

Mais informações

  • Exaustão de porta e você! - este artigo fornece um detalhe sobre os estados netstat e como você pode usar a saída netstat para determinar a porta status
  • Detectando o esgotamento da porta efêmera: este artigo tem um script que será executado em um loop para relatar a porta status. (Aplicável ao Windows 2012 R2, Windows 8, Windows 10 e Windows 11)