SQL Server Named Pipes Provider error: 40

Las configuraciones de SQL Server para conexiones remotas dependen de muchos factores que ya he comentado en este blog en el post problemas en el acceso remoto a SQL Server, el tema es que en ese post hablé de los problemas de login por contraseñas incorrectas, usuarios inactivos o tipo de autentificación erróneas, todos estos casos posibles pero no tienen nada que ver con el error que da título a este post de hoy. Este error se debe a 2 cosas fundamentales:
  1. una mala configuración del firewall de windows
  2. una mala configuración de sql server para tratar las conexiones remotas
Son 2 factores muy generales pero los voy a tratar con el mayor grado de especificación posible.

El entorno de trabajo de este post es en un Windows 2008 R2 Data Center Edition y un SQL Server 2008 R2 SP1. Mi objetivo final es conectarme remotamente a mi SQL Server por IP.

El mensaje de error completo es el siguiente:
An error has occurred while establishing a connection to the server.  When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: Named Pipes Provider, error: 40 – Could not open a connection to SQL Server) (Microsoft SQL Server, Error: 1326)
Lo primero será comprobar la configuración de firewall que básicamente es permitir la entrada de conexiones por el puerto 1433 por TCP y el puerto 1434 por UDP. Esto es una configuración por puertos pero muchas veces (como ha sido mi caso) SQL Server se instala para escuchar por puertos dinámicos, en este caso lo que debemos permitir son los programas sqlservr.exe y sqlbrowser.exe.
No voy a entrar en como configurar el firewall porque existen muchos cortafuegos y hay miles de tutoriales para permitir conexiones a un programa o a un puerto. Si es el caso del firewall de Windows solo es necesario crear reglas de entrada porque por defecto las de salida están permitidas.
Dónde localizar el sqlservr y el sqlbrowser

El sqlservr.exe siempre se encuentra en el directorio de instalación del SQL Server siempre (ya sea un sistema de 64 o 32 bits) en la carpeta: 

%ProgramFiles%\Microsoft SQL Server\MSSQL10_50.INSTANCIA\MSSQL\Binn\sqlservr.exe

El SQL Browser es más complicado porque es siempre un programa de 32 bits, o sea que en sistemas de 64 bits va a estar localizado en %ProgramFiles% (x86), en mi caso se encuentra en:

%ProgramFiles% (x86)\Microsoft SQL Server\90\Shared\sqlbrowser.exe

Pero la variante más segura es ir al SQL Server Configuration Manager que se encuentra en StartAll ProgramsMicrosoft SQL Server 2008 R2Configuration Tools y al abrir la ventana ir a SQL Server Services, hacer clic derecho sobre el SQL Server Browser elegir Properties
Nota: ya que estamos en esta pantalla comprobamos que todos los servicios estén activos (en estado Running)

En la pestaña Service de la nueva ventana nos aparece la ruta al archivo en dónde pone Binary Path.

Configurar SQL Server para permitir conexiones remotas

Una vez configurado el firewall veamos la configuración del SQL Server, lo primero que hay que comprobar es si permite conexiones remotas, desde el propio Managment Studio clic derecho sobre la instancia y clicamos en properties, y en la nueva ventana buscamos a la derecha la opción connections y vemos que esté marcado el check Allow remote connections to this server:

Si no está marcado lo marcamos y con esto en el SQL Server Managment Studio no tenemos que tocar más nada.

Comprobar la configuración TCP en el SQL Server para permitir conexiones remotas

Ahora volvemos al SQL Server Configuration Manager pero esta vez nos vamos en el apartado Network Configuration a los protocolos de nuestra instancia y verificamos que el protocolo TCP/IP esté activo

Una vez comprobado vamos a SQL Native Client 10.0 Configuration y en los protocolos cliente comprobamos que TCP/IP esté activo

Si estas dos opciones se cumplen ya podríamos acceder remotamente a nuestro servidor. Si aún así no podemos acceder por IP es porque tenemos mal configurados los puertos TCP, en mi caso el protocolo TCP estaba configurado para escuchar por el puerto 1433 pero el SQL estaba configurado para que cada vez que se conectara lo hiciera en un puerto aleatorio.

A partir de ahora este manual es solo para conectarse por IP local o remotamente a nuestro servidor.

Cambiar el puerto por defecto en SQL Server

En el SQL Server Configuration Manager nos vamos en el apartado Network Configuration nuevamente a los protocolos de nuestra instancia y hacemos clic derecho en TCP/IP, allí veremos todas las IPs de nuestro servidor y la configuración de los puertos, para conectarnos por el 1433 esta debería ser la configuración:


Si TCP Dynamic Ports tiene el valor 0 esto significa que esta configurado para puertos dinámicos, debemos borrar el 0 para todas las Ips, desde IP1 hasta IPAll y poner el valor del puerto deseado (en mi caso 1433) en TCP Port.

Una vez tenemos esto ya hemos configurado SQL para que cuando se inicie transmita en ese puerto, ahora debemos configurar el protocolo cliente para que escuche en el mismo puerto.

En el SQL Server Configuration Manager nos vamos en el apartado SQL Native Client 10.0 Configuration a los protocolos cliente TCP/IP. Alli hacemos clic derecho y en las propiedades vemos si está escuchando en el mismo puerto que hemos configurado nosotros:

Al reiniciar el servidor ya deberíamos poder conectarnos remotamente al SQL Server por IP.
Os dejo un listado con las fuentes consultadas para elaborar este manual:

Comentarios