Solucionar problemas de esgotamento de porta
Aplica-se a: Windows 10
Os protocolos TCP e UDP funcionam com base nos 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 lado.
Existem dois tipos de portas:
- As portas efêmeras, que são portas dinâmicas, são o conjunto de portas que cada máquina, por padrão, terá para 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 do servidor de arquivos está na porta 445, HTTPS é 443, HTTP é 80 e RPC é 135. Os 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 uma máquina cliente usará uma porta efêmera para se conectar à 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 esteja tentando, uma porta efêmera é usada. Depois de algum tempo, você notará 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 externas e qualquer nova tentativa de estabelecer uma conexão falhará, pois não há mais portas disponíveis. Quando todas as portas de uma máquina são usadas, chamamos isso de esgotamento de portas.
Intervalo de portas dinâmicas padrão para TCP/IP
Para cumprir as recomendações da IANA (Internet Assigned Numbers Authority), a Microsoft aumentou o intervalo de portas dinâmicas do cliente para conexões de saída. A nova porta inicial padrão é 49152, e a nova porta final padrão é 65535. Esse aumento é uma alteração em relação à configuração de versões anteriores do Windows que usavam um intervalo de portas padrão de 1025 a 5000.
Você pode exibir o intervalo de portas dinâmicas 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 inicial e um ponto final. Os clientes da Microsoft que implantam servidores que executam o Windows Server podem ter problemas que afetam a comunicação RPC entre servidores se firewalls forem usados na rede interna. Nessas situações, recomendamos que você reconfigure os firewalls para permitir o tráfego entre servidores no intervalo de portas dinâmicas de 49152 a 65535. Esse intervalo é um acréscimo às 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. Você ajusta esse intervalo usando o comando netsh, da seguinte maneira. O comando acima define o intervalo de portas dinâmicas 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 é o intervalo. Veja a seguir exemplos de comandos:
-
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 portas dinâmicas para começar 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 a porta inicial e, em seguida, 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 as 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 no domínio exigirá que você entre em contato com o controlador de domínio para autenticação, que é novamente uma conexão de saída. Se você tiver credenciais de cache definidas, a entrada no domínio ainda poderá funcionar.
Falhas de atualização de Política de Grupo:
Os compartilhamentos de arquivos estão inacessíveis:
Falha no RDP do servidor afetado:
Qualquer outro aplicativo em execução na máquina começará a apresentar erros
A reinicialização do servidor resolverá o problema temporariamente, mas você verá todos os sintomas voltarem após um período de tempo.
Se você suspeitar que a máquina está em um estado de exaustão de porta:
Tente fazer uma conexão de saída. No servidor/máquina, 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.
Abra o visualizador de eventos e, nos logs do sistema, procure os eventos que indicam claramente o estado atual:
ID do evento 4227
ID do evento 4231
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.Após um fechamento normal 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 da conexão TCP será estado de TIME_WAIT. Em uma situação em que você suspeita de esgotamento de portas, um aplicativo ou processo não poderá liberar todas as portas consumidas e permanecerá no estado TIME_WAIT.
Você também pode ver conexões de estado CLOSE_WAIT na mesma saída; no entanto, CLOSE_WAIT estado é um estado em que 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á atualmente sem portas, a menos que os dois primeiros pontos sejam verificados. Ter muitas conexões de TIME_WAIT indica que o processo está criando muitas conexões TCP e pode eventualmente levar ao esgotamento de porta.
O Netstat foi atualizado no Windows 10 com a adição do
-Q
switch para mostrar as portas que fizeram a transição do tempo de espera como no estado BOUND. Foi lançada uma atualização para o Windows 8.1 e o Windows Server 2012 R2 que contém essa funcionalidade. O cmdletGet-NetTCPConnection
do PowerShell no Windows 10 também mostra essas portas BOUND.Até 10/2016, o netstat era impreciso. As correções para netstat, com back-port para 2012 R2, permitiam 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.Abra um prompt de comando no modo admin e execute o comando abaixo.
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
Abra o arquivo server.etl com o Monitor de Rede e, na seção de 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 está sem portas. Se você encontrá-las, poderá confirmar que o servidor está sob esgotamento de porta.
Solucionar problemas de esgotamento de porta
O segredo é identificar qual processo ou aplicativo está usando todas as portas. Abaixo estão algumas das ferramentas que você pode usar para isolar um único processo
Método 1
Comece observando a saída do netstat. Se você estiver usando Windows 10 ou Windows Server 2016, poderá executar o comando netstat -anobq
e verificar a ID do processo que tem o máximo de entradas como BOUND. Como alternativa, você também pode executar o comando do PowerShell abaixo 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 é encontrado. No nível do modo de usuário, as portas (na verdade, soquetes) são identificadores. Tanto o TaskManager quanto o 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 do Windows 10 e do Windows Server 2012 R2), dê uma olhada no Gerenciador de Tarefas:
Adicione uma coluna chamada "identificadores" em detalhes/processos.
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 para processos como Sistema, lsass.exe, store.exe sqlsvr.exe.
Se qualquer outro processo que não seja esses processos tiver um número maior, interrompa esse processo e tente entrar usando credenciais de domínio e veja se ele é bem-sucedido.
Método 3
Se o Gerenciador de Tarefas não ajudou você a identificar o processo, use o Gerenciador de Processos para investigar o problema.
Etapas para usar o Explorador de Processos:
Baixe o Process Explorer e execute-o com o Elevated.
Alt + selecione o cabeçalho da coluna, selecione Escolher Colunas e, na guia Desempenho do Processo, adicione Contagem de Identificadores.
Selecione Exibir>Mostrar painel inferior.
Selecione Exibir>alças de exibição>do painel inferior.
Selecione a coluna Alças para classificar por esse valor.
Examine os processos com contagens de identificadores maiores do que o restante (provavelmente será mais de 10.000 se você não conseguir fazer conexões de saída).
Clique para realçar um dos processos com uma contagem alta de identificadores.
No painel inferior, os identificadores listados como abaixo são soquetes. (Soquetes são tecnicamente identificadores de arquivo).
Arquivo\Dispositivo\AFD
Alguns são normais, mas um grande número deles não é (centenas a milhares). Feche o processo em questão. Se isso restaurar a conectividade de saída, você provou ainda mais que o aplicativo é a causa. Entre em contato com o fornecedor desse aplicativo.
Por fim, se os métodos acima não ajudarem a isolar o processo, sugerimos que você colete um despejo de memória completo da máquina no estado do problema. O despejo lhe dirá qual processo tem o máximo de identificadores.
Como solução alternativa, reiniciar o computador o colocará de volta no estado normal e ajudará você a resolver o problema por enquanto. No entanto, quando uma reinicialização é impraticável, você também pode considerar o aumento do número de portas no computador usando os comandos abaixo:
netsh int ipv4 set dynamicport tcp start=10000 num=1000
Este comando definirá o intervalo de portas dinâmicas para começar 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 de portas dinâmicas 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 do ponto de vista do processo para saber por que 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 na 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 do porto e você! - Este artigo fornece detalhes sobre os estados do NetStat e como você pode usar a saída do NetStat para determinar o status da porta
- Detectando esgotamento de porta efêmera: este artigo tem um script que será executado em um loop para relatar o status da porta. (Aplicável para Windows 2012 R2, Windows 8, Windows 10 e Windows 11)