通过NAT访问SQL Server实例

7
我试图访问一个通过IP NAT映射公开的SQL Server。所有端口都是开放的。我不知道NAT的细节,因为它在公司的某个地方隐藏在一堆繁琐的手续中,这是否相关并不清楚。
这是我发现的问题。当您尝试访问SQL Server的命名实例时,客户端会询问该命名实例正在运行的端口。如果我远程桌面连接到SQL Server,我可以使用netstat找到该实例的端口,并成功通过防火墙连接。然而,通过实例名称连接不起作用。我的猜测是服务器在某些时候以其内部IP地址响应,而客户端正在使用它。
有人知道这是真的吗?是否有解决方法?

1
实例到端口号的转换是由监听在1434/udp端口上的SQL浏览器服务完成的。请检查您的NAT(处于DMZ模式)是否也发布了所有的UDP端口。 - wqw
在我的环境中,关闭 SQL Server 机器上的 Windows 防火墙有所帮助。 - scar80
2个回答

7
实例监听端口协议的发现取决于SQL Server Browser Service。这使用UDP 1434端口。通过NAT转发UDP 1434,您的客户端应该能够与SQL Server浏览器服务进行交互(如果 SQL Server浏览器的UDP响应数据包可以返回到客户端,这是一个的问题),但即使交互成功,您的客户端也会陷入困境:现在它知道了SQL Server动态监听端口,它如何到达它?NAT必须动态转发SQL Server选择的端口,或者它必须转发所有端口。

我建议您让SQL Server侦听预配置的、静态分配的端口。请参见How to configure an instance of SQL Server to listen on a specific TCP port or dynamic port。让您的NAT转发端口。然后在客户端中显式地使用此端口连接字符串。不要使用标准端口1433,因为我假设在NAT之前是公共互联网,而1433受到来自各种机器人和恶意集群的不断扫描。


1
+1,而且 1433 正在逐渐消失,因为它被用于 默认 实例(没有实例名称),微软强烈建议永远不要使用默认实例(出于安全原因)。因此,每当您有一个命名实例时,1433 将永远不相关。 - Jerry Dodge

3
使用SQL Server配置管理器将命名实例配置为在静态端口上运行。在配置管理器中,选择“SQL Server网络配置 -> <命名实例>的协议 -> TCP/IP -> 属性”。
然后在连接字符串中提供命名实例的主机名和端口。主机名和端口号以以下格式指定(假设主机名为“Test”,监听端口为“1492”):
`... Server='Test,1492'; ...`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接