我在一台不在域中且未在混合模式下运行的机器上运行 SQL 服务器(它使用“Windows 身份验证”运行)。
我正在尝试从通过 TCP/IP 运行 freetds 的 Linux Web 服务器连接到它,使用 NTLM 进行身份验证。
SQL 服务器上的防火墙非常严格。1433 对我的 Web 服务器开放,但我从 Web 获得的信息相互矛盾,说明 NTLM 需要哪些额外端口 (TCP/UDP) 才能成功。当前失败;我可以在 1433 上通话以请求 NTLM,但实际身份验证总是失败。
一位消息人士说 137、138、139,但这些只是 NetBIOS 端口。我真的需要那些吗?另一个消息来源说 135。还有一些人似乎说 1434 ......我无法确定它的正面或反面。该死的吉姆,我是程序员,不是网络管理员!
编辑:
确切的错误信息:
Msg 18452, Level 14, State 1, Server , Line 0
Login failed for user '(null)'. Reason: Not associated with a trusted SQL Server connection.
Msg 20002, Level 9, State -1, Server OpenClient, Line -1
Adaptive Server connection failed
我正在尝试连接远程机器用户名,即“服务器名\用户名”。一些消息来源建议我在本地和远程机器上设置镜像帐户,但是本地机器运行的是 Linux,而不是 Windows 下的 IIS。
您需要的唯一端口是 1433 作为 TCP。这是默认的、未命名的 SQL Server 实例用于 TCP 连接的端口。FreeTDS 将在此端口上启动一个连接,然后在此连接上协商一个 NTLMv2 身份验证,作为一系列质询/响应数据包交换。Afaik 不需要任何其他端口。请参阅域登录。
您提到的所有其他端口都用于命名管道连接,并且 FreeTDS 不支持通过命名管道进行 NT 身份验证:
要作为 NT 域用户进行身份验证,您必须以“域\用户”的形式指定用户名。如果 SQL Server 在独立计算机上运行,则“域”是计算机名称。
如果它不在域中并且仅在 Windows Auth 模式下运行,我不确定您是否能够连接到该服务器。您将什么用户名添加到服务器作为登录名,以及您从客户端计算机登录的用户名是什么?
135-139 是用于 SMB(大多数情况下,有时是 445)和 Windows RPC 的端口。
仅当您使用 SQL 浏览器连接到实例时才需要 1434 UDP,例如在命名实例 (SERVERNAME\INSTANCE) 的情况下,但如果您使用的是 (SERVERNAME or SERVERNAME,PORT) 并且实例是肯定的在 1433 上运行,则不需要额外的端口。您可以通过从命令提示符发出“telnet SERVERNAME PORT”来测试端口是否打开。
我相信 FreeTDS 0.82 中的 NTLMv2 实现充其量是错误的。这里有一个补丁 您的另一个选择是更改 SQL Server 窗口上的组策略以发送 NTLMv1 响应,如文档中所建议的那样。
这是您需要在 Windows Server 2003 上更改的屏幕截图。您会影响连接到服务器的其他客户端,以确保您可以先在某处进行测试。
编辑:您是否尝试过打开登录并查看是否有任何有用的信息?
如果 SQL 服务器是托管的,请联系您的托管提供商以确保他们的本地防火墙也没有阻止该端口。