我正在尝试访问通过IP NAT映射公开的SQL Server。所有端口都是开放的。我不知道NAT的细节,如果它是相关的,因为那是隐藏在一堆繁文缛节中的公司其他地方。
这就是我想到的。当您尝试访问SQL Server的命名实例时,客户端会询问运行命名实例的端口。如果我进入SQL Server,我可以使用netstat
查找该实例的端口,并可以通过防火墙成功连接。但是,通过实例名称连接不起作用。我的猜测是,服务器在某个时刻使用它的内部IP地址进行响应,而客户端正在使用它。
是否有人知道这是否属实,是否有解决办法?
答案 0 :(得分:6)
实例侦听端口协议发现受SQL Server Browser Service的约束。这在1434上使用UDP。通过UDP转发UDP 1434,您的客户端应该能够与SQL Server Browser服务进行交互(如果 SQL Server Browser的UDP响应数据包可以回访客户端,< em> big if),但即使是成功的交互也会让你的客户陷入困境:既然知道 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 :(得分:3)
使用SQL Server配置管理器将命名实例配置为在静态端口上运行。在配置管理器中,SQL Server Network Configuration -> Protocols for <named instance> -> TCP/IP -> Properties
。
然后在连接字符串中提供命名实例的主机名和端口。主机名和端口号以下列格式指定(假设主机名为Test
,侦听端口为1492
):
... Server='Test,1492'; ...