Cómo conectarse a SQL Server a través de un túnel SSH

La conexión a un servidor SQL Server a través de un túnel SSH a una instancia por default es sencilla, pero en el caso de una instancia con nombre (named instance) hay que realizar algunos pasos adicionales para obtener los mismos resultados.

Un túnel SSH es una forma de redireccionar paquetes de red desde una máquina de origen a la de destino pasando por una conexión SSH a una máquina intermedia. Un escenario común en que esto se utiliza es para realizar una comunicación con una máquina de una red interna (detrás de un firewall) desde afuera, ya que una de las ventajas que esto tiene es que la comunicación es segura entre los dos puntos.

Supongamos que queremos conectarnos a un servidor SQL Server de una red interna desde otro lugar fuera de la red usando SQL Server Management Studio. Si la instancia a la que queremos conectarnos es la default (sin nombre), la forma más fácil es crear un túnel con la siguiente configuración:

  • El origen es localhost en la misma puerta 1433 (siempre y cuando la máquina local no esté corriendo a su vez una instancia, con lo que el puerto estaría ocupado).
  • El destino es la puerta 1433 de la máquina de destino.

Con esta configuración podemos simplemente conectarnos a “localhost” o “127.0.0.1” en Management Studio, y estaremos conectados. No es necesario crear otros túneles auxiliares.

Named Instances

El escenario se complica algo cuando la instancia es una “named instance”, es decir, una instancia con nombre. Si estuvieramos en la red interna, nos estaríamos conectando a, por ejemplo, servidorbd\nombreinstancia, donde “servidorbd” es la máquina y “nombreinstancia” es justamente el nombre de la instancia. El problema para la configuración de túnel SSH está en que al hacer esto el cliente, Management Studio, está haciendo una conexión UDP adicional para averiguar el puerto en el cuál está escuchando la instancia.

La idea es que cada instancia de SQL Server corriendo en un mismo servidor tiene un nombre distinto, es un servicio distinto y tiene un puerto distinto. El truco está en evitar esta conexión UDP y conectarnos directamente al puerto en el que la instancia está escuchando, creando el túnel con destino a dicho puerto en lugar del por defecto 1433.

Obteniendo el puerto

La forma más simple (y poco elegante) para conseguir el puerto en el que está escuchando la instancia es ejecutando la siguiente consulta en la instancia a la que queremos conectarnos:

exec xp_readerrorlog
La salida de esta instrucción es una serie de entradas del log de la instancia. Entre ellas aparecerá una del tipo:

 

Server is listening on [ ‘any’ <ipv4> 12345].
Donde en el ejemplo “12345” es el puerto de destino. Con esto sólo nos queda configurar el túnel de la misma forma en que lo hicimos con la instancia default y podremos conectarnos.
Conexión a un puerto no default en Management Studio

En el caso de Management Studio la sintáxis del destino de la conexión es menos intuitivo de lo que parece. Si normalmente nos conectamos a una named instance como

servidorbd\nombreinstancia

en este caso deberemos conectarnos a

127.0.0.1,12345

Se recomienda utilizar 127.0.0.1 en lugar de localhost. 12345 es el puerto. Como se puede apreciar, la separación entre el hostname y el puerto es una coma, no dos puntos (“:”).

Potenciales problemas
  • Si la conexión no se realiza, verificar que SQL Server esté atendiendo por TCP/IP y no sólo por Named Pipes o Shared Memory.