Posibles
problemas en conexiones remotas contra SQL Server vía internet.
En este documento solo
pretendo aclarar alguno de los aspectos básicos que cualquiera que
se conecte contra una instancia remota de SQLSERVER debe tener en cuenta.
- Configuración
de red.
En primer lugar debemos
conocer la configuración de red que afecta a nuestro equipo SERVIDOR
(el que tiene SqlServer). Si nuestro servidor sale a Internet por medio
de un Router, deberemos hacer NAT para redireccionar las conexiones
entrantes por el puerto 1433 (puerto por defecto de SqlServer)
a nuestro equipo SERVIDOR.
También hay
que asegurarse que cualquier firewall habilitado permite las conexiones
contra SqlServer. No hace falta decir que deberemos conocer la IP Pública
por la que sale el Router, para luego conectarnos a ella.
- Configuración
en SqlServer
Antes de intentar
conectarnos debemos comprobar los siguientes aspectos de configuración:
1. Tener arrancado
el servicio de SqlServer (mediante el administrador de servicios
de SQL Server).
2. Conocer la
IP contra la que nos conectamos: Para conectarnos contra una instancia
predeterminada de SQL Server bastaría con poner la IP publica
de la máquina donde se ejecuta, pero si se trata de instancias
con nombre es necesario especificar IP\NombreInstancia. En este caso
no nos vale con poner NombreMaquina\Instancia dado que no se va a conseguir
resolver el nombre de la maquina por Internet.
3. Protocolos
habilitados en el Servidor: Comprobar con la herramienta de red
del servidor que se encuentran habilitados los protocolos TCP/IP.
Si no hemos tenido
en cuenta alguno de los puntos anteriores, podríamos obtener el
siguiente mensaje de Error:
"No
existe el Servidor SQL Server o se ha denegado el acceso al mismo"
Pero como siempre,
existen situaciones epeciales que pueden hacer que nos surjan errores
pese a tener bien configurado lo anterior.
Lo primero que hay
que tener en cuenta es que si en una misma maquina existen varias instancias
de SqlServer, solo la predeterminada corre por el puerto 1433, y todas
las demás escuchan en un puerto que les asigna el Servicio de Resolución
de Sql, por lo que sería necesario reconfigurar el NAT de nuestro
Router para permitir las conexiones a SqlServer por el puerto correspondiente.
Pero además habrá que tener en cuenta algo MUY IMPORTANTE,
y es que el Servicio de Resolución de Sql corre en el Puerto UDP
1434, por lo que también deberemos hacer NAT a este puerto en concreto.
Sino NO conseguiremos conectarnos.
La asignación
de este puerto (la de la instancia) se puede configurar para que se haga
de forma estática o de forma dinámica. Como ya hemos dicho,
la instancia predeterminada de SQL Server escucha solicitudes de clientes
de SQL Server en el puerto 1433 (estático). Sin embargo, si una
instancia de SQL Server se configura para escuchar en un puerto estático
y si ya utiliza el puerto estático especificado otro programa que
se ejecuta en el equipo cuando se inicia SQL Server, SQL Server no escuchará
en el puerto estático especificado. Si utilizamos conexiones a
nivel de red local, en principio toda esta asignación de puertos
nos daría igual, salvo por algún firewall que nos este capando
la conectividad, pero es cuando utilizamos conexión via Internet,
cuando debemos controlar estos aspectos si queremos mantener un cierto
grado de seguridad en nuestro Servidor. Para "solucionar" esto,
podríamos hacer que una instancia determinada escuche en varios
puertos estáticos.
Pero antes de ver
como configurar una instancia de SqlServer para que escuche por varios
puertos estaticos, es más que conveniente saber como podemos conocer
en que puerto corre una instancia determinada.
Conocer en que
puerto corre una instancia determinada
Tenemos varias opciones,
y todas ellas son interesantes porque puede darse el caso de que en alguna
ocasión no dispongamos de determinadas herramientas y necesitemos
conocer estos datos de algún otro modo.
1. Desde la Herramienta de red del servidor de SqlServer.
Iniciamos la Herramienta
de red del servidor desde Inicio, Programas, Microsoft SQL Server,
Herramienta de red del servidor o tambien desde Inicio, Ejecutar
y en el cuadro Abrir escribimos svrnetcn.exe y hacemos clic en
Aceptar.
Hacemos clic en la
ficha General, seleccionamos de la lista nuestra instancia de SQL Server.
En el cuadro de lista
Protocolos habilitados, hacemos clic en TCP/IP y a continuación
clic en Propiedades.
2. Mediante Transact-Sql
Lanzando desde el
analizador de consultas de Sql la siguiente instrucción de Transact-Sql
sobre nuestra instancia:
Use master
Go
Xp_readerrorlog
En el panel Resultados,
buscaremos una entrada semejante a está:
Servidor SQL escuchando
en X.X.X.X: S
Donde X.X.X.X es la
dirección IP de la instancia de SQL Server y donde S es el puerto
TCP/IP donde escucha SQL Server.
3. Mediante una instrucción de red en Windows XP.
Si abrimos ms-dos
y ejecutamos la instrucción netstat -abn en el servidor,
tambien podremos comprobar en que puerto está corriendo una instancia
determinada de SqlServer.
La opción -b
que es la que muestra el ejecutable y el puerto de escucha, solo está
disponible en Windows XP.
Adicionalmente si
no nos encontramos en el servidor, podemos lanzar contra él desde
nuestra maquina, la instrucción osql -S nombre_instancia -U
sa. Esta instrucción nos abre una conexión contra la
instancia indicada a modo de analizador de consultas. No es necesario
que efectuemos ninguna consulta, porque lo único que nos interesa
es que hemos abierto una conexión desde nuestra maquina hacia el
Servidor, por lo que si ahora hacemos un netstat -abn en nuestra
maquina, y consutamos el resultado del comando, buscando la entrada que
hace referencia al ejecutable [osql.exe] podremos ver las ip de origen
y destino asi como los puertos por los que se establece la conexión.
Configurar el puerto de escucha de una instancia de SqlServer
Ahora si, para configurar
el puerto de forma estática, accedemos mediante la
Herramienta de red del servidor a las propiedades de TCP/IP de
nuestra instancia y pulsamos propiedades, el puerto que aparece como predeterminado
es el puerto estático que se está utilizando, si queremos
asignar varios, solo debemos ir añadiendolos uno detrás
de otro, seguidos por comas, por ejemplo: 1433,5000
Nota 1: Si
el protocolo TCP/IP está deshabilitado, lo habilitamos ahora. Para
ello, clic en TCP/IP en el cuadro de lista Protocolos deshabilitados
y a continuación, clic en Habilitar.
Nota 2: El
puerto estático que especifiquemos no debe ser igual que el puerto
dinámico en el que actualmente este escuchando otra instancia de
SQL Server. Por ejemplo, si una instancia de SQL Server escucha en el
puerto TCP/IP dinámico 1400, escribiremos por ejemplo 1500
para el nuevo puerto estático.
Si lo que queremos
es que la asignación de puerto se haga de forma dinamica,
deberemos poner el cero como puerto predeterminado.
Siempre que modifiquemos
alguno de estos puertos, a continuación deberemos reiniciar la
instancia de SQL Server.
|