Solución de problemas de agotamiento de puertos

Se aplica a: Windows 10

Los protocolos TCP y UDP funcionan en función de los números de puerto utilizados para establecer la conexión. Cualquier aplicación o servicio que necesite establecer una conexión TCP/UDP requerirá un puerto en su lado.

Hay dos tipos de puertos:

  • Los puertos efímeros, que son puertos dinámicos, son el conjunto de puertos que cada máquina tendrá de forma predeterminada para realizar una conexión saliente.
  • Los puertos conocidos son los puertos definidos para una aplicación o servicio determinados. Por ejemplo, el servicio del servidor de archivos está en el puerto 445, HTTPS es 443, HTTP es 80 y RPC es 135. Las aplicaciones personalizadas también tendrán sus propios números de puerto definidos.

Cuando se establece una conexión con una aplicación o servicio, los dispositivos cliente usan un puerto efímero del dispositivo para conectarse a un puerto conocido definido para esa aplicación o servicio. Un explorador de un equipo cliente usará un puerto efímero para conectarse al https://www.microsoft.com puerto 443.

En un escenario en el que el mismo explorador está creando muchas conexiones a varios sitios web, para cualquier conexión nueva que intente el explorador, se usa un puerto efímero. Después de algún tiempo, observará que las conexiones comenzarán a producir un error y una posibilidad alta de este error sería porque el explorador ha usado todos los puertos disponibles para realizar conexiones fuera y cualquier nuevo intento de establecer una conexión producirá un error, ya que no hay más puertos disponibles. Cuando se usan todos los puertos de una máquina, lo denominamos agotamiento de puertos.

Intervalo de puertos dinámico predeterminado para TCP/IP

Para cumplir con las recomendaciones de la Autoridad de números asignados por Internet (IANA ), Microsoft ha aumentado el intervalo de puertos de cliente dinámico para las conexiones salientes. El nuevo puerto de inicio predeterminado es 49152 y el nuevo puerto final predeterminado es 65535. Este aumento es un cambio de la configuración de versiones anteriores de Windows que usaban un intervalo de puertos predeterminado de 1025 a 5000.

Puede ver el intervalo de puertos dinámicos en un equipo mediante los siguientes 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
    

El intervalo se establece por separado para cada transporte (TCP o UDP). El intervalo de puertos es ahora un intervalo que tiene un punto inicial y un punto final. Los clientes de Microsoft que implementan servidores que ejecutan Windows Server pueden tener problemas que afectan a la comunicación RPC entre servidores si se usan firewalls en la red interna. En estas situaciones, se recomienda volver a configurar los firewalls para permitir el tráfico entre servidores en el intervalo de puertos dinámico de 49152 a 65535. Este intervalo se suma a los puertos conocidos que usan los servicios y las aplicaciones. O bien, el intervalo de puertos que usan los servidores se puede modificar en cada servidor. Este intervalo se ajusta mediante el comando netsh, como se indica a continuación. El comando anterior establece el intervalo de puertos dinámico para TCP.

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

El puerto de inicio es número y el número total de puertos es intervalo. Los siguientes son comandos de ejemplo:

  • 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
    

Estos comandos de ejemplo establecen el intervalo de puertos dinámico para que comience en el puerto 10000 y finalice en el puerto 10999 (1000 puertos). El intervalo mínimo de puertos que se puede establecer es 255. El puerto de inicio mínimo que se puede establecer es 1025. El puerto final máximo (en función del intervalo que se está configurando) no puede superar los 65535. Para duplicar el comportamiento predeterminado de Windows Server 2003, use 1025 como puerto de inicio y, a continuación, use 3976 como intervalo para TCP y UDP. Este patrón de uso da como resultado un puerto de inicio de 1025 y un puerto final de 5000.

En concreto, sobre las conexiones salientes, ya que las conexiones entrantes no requerirán un puerto efímero para aceptar conexiones.

