我在一台机器上运行了 SQL 服务器不是在一个域中,并且不是在混合模式下运行(使用“Windows 身份验证”运行)。
我正尝试通过 TCP/IP 从运行 freetds 的 Linux 网络服务器连接到它,并使用 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。
答案1
您唯一需要的端口是 1433 作为 TCP。这是默认的、未命名的 SQL Server 实例用于 TCP 连接的端口。FreeTDS 将在此端口上发起连接,然后将在此连接上协商 NTLMv2 身份验证,作为一系列质询/响应数据包交换。据我所知,不需要任何其他端口。请参阅域登录。
你提到的所有其他端口都是用于命名管道连接,而 FreeTDS 确实不是支持通过命名管道进行 NT 身份验证:
FreeTDS 对域登录的支持仅限于 TCP/IP 网络协议栈。FreeTDS 目前不支持基于命名管道的 SQL 连接 — 即通过 DCE/RPC 接口传输的连接,该接口在 Win32 计算机上使用 TCP 端口 139、445 或 135,具体取决于 DCE/RPC 本身使用的封装类型。
要验证为 NT 域用户,您必须以“域\用户”格式指定用户名。如果 SQL Server 在独立计算机上运行,则“域”是计算机名称。
答案2
如果服务器不在域中并且仅在 Windows Auth 模式下运行,我不确定您是否能够连接到该服务器。您向服务器添加了哪个用户名作为登录名,您从客户端计算机以哪个用户身份登录?
135-139 是用于 SMB(大多数,有时是 445)和 Windows RPC 的端口。
仅当您使用 SQL 浏览器连接到实例时才需要 1434 UDP,例如在命名实例 (SERVERNAME\INSTANCE) 的情况下,但如果您使用 (SERVERNAME 或 SERVERNAME,PORT) 并且实例肯定在 1433 上运行,则不需要其他端口。您可以通过从命令提示符发出“telnet SERVERNAME PORT”来测试端口是否已打开。
答案3
答案4
如果 SQL 服务器是共置的,请联系您的主机托管提供商,以确保他们的本地防火墙也没有阻止该端口。