Solucionar 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 usados 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á que realizar de forma predeterminada una conexión saliente.
- Los puertos conocidos son los puertos definidos para una aplicación o servicio concretos. Por ejemplo, el servicio de servidor de archivos está en el puerto 445, HTTPS, en el 443, HTTP, en el 80 y RPC, en el 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 desde el 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 en https://www.microsoft.com
el puerto 443.
En un escenario en el que el mismo explorador está creando muchas conexiones a varios sitios web, para cualquier nueva conexión que el explorador está intentando, se usa un puerto efímero. Después de algún tiempo, observará que las conexiones comenzarán a producir errores y una alta posibilidad de este error sería porque el explorador ha usado todos los puertos disponibles para hacer 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ámicos predeterminado para TCP/I
Para cumplir con las recomendaciones de la Autoridad de números asignados a Internet (IANA), Microsoft ha aumentado el intervalo de puertos de cliente dinámico para las conexiones salientes. El nuevo puerto de inicio predeterminado es 49 152 y el nuevo puerto final predeterminado, 65 535. 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 del intervalo de puertos dinámicos 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. Puede ajustar este intervalo mediante el comando netsh, como se indica a continuación. El comando anterior establece el intervalo de puertos dinámicos para TCP.
netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range
El puerto de inicio es el número y el número total de puertos es el intervalo. A continuación se muestran 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ámicos para empezar en el puerto 10000 y finalizar 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 de extremo máximo (en función del intervalo que se configura) 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 inicial 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 empiezan a producir errores, verá muchas instancias de los comportamientos siguientes:
No se puede iniciar sesión en la máquina con las credenciales de dominio, pero el inicio de sesión con la cuenta local funciona. El inicio de sesión de dominio le pedirá que se comunique 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.
Errores de actualización de la directiva de grupo:
No se puede acceder a los recursos compartidos de archivos:
Se produce un error RDP en el servidor afectado:
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 de puertos:
Pruebe a realizar una conexión saliente. Desde el servidor o la máquina, 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.
Abra el visor de eventos y, en los registros del sistema, busque los eventos que indican claramente el estado actual:
Id. de evento 4227
Id. de evento 4231
Recopile una
netstat -anob
salida del servidor. La salida de netstat le mostrará un gran número de entradas para TIME_WAIT estado de un solo PID.Después de un cierre estable o un cierre brusco de una sesión, después de un período de 4 minutos (valor predeterminado), el puerto usado por el proceso o la aplicación se liberaría de nuevo en el grupo disponible. Durante estos 4 minutos, el estado de conexión TCP sería TIME_WAIT. En una situación en la que sospecha el agotamiento de puertos, una aplicación o proceso no podrá liberar todos los puertos que ha consumido y permanecerán 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 mismo nivel TCP no tiene más datos para enviar (FIN enviado), pero es capaz de recibir datos del otro extremo. Este estado no indica necesariamente el agotamiento de puertos.
Nota:
Tener conexiones enormes en TIME_WAIT estado no siempre indica que el servidor está actualmente fuera de los puertos a menos que se comprueben los dos primeros puntos. Tener muchas conexiones TIME_WAIT indica que el proceso está creando muchas conexiones TCP y que, finalmente, puede provocar el agotamiento del puertos.
Netstat se ha actualizado en Windows 10 con la adición del
-Q
modificador para mostrar los puertos que han pasado fuera de tiempo de espera 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 cmdletGet-NetTCPConnection
de PowerShell en Windows 10 también muestra estos puertos BOUND.Hasta 10/2016, netstat era inexacto. Correcciones para netstat, con retroceso a 2012 R2, permitidos Netstat.exe y
Get-NetTcpConnection
notificar correctamente el uso de puertos TCP o UDP en Windows Server 2012 R2. Consulte Revisiones de puertos efímeros de Windows Server 2012 R2 para obtener más información.Abra un símbolo del sistema en modo de administrador y ejecute el siguiente comando.
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
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 todavía no está fuera de los puertos. Si las encuentra, puede confirmar que el ha sufrido un agotamiento de puertos.
Solución de problemas de agotamiento de puertos
La clave es identificar qué proceso o aplicación está usando todos los puertos. A continuación se muestran algunas de las herramientas que puede usar para aislar un único proceso.
Método 1
Para empezar, observe la salida 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 pérdidas de puerto se deben a que los procesos en modo de usuario no cierran correctamente los puertos al detectar un error. En el nivel de modo de usuario, los puertos (en realidad los sockets) son controladores. TaskManager y 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), eche un vistazo al Administrador de tareas:
Agregue una columna denominada "handles" en details/processes.
Ordene los identificadores de columna para identificar el proceso con el mayor número de identificadores. Normalmente, el proceso con identificadores superiores a 3000 podría ser el culpable, excepto para procesos como System, lsass.exe, store.exe, sqlsvr.exe.
Si algún otro proceso distinto de estos procesos tiene un número mayor, detenga ese proceso e intente iniciar sesión con credenciales de dominio y compruebe 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:
Descargue el Explorador de procesos y ejecútelo con privilegios elevados.
Alt + seleccione el encabezado de columna, seleccione Elegir columnas y, en la pestaña Rendimiento del proceso, agregue Recuento de identificadores.
Seleccione Ver>mostrar panel inferior.
Seleccione Ver>controladores de vista>del panel inferior.
Seleccione la columna Handles (Identificadores ) para ordenar por ese valor.
Examine los procesos con mayores recuentos de identificadores que el resto (es probable que sean más de 10 000 si no puede realizar conexiones salientes).
Haga clic para resaltar uno de los procesos con un recuento alto de identificadores.
En el panel inferior, los identificadores que se muestran como se indica a continuación son sockets. (Técnicamente, los sockets son identificadores de archivo).
Archivo\Dispositivo\AFD
Algunos son normales, pero muchos de ellos no son (cientos a miles). Cierre el proceso en cuestión. Si eso 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 la 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 del problema. El volcado le mostrará qué proceso tiene más identificadores.
Como solución alternativa, reiniciar el equipo lo recuperará en estado normal y le ayudará a resolver el problema por el momento. Sin embargo, si un reinicio no es práctico, también puede considerar la posibilidad de 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ámicos para empezar en el puerto 10000 y finalizar 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 de extremo máximo (en función del intervalo que se configura) 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. Deberá realizar un seguimiento de los procesos o procesadores que consumen el número máximo de puertos y solucionar problemas desde el punto de vista de ese proceso en cuanto a por qué consume un gran número de puertos.
Para Windows 7 y Windows Server 2008 R2, puede usar el siguiente script para recopilar la salida de netstat con una 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 un detalle sobre los estados de netstat y cómo se puede usar la salida de netstat para determinar el estado del puerto.
- Detección de agotamiento de puertos efímeros: este artículo tiene un script que se ejecutará en un bucle para notificar el estado del puerto. (Aplicable a Windows 2012 R2, Windows 8, Windows 10 y Windows 11)