Dado que las conexiones salientes comienzan a producir errores, verá muchas instancias de los comportamientos siguientes:

  • No se puede iniciar sesión en la máquina con credenciales de dominio, pero el inicio de sesión con la cuenta local funciona. El inicio de sesión en el dominio requerirá que se ponga en contacto con el controlador de dominio para la autenticación, que es de nuevo una conexión saliente. Si ha establecido credenciales de caché, es posible que el inicio de sesión de dominio siga funcionando.

    Captura de pantalla del error de NETLOGON en Visor de eventos.

  • directiva de grupo errores de actualización:

    Captura de pantalla de las propiedades del evento para directiva de grupo error.

  • No se puede acceder a los recursos compartidos de archivos:

    Captura de pantalla del mensaje de error al que Windows no puede acceder.

  • Se produce un error en RDP desde el servidor afectado:

    Captura de pantalla del error cuando Escritorio remoto no se puede conectar.

  • Cualquier otra aplicación que se ejecute en la máquina comenzará a dar errores.

El reinicio del servidor resolverá el problema temporalmente, pero verá que todos los síntomas vuelven después de un período de tiempo.

Si sospecha que la máquina está en estado de agotamiento del puerto:

  1. Intente realizar una conexión de salida. Desde el servidor o equipo, acceda a un recurso compartido remoto o pruebe un RDP a otro servidor o telnet a un servidor en un puerto. Si se produce un error en la conexión saliente para todas estas opciones, vaya al paso siguiente.

  2. Abra el visor de eventos y, en los registros del sistema, busque los eventos que indican claramente el estado actual:

    1. Identificador de evento 4227

      Captura de pantalla del identificador de evento 4227 en Visor de eventos.

    2. Identificador de evento 4231

      Captura de pantalla del identificador de evento 4231 en Visor de eventos.

  3. Recopile una netstat -anob salida del servidor. La salida netstat le mostrará un gran número de entradas para TIME_WAIT estado para un único PID.

    Captura de pantalla de la salida del comando netstate.

    Después de un cierre correcto o un cierre abrupto de una sesión, después de un período de 4 minutos (valor predeterminado), el puerto utilizado por el proceso o la aplicación se liberaría de vuelta al grupo disponible. Durante estos 4 minutos, el estado de conexión TCP será TIME_WAIT estado. En una situación en la que sospeche que se ha agotado el puerto, una aplicación o proceso no podrá liberar todos los puertos que ha consumido y permanecerá en el estado TIME_WAIT.

    También puede ver CLOSE_WAIT conexiones de estado en la misma salida; sin embargo, CLOSE_WAIT estado es un estado cuando un lado del punto TCP no tiene más datos que enviar (fin enviado), pero puede recibir datos del otro extremo. Este estado no indica necesariamente el agotamiento del puerto.

    Nota:

    Tener conexiones enormes en TIME_WAIT estado no siempre indica que el servidor está actualmente fuera de puertos a menos que se comprueben los dos primeros puntos. Tener muchas conexiones TIME_WAIT indica que el proceso está creando una gran cantidad de conexiones TCP y, finalmente, puede provocar agotamiento del puerto.

    Netstat se ha actualizado en Windows 10 con la adición del -Q conmutador para mostrar los puertos que han pasado la espera fuera del tiempo como en el estado BOUND. Se ha publicado una actualización para Windows 8.1 y Windows Server 2012 R2 que contiene esta funcionalidad. El cmdlet Get-NetTCPConnection de PowerShell de Windows 10 también muestra estos puertos BOUND.

    Hasta el 10/2016, netstat era inexacto. Correcciones para netstat, back-portted a 2012 R2, permitido Netstat.exe y Get-NetTcpConnection para notificar correctamente el uso del puerto TCP o UDP en Windows Server 2012 R2. Consulte Windows Server 2012 R2: Revisiones de puertos efímeros para obtener más información.

  4. Abra un símbolo del sistema en modo de administración y ejecute el siguiente comando.

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  5. Abra el archivo server.etl con Network Monitor y, en la sección de filtro, aplique el filtro Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209. Debería ver entradas que digan STATUS_TOO_MANY_ADDRESSES. Si no encuentra ninguna entrada, el servidor sigue sin puertos. Si los encuentra, puede confirmar que el servidor está agotado por el puerto.

Solución de problemas de agotamiento de puertos

La clave es identificar qué proceso o aplicación usa todos los puertos. A continuación se muestran algunas de las herramientas que puede usar para aislar a un solo proceso

Método 1

