You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下SQL Server连接异常:.NET应用本地连接失败请求排查

解决本地SQL Server连接报错0x2746的方案

这个0x2746错误我之前在Linux环境折腾SQL Server时碰到过好几次,本质就是TLS版本不兼容——你的本地SQL Server大概率还在使用旧版TLS(比如1.0/1.1),而ODBC Driver 17默认要求TLS 1.2及以上,两者不匹配就导致连接失败。你能正常连Azure生产库也佐证了这点,因为Azure SQL早就强制要求TLS 1.2了。

下面是一步步的排查和解决步骤:

1. 强制启用系统TLS 1.2(推荐方案)

Linux系统默认可能没开TLS 1.2支持,或者SQL Server没配置使用它。你可以通过修改SQL Server的注册表(是的,Linux上SQL Server也用Windows风格的注册表)来启用:

用PowerShell配置(需管理员权限)

New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'Enabled' -Value 1 -PropertyType DWORD -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'DisabledByDefault' -Value 0 -PropertyType DWORD -Force | Out-Null
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value 1 -PropertyType DWORD -Force | Out-Null
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'DisabledByDefault' -Value 0 -PropertyType DWORD -Force | Out-Null

配置完后重启SQL Server服务和你的.NET应用:

sudo systemctl restart mssql-server

2. 临时兼容旧版TLS(快速测试)

如果不想改系统配置,可以先通过sqlcmd的参数临时绕过TLS版本检查验证:

sqlcmd -S localhost,1433 -U SA -p -C

这里的-C参数表示信任服务器证书,同时允许TLS版本降级。如果这个命令能连上,就坐实了是TLS版本的问题。

对于你的.NET应用,也可以在连接字符串里添加兼容配置:

Server=localhost,1433;Database=YourDatabaseName;User Id=SA;Password=YourPassword;Encrypt=Optional;TrustServerCertificate=True;TlsVersion=Tls12

3. 确认SQL Server的TCP监听配置

有时候不是TLS的问题,而是SQL Server没开TCP/IP监听:

  • 用mssql-conf命令启用TCP监听:
    sudo /opt/mssql/bin/mssql-conf set network.tcpenabled 1
    
  • 重启服务后,用netstat检查1433端口是否被监听:
    netstat -ano | findstr :1433
    

4. 排查Linux防火墙拦截

虽然是本地连接,但Linux的防火墙(比如ufw、firewalld)可能误拦截了1433端口:

  • 临时关闭防火墙测试:
    # 针对ufw
    sudo ufw disable
    # 针对firewalld
    sudo systemctl stop firewalld
    
  • 如果能连上,就把1433端口加入白名单:
    sudo ufw allow 1433/tcp
    sudo ufw reload
    

内容的提问来源于stack exchange,提问作者msmaldi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:23:08