Directorio Activo, RPC, puertos efímeros y firewalls

Hola de nuevo. Soy Paula del equipo de Directorio Activo.

Hoy hablaremos sobre el funcionamiento básico de RPC que afecta a diferentes operaciones de Directorio Activo. Como seguramente la mayor parte de vosotros ya sabe, la comunicación utilizada para múltiples operaciones en Directorio Activo es RPC. Estas operaciones incluyen, por ejemplo, la replicación de DA, la replicación FRS, la promoción de un nuevo Controlador de Dominio, etc. También realizan conexiones RPC a los DCs la ejecución del comando dcdiag /v o incluso consultar qué DCs son los maestros de operaciones (mediante el comando netdom query fsmo). También es muy común que tratemos casos con problemas de conectividad RPC en que la replicación de DA y/o FRS no se lleva a cabo de manera satisfactoria o incluso que la replicación de DA funcione perfectamente pero los Controladores de Domino no puedan replicar SysVol por FRS.

En una comunicación RPC, el cliente se conecta al puerto TCP 135 del servidor y solicita un puerto al End Point Mapper (EPM) para comenzar la conversación RPC. El EPM del servidor reserva un puerto (llamado puerto dinámico) para este cliente y se lo envía. A partir de este punto, el cliente abre una nueva conexión TCP a dicho puerto del servidor y comienza la comunicación.

Los puertos dinámicos RPC (o puertos efímeros) que puede utilizar el EPM  de RPC (o RPCSS) van del 1025 hasta el 65535, aunque Windows 2000/XP/2003 por defecto utilizan puertos que están comprendidos en el rango 1025-5000 (en total 3976 puertos). En Windows Vista y Windows Server 2008, el rango de puertos por defecto es 49152-65535 (un total de 16384 puertos).

Puede encontrarse más información en el siguiente artículo (muy recomendable para identificar y entender los pasos a seguir cuando nos encontramos ante un problema con el RPC Endpoint Mapper):

839880 Troubleshooting RPC Endpoint Mapper errors using the Windows Server 2003 Support Tools from the product CD

Cuando no se puede establecer la conexión por estos puertos efímeros, al realizar las operaciones que hemos comentado anteriormente podemos recibir errores como el siguiente:

There are no more endpoints available from the endpoint mapper.

Vamos a ver unas trazas de red de ejemplo de un establecimiento de una comunicación RPC fallida debido a que el cliente no puede establecer la sesión al puerto dinámico que le indica el EPM del servidor.

Las trazas de red las podéis capturar con cualquier sniffer, por ejemplo en este caso nosotros hemos utilizado Microsoft Network Monitor 3.2 .

Esta es la conversación inicial RPC entre un DC y una máquina desde la que se ejecuta la operación netdom query fsmo:

Fuente

Destino

Protocolo

Descripción

cliente

dc

TCP

TCP:Flags=......S., SrcPort=1687, DstPort=DCE endpoint resolution(135), PayloadLen=0, Seq=721180773, Ack=0, Win=65535 ( ) = 65535

dc

cliente

TCP

TCP:Flags=...A..S., SrcPort=DCE endpoint resolution(135), DstPort=1687, PayloadLen=0, Seq=3452375582, Ack=721180774, Win=16384 ( Scale factor not supported ) = 16384

cliente

dc

TCP

TCP: [Bad CheckSum]Flags=...A...., SrcPort=1687, DstPort=DCE endpoint resolution(135), PayloadLen=0, Seq=721180774, Ack=3452375583, Win=65535 (scale factor 0x0) = 65535

cliente

dc

MSRPC

MSRPC:c/o Bind: UUID{E1AF8308-5D1F-11C9-91A4-08002B14A0FA} EPT Call=0x1 Assoc Grp=0x0 Xmit=0x16D0 Recv=0x16D0

dc

cliente

MSRPC

MSRPC:c/o Bind Ack: Call=0x1 Assoc Grp=0x14EE2 Xmit=0x16D0 Recv=0x16D0

cliente

dc

EPM

EPM:Request: ept_map: NDR, DRSR {E3514235-4B06-11D1-AB04-00C04FC2DCD2} v4.0, RPC v5, 0.0.0.0:135 (0x87) [DCE endpoint resolution(135)]