Para empezar, examine la salida de netstat. Si usa Windows 10 o Windows Server 2016, puede ejecutar el comando netstat -anobq y comprobar el identificador de proceso que tiene entradas máximas como BOUND. Como alternativa, también puede ejecutar el siguiente comando de PowerShell para identificar el proceso:

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 mayoría de las fugas de puertos se deben a procesos en modo de usuario que no cierran correctamente los puertos cuando se encontró un error. En el nivel de modo de usuario, los puertos (realmente sockets) son identificadores. Tanto TaskManager como ProcessExplorer pueden mostrar recuentos de identificadores, lo que permite identificar qué proceso consume todos los puertos.

Para Windows 7 y Windows Server 2008 R2, puede actualizar la versión de PowerShell para incluir el cmdlet anterior.

Método 2

Si el método 1 no le ayuda a identificar el proceso (antes de Windows 10 y Windows Server 2012 R2), examine el Administrador de tareas:

  1. Agregue una columna denominada "identificadores" en detalles o procesos.

  2. Ordene los identificadores de columna para identificar el proceso con el mayor número de identificadores. Normalmente, el proceso con identificadores mayores que 3000 podría ser el culpable, excepto para procesos como System, lsass.exe, store.exe, sqlsvr.exe.

    Captura de pantalla de la columna de identificadores en el Administrador de tareas de Windows.

  3. Si cualquier otro proceso distinto de estos procesos tiene un número mayor, detenga ese proceso e intente iniciar sesión con credenciales de dominio y ver si se realiza correctamente.

Método 3

Si el Administrador de tareas no le ayudó a identificar el proceso, use el Explorador de procesos para investigar el problema.

Pasos para usar el Explorador de procesos:

  1. Descargue el Explorador de procesos y ejecútelo con privilegios elevados.

  2. Alt + seleccione el encabezado de columna, elija Elegir columnas y, en la pestaña Rendimiento del proceso , agregue Recuento de identificadores.

  3. Seleccione Ver>Mostrar panel inferior.

  4. Seleccione Ver>identificadores de vista de> panel inferior.

  5. Seleccione la columna Identificadores para ordenar por ese valor.

  6. Examine los procesos con recuentos de identificadores más altos que el resto (es probable que superen los 10 000 si no puede realizar conexiones salientes).

  7. Haga clic para resaltar uno de los procesos con un recuento alto de identificadores.

  8. En el panel inferior, los identificadores enumerados como a continuación son sockets. (Los sockets son técnicamente identificadores de archivos).

    Archivo \Device\AFD

    Captura de pantalla del Explorador de procesos con los procesos ordenados por identificadores.

  9. Algunos son normales, pero un gran número de ellos no lo son (de cientos a miles). Cierre el proceso en cuestión. Si restaura la conectividad saliente, ha demostrado aún más que la aplicación es la causa. Póngase en contacto con el proveedor de esa aplicación.

Por último, si los métodos anteriores no le ayudaron a aislar el proceso, se recomienda recopilar un volcado de memoria completo de la máquina en el estado de problema. El volcado le indicará qué proceso tiene los identificadores máximos.

Como solución alternativa, reiniciar el equipo volverá a estar en estado normal y le ayudará a resolver el problema por el momento. Sin embargo, cuando un reinicio no es práctico, también puede considerar aumentar el número de puertos en la máquina mediante los siguientes comandos:

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

Este comando establecerá el intervalo de puertos dinámico para que comience en el puerto 10000 y finalice en el puerto 10999 (1000 puertos). El intervalo mínimo de puertos que se puede establecer es 255. El puerto de inicio mínimo que se puede establecer es 1025. El puerto final máximo (en función del intervalo que se está configurando) no puede superar los 65535.

Nota:

Tenga en cuenta que aumentar el intervalo de puertos dinámicos no es una solución permanente, sino solo temporal. Tendrá que realizar un seguimiento de qué procesos o procesadores consumen el número máximo de puertos y solucionar problemas desde ese punto de vista del proceso en cuanto a por qué consume un número tan alto de puertos.

Para Windows 7 y Windows Server 2008 R2, puede usar el script siguiente para recopilar la salida netstat con la frecuencia definida. En las salidas, puede ver la tendencia de uso del puerto.

@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

Más información

  • ¡Agotamiento de puertos y tú! - En este artículo se proporciona información detallada sobre los estados de netstat y cómo puede usar la salida de netstat para determinar el estado del puerto.
  • Detección del agotamiento efímero de puertos: este artículo tiene un script que se ejecutará en un bucle para notificar el estado del puerto. (Aplicable para Windows 2012 R2, Windows 8, Windows 10 y Windows 11)