dc

cliente

EPM

EPM:Response: ept_map: NDR, DRSR {E3514235-4B06-11D1-AB04-00C04FC2DCD2} v4.0, RPC v5, 10.200.8.59:1025 (0x401) [1025]

cliente

dc

TCP

TCP: [Bad CheckSum]Flags=...A...F, SrcPort=1687, DstPort=DCE endpoint resolution(135), PayloadLen=0, Seq=721181002, Ack=3452375795, Win=65323 (scale factor 0x0) = 65323

dc

cliente

TCP

TCP:Flags=...A...., SrcPort=DCE endpoint resolution(135), DstPort=1687, PayloadLen=0, Seq=3452375795, Ack=721181003, Win=65307 (scale factor 0x0) = 65307

dc

cliente

TCP

TCP:Flags=...A...F, SrcPort=DCE endpoint resolution(135), DstPort=1687, PayloadLen=0, Seq=3452375795, Ack=721181003, Win=65307 (scale factor 0x0) = 65307

cliente

dc

TCP

TCP: [Bad CheckSum]Flags=...A...., SrcPort=1687, DstPort=DCE endpoint resolution(135), PayloadLen=0, Seq=721181003, Ack=3452375796, Win=65323 (scale factor 0x0) = 65323

En la respuesta del End Point Mapper (EPM) del DC ante la solicitud de conexión del cliente (trazas en rojo), el DC indica que van a continuar hablando por el puerto TCP 1025. Si filtramos el tráfico generado en el cliente con destino el DC y puerto 1025, vemos los siguientes intentos de conexión al mismo:

Fuente

Destino

Protocolo

Descripción

cliente

dc

TCP

TCP:Flags=......S., SrcPort=1688, DstPort=1025, PayloadLen=0, Seq=570735085, Ack=0, Win=65535 ( ) = 65535

cliente

dc

TCP

TCP:[SynReTransmit #63]Flags=......S., SrcPort=1688, DstPort=1025, PayloadLen=0, Seq=570735085, Ack=0, Win=65535 ( ) = 65535

cliente

dc

TCP

TCP:[SynReTransmit #63]Flags=......S., SrcPort=1688, DstPort=1025, PayloadLen=0, Seq=570735085, Ack=0, Win=65535 ( ) = 65535

cliente

dc

TCP

TCP:[SynReTransmit #63]Flags=......S., SrcPort=1688, DstPort=1025, PayloadLen=0, Seq=570735085, Ack=0, Win=65535 ( ) = 65535

Como podemos ver claramente en las trazas de red, el cliente trata de conectarse varias veces a dicho puerto en el DC y no recibe respuesta (ver retransmisiones). Si observamos unas trazas de red simultáneas a las anteriores pero obtenidas en el DC (capturar el tráfico en ambos extremos es muy recomendable en este tipo de situaciones), únicamente se observa la conversación inicialmente descrita en la primera tabla. Es decir, el DC no llega a recibir los paquetes que el cliente le envía por el puerto 1025.

Lo más probable en este caso es que haya un firewall que esté bloqueando las comunicaciones. Puede ser un firewall hardware/software, el firewall integrado de Windows o incluso un antivirus con funcionalidad de firewall. (Tened también en cuenta que no todos los problemas relacionados con conectividad RPC se deben a la configuración de los firewalls!!!)

Ante esta situación tenemos dos opciones para evitar el bloqueo:

  1. Abrir los puertos comprendidos entre el 1025 y el 5000 en el firewall para permitir la negociación/tráfico RPC entre las máquinas implicadas
  2. Configurar RPC en el DC para utilizar un rango de puertos específicos y abrir dichos puertos en el firewall para permitir la negociación/tráfico RPC entre dichas máquinas

Si queréis obtener una lista completa de los puertos necesarios para el correcto funcionamiento de un entorno de Directorio Activo, echadle un vistazo a los siguientes artículos:

Espero que esta información os sirva de utilidad, ya que es uno de los problemas que tratamos más frecuentemente y su detección es relativamente sencilla a partir de unas trazas de red.

- Paula Tomás Galed