Sql Server 2019装好了,本机连得顺畅,换个电脑就死活连不上——这类问题在SQL Server远程访问的求助里占了大头。如果你用的是云服务器,大概率不只是数据库配置的问题,还牵扯到Windows防火墙和云平台安全组的入方向规则。这篇就按我实际踩坑的顺序,把Sql Server 2019远程访问的完整链路拆开讲清楚,数据库内部配置、防火墙放行、安全组规则三层一路打通,每一步为什么要这么做、哪些地方容易翻车,都会说到。适合刚接触SQL Server、准备把数据库从本机挪到云上的同学,也适合配了好几次都失败、想彻底弄明白原理的老哥。
先说一个核心认知:远程访问连不上,绝大多数时候不是某一个配置错了,而是三层关卡叠加拦截。搞清楚这个思路,后面排查才有方向。
1. 项目概述与远程访问的整体思路
1.1 为什么远程连接总是失败
我帮人排查SQL Server远程访问问题时,发现一个非常普遍的困惑:服务器本机上用SQL Server Management Studio(SSMS)连localhost完全正常,一换到本地电脑连公网IP就超时或者报错。很多人第一反应是账号密码错了,或者服务没启动,其实问题往往出在流量根本没走到数据库这一层。
一条远程连接从你的客户端出发,到达SQL Server 2019,要经过这么几个环节:公网路由、云平台安全组入方向规则、服务器网卡、Windows防火墙、SQL Server网络协议监听,最后才是身份验证。这当中任何一环把包丢了,客户端看到的都是连接失败。
为什么本机连没问题,远程就不行?因为本机连接走的是共享内存或者命名管道,本质上不经过网卡,自然也不受防火墙和安全组的限制。所以"本机能连"只能证明SQL Server服务在运行,不能证明网络链路是通的。这是理解整个远程访问配置的起点。
1.2 三层配置的先后顺序
远程访问配置牵扯三个层面:SQL Server自身、Windows防火墙、云安全组。我建议的配置顺序是从内到外:先搞定SQL Server,再放行Windows防火墙,最后配置安全组入方向规则。
原因也简单。安全组在最外层,如果你只放行了安全组,但SQL Server压根没监听或者没启用TCP/IP,那流量进来也是白搭。反过来,SQL Server配好了,外面两层防火墙任何一个没放行,流量同样到不了数据库。按从内到外的顺序配置和排查,能把变量控制在一个最小范围内,哪一步出问题直接锁定在哪一个层面。
还有一点很多人会忽略:云服务器通常有两道防火墙。一道是云平台的安全组,一道是Windows系统自带的防火墙。两者是叠加关系,不是替代关系。你光在云控制台放行端口,Windows防火墙不放行,一样连不上;只放行Windows防火墙,安全组没配,同样白搭。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 本地数据库配置:启用SQL Server认证与TCP/IP协议
2.1 新装实例默认只开Windows验证
SQL Server 2019安装完成后,默认的服务器身份验证模式是"Windows 身份验证模式"。也就是说,你只能用Windows系统账号连接,用sa或者自己创建的SQL账号登录会被拒绝。远程连接场景下,客户端不可能用服务器上的Windows账号来登录,所以第一步就是把验证模式改成混合模式。
操作用SSMS本地连接实例,右键服务器实例节点,选择"属性",切到"安全性"页,服务器身份验证选"SQL Server和Windows身份验证模式",确定。改完会提示需要重启SQL Server服务才能生效。
重启服务可以在Windows服务管理器里做,找到"SQL Server (MSSQLSERVER)"(默认实例名)或者"SQL Server (实例名)",右键重启。这一步很容易被忽略,很多人在SSMS里改了设置以为马上就生效,结果远程连接还是报18456,其实就是服务没重启,认证模式还是旧的。
2.2 建立专用于远程的SQL账号
我不建议你直接用sa登录远程。sa是系统管理员账号,目标太大,公网环境下一旦被爆破成功,数据库就彻底暴露了。更稳妥的做法是创建一个独立账号,专门给远程管理或者应用连接用。
创建账号可以直接在SSMS里用SQL语句执行:
sql复制USE [master];
GO
CREATE LOGIN RemoteAdmin WITH PASSWORD = N'你的强密码';
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [RemoteAdmin];
GO
上面这条命令创建了一个叫RemoteAdmin的登录名,并把它加到sysadmin服务器角色。如果你只是想让某个应用连接特定数据库,不需要这么高的权限,可以只创建数据库用户并授予相应权限,比如:
sql复制USE [你的数据库名];
GO
CREATE USER RemoteUser FOR LOGIN RemoteAdmin;
GO
ALTER ROLE db_datareader ADD MEMBER RemoteUser;
ALTER ROLE db_datawriter ADD MEMBER RemoteUser;
密码强度一定要够,建议至少12位,包含大小写字母、数字和特殊字符。SQL Server 2019默认强制密码策略,太简单的密码根本创建不了,这本身是个好事,别为了图省事去关掉强制策略。
2.3 启用TCP/IP协议并确认监听端口
SQL Server默认实例默认监听1433端口,但前提是TCP/IP协议处于启用状态。有些精简安装或者某些优化过的Windows环境,TCP/IP可能是禁用的。
打开"SQL Server配置管理器"(在开始菜单搜SQL Server Configuration Manager,或者运行SQLServerManager15.msc),展开"SQL Server网络配置",选中实例对应的协议,右侧列表里找到"TCP/IP",状态如果是"已启用",不用动;如果是"已禁用",右键启用。
启用之后,右键TCP/IP选"属性",切到"IP地址"选项卡。往下拉到最底部的"IPAll",这里有一个"TCP端口"字段,默认实例通常是空的或写着1433,手动确认填写1433。如果你打算换非默认端口,也在这里改。
改完记得重启SQL Server服务。这一步配合后面要讲的防火墙和安全组,端口号必须保持一致,否则前面放行1433,SQL实际监听2433,流量进来找不到服务,照样连不上。
2.4 命名实例与SQL Browser服务的取舍
如果你装的是命名实例(比如 计算机名\SQLEXPRESS),情况会麻烦一点。命名实例默认使用动态端口,每次SQL Server服务启动时端口都可能变。客户端连接时填 服务器IP\实例名,SQL Server需要借助SQL Browser服务(监听UDP 1434)来告诉客户端"当前实例在哪个端口"。
远程访问命名实例,我建议直接固定端口,省掉SQL Browser这个依赖。做法还是SQL Server配置管理器,TCP/IP属性IPAll里,把"TCP动态端口"字段清空,然后在"TCP端口"填一个固定值,比如1433或者自定义端口。重启服务后用netstat -ano | findstr 1433确认监听正常。
如果不方便固定端口,那就必须保证SQL Browser服务处于运行状态,并且Windows防火墙和安全组都要放行UDP 1434。SQL Browser默认安装后可能是"手动"启动状态,需要在服务管理器里改成"自动"并启动它。实际生产环境里,我强烈优先选择固定端口,配置简单,少一个服务依赖就少一层故障点。
3. Windows防火墙入站规则配置
3.1 图形界面添加入站规则
SQL Server自身配置好之后,接下来是Windows防火墙。在服务器上按Win+R,输入wf.msc回车,打开"高级安全 Windows Defender防火墙"。左侧选"入站规则",右侧点"新建规则"。
规则类型选"端口",协议和端口选"TCP","特定本地端口"填1433(或你改过的自定义端口),操作选"允许连接",配置文件三个勾(域、专用、公用)全部保留,名称随便写个"SQL Server 1433"方便自己识别。完成。
这里非常关键的一点是配置文件那一页。云服务器默认网络位置通常是"公用网络",如果你只勾了"域",防火墙规则实际上不生效,因为公用网络不走这条规则。我见过好多次这种配置方式,看着规则加上了,但从外面连就是不通。三个配置文件全勾是最省心的做法,除非你有特殊需求。
3.2 命令行快速放行1433端口
如果你习惯命令行操作,或者需要批量部署多台服务器,可以用管理员权限的PowerShell执行:
powershell复制netsh advfirewall firewall add rule name="SQL Server 1433" dir=in action=allow protocol=TCP localport=1433
这条命令的作用和图形界面添加端口规则完全一样,name参数是规则名称,dir=in表示入站方向,action=allow表示允许,protocol=TCP指定协议,localport=1433指定本地端口。执行完可以在防火墙入站规则里看到新增的一条。
如果你的SQL因为某种原因使用了动态端口,也可以改为放行sqlservr.exe程序本身:
powershell复制netsh advfirewall firewall add rule name="sqlservr.exe" dir=in action=allow program="C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn\sqlservr.exe"
注意路径里的MSSQL15.MSSQLSERVER对应SQL Server 2019默认实例,命名实例路径会不同。放行程序的好处是无论端口怎么变都能连,但安全粒度更粗,我一般还是优先放行具体端口。
3.3 防火墙配置的常见误区
防火墙这块最常见的坑有三个。第一,改了端口号但防火墙规则里还是旧端口,或者只添加了端口规则而SQL实际监听的是动态端口,导致流量被防火墙拦截。第二,把入站和出站搞混,远程连接只需要入站规则,出站是服务器主动往外连才用得上。第三,想省事直接把Windows防火墙关闭,这非常危险,公网服务器没有防火墙等于把所有端口都暴露出去,正确做法是精准放行需要的端口。
还有一个隐蔽问题:有些安全加固脚本或一键配置工具会把防火墙策略设为"阻止所有入站连接"。你明明在入站规则里加了一条允许1433,但实际上"阻止所有连接"的优先级更高,规则被整体盖住了。如果确认防火墙规则没错但还是连不上,去防火墙设置页看看"阻止所有传入连接,包括允许的应用列表中的应用"这项是不是被勾上了。
4. 云服务器安全组入方向规则配置
4.1 安全组到底是什么
安全组是云平台在虚拟机外层的分布式防火墙,它独立于操作系统,工作在网络层。你可以把它理解成小区门口的门禁:安全组规则没放行,流量连小区都进不了,更不用说到你Windows防火墙这栋楼门口。
所以配置远程访问时,脑子里要有一个流量从外向内的顺序:公网流量先经过安全组入方向规则过滤,通过之后到达服务器网卡,然后由Windows防火墙继续过滤,放行后到达SQL Server的监听端口。两个防火墙,一个在操作系统外面,一个在操作系统里面,少了哪个都不行。
很多新手在云控制台配了安全组,然后Windows防火墙没放行,连连报错;或者Windows防火墙放行了,安全组那边压根没添加入方向规则。两种都是两边配置脱节导致的。
4.2 添加安全组入方向规则的操作步骤
不同云平台的控制台界面略有差异,但核心操作都差不多。登录云服务器控制台,找到目标实例,在实例详情或操作菜单里找到"安全组"入口。部分产品(尤其是轻量应用服务器)不叫安全组,直接叫"防火墙",位置可能在实例详情页的"防火墙"标签页里,作用和安全组一样。找不到别死磕"安全组"这三个字。
进入安全组管理页面后,找到当前实例关联的安全组,点"管理规则",然后选"入方向"(有的控制台叫"入站规则"),点"添加规则"或者"手动添加"。
关键参数填法:
- 协议类型:TCP
- 端口范围:1433/1433(有的控制台直接填1433)
- 授权对象/源IP:建议先填你当前电脑的公网IP/32,而不是直接写0.0.0.0/0
- 策略:允许
- 描述:建议写"SQL Server远程访问",方便以后管理
保存之后规则通常秒级生效。你可以立刻在本地电脑用telnet或者Test-NetConnection测试一下端口通不通。
4.3 源IP别图省事设置为全放行
安全组入方向规则的"源IP"或"授权对象"选项,决定了哪些来源IP可以访问这个端口。0.0.0.0/0表示所有IPv4地址都可以访问,这是很多教程图省事会写的,但我强烈不建议你上来就这么配。
1433端口直接暴露公网,会立刻引来全网扫描器的关注。我在真实服务器上验证过,开放1433一个晚上,SQL Server错误日志里全是来自世界各地的登录失败记录,各种sa弱密码爆破尝试。如果账号密码不够强,或者存在漏洞,后果可想而知。
正确的做法是:在安全组入方向规则里,源IP写成你办公环境的固定出口IP加/32,例如123.123.123.123/32。如果办公网络出口IP不固定,可以暂时把/32放宽到/24或/16,但要清楚这也会扩大暴露面。测试通过后,能收窄就收窄。
4.4 多安全组关联与规则叠加的坑
一个云服务器实例可以同时关联多个安全组。不同云平台对多安全组的处理逻辑不完全一样,有的是取并集,有的按优先级执行。这就导致一个很隐蔽的问题:你在新加的安全组里放行了1433,但实例还挂着一个旧的安全组,里面的规则包含"拒绝所有入站"或者没有放行规则,结果还是连不上。
排查时一定先在实例详情页看清楚当前关联了哪些安全组,逐个检查入站规则,而不是只盯着你刚配置的那一个。我在实际项目中就碰到过一次这种情况,新旧安全组都挂在实例上,新安全组放行了1433,但旧安全组没放行,流量被旧安全组挡掉了,解绑旧安全组后立刻通了。
还有一种情况:部分云产品实例列表页会同时展示"安全组"和"防火墙"两个入口,如果你只在其中一个里面加了规则,另一个可能根本没生效。确认你加的规则所在的组确实被实例关联,并且规则方向是入方向。
5. 远程连接验证与常用排查手段
5.1 先用端口测试,别急着打开SSMS
配置完成后,第一步验证应该是端口连通性,而不是直接打开SSMS连数据库。因为SSMS连接超时往往要等几十秒甚至更久,测试端口则几秒钟就能出结果,而且能明确区分是网络层问题还是数据库认证层问题。
Windows PowerShell里执行:
powershell复制Test-NetConnection 你的服务器公网IP -Port 1433
输出的结果里重点看TcpTestSucceeded。True代表端口通,网络层已经打通,接下来去查SQL Server认证问题;False代表端口不通,说明安全组、Windows防火墙或者SQL Server监听有异常,继续逐层排查。
也可以用传统telnet方式测试。在命令提示符里执行telnet 你的服务器公网IP 1433,如果出现一个黑窗口且光标闪烁,说明端口通;如果提示"无法打开到主机的连接",就是不通。
5.2 用SSMS发起远程连接
端口测试通过后,再打开SSMS做真正的连接验证。服务器名称填写格式:你的服务器公网IP,1433。注意中间是英文逗号,不是冒号。如果是自定义端口,就填IP,自定义端口。命名实例且没固定端口的情况下,可以填IP\实例名,但前提是UDP 1434放行且SQL Browser服务正常运行。
身份验证选"SQL Server 身份验证",登录名填第2节创建的账号,密码填对应的强密码。点击连接,如果成功,说明三层的配置全部正确。如果失败,根据报错信息对照下面的速查表。
5.3 常见报错编号速查表
| 错误编号 | 直接含义 | 主要排查方向 |
|---|---|---|
| 18456 | 登录失败 | 账号密码、认证模式、账号是否被禁用或锁定 |
| 26 | 找不到服务器/指定实例 | 端口是否正确、SQL Browser是否可用、实例名是否正确 |
| 40 | 无法打开与SQL Server的连接 | 网络层问题、SQL Server服务是否运行、防火墙拦截 |
| 10061 | 目标计算机积极拒绝 | 端口未监听、防火墙拦截、SQL服务未启动 |
| 53 | 命名管道/网络路径错误 | 网络层不通、TCP/IP未启用 |
举例来说,报18456说明你已经到了SQL Server这一层,网络链路是通的,去查认证配置;报26或40说明流量没到达数据库,回头查安全组、防火墙和SQL Server监听配置。这个判断逻辑能帮你省下大量盲目尝试的时间。
5.4 端口连通了但SQL连接超时怎么查
一个容易让人蒙圈的场景:Test-NetConnection显示1433端口是通的,但SSMS连接还是超时。这种情况最常见的原因有两个。
第一,SQL Server监听的不是公网网卡对应的地址。在服务器上执行netstat -ano | findstr 1433,如果看到监听地址是127.0.0.1:1433,说明SQL Server只监听在本机回环地址上,外网流量根本进不来。需要去SQL Server配置管理器TCP/IP属性里检查IP地址配置,确保对应网卡IP的"已启用"是"是"。
第二,SSMS连接的是命名实例,而你填写的实例名无法被解析。命名实例连接如果依赖SQL Browser但UDP 1434没放行,SSMS会卡很久后报超时。解决办法还是前面说的,给实例固定端口,然后直接用IP,端口方式来连,绕开SQL Browser。
6. 安全加固建议与实操心得
6.1 公网数据库每天都会被扫描
把SQL Server 2019暴露在公网上,首先要认清一个现实:扫描器无处不在。我配置完远程访问后习惯看一眼错误日志,第二天就能看到大量来自不同国家IP的连接尝试,目标几乎都是1433端口,尝试的都是sa、admin这类常见账号。这不是个案,而是公网数据库的常态。
安全组入方向规则做得越开放,被扫描的力度越大。所以第4节里反复强调源IP白名单,本质目的就是把暴露面压缩到最小。如果确实需要从多个地方连接,也尽量用IP白名单加高强度密码的组合,而不是裸奔式全放行加弱密码。
6.2 几条我实际在用的加固措施
结合我自己的运维习惯,给几条可落地的建议。
第一,数据库账号管理。禁用或者改掉sa的默认密码,平时不用sa登录。远程管理用独立账号,密码25位以上,定期更换。应用连接账号只授予需要的数据库权限,不给sysadmin。
第二,端口收敛。把默认1433改成高位端口,比如2433、14330之类,安全组和Windows防火墙同步放行新端口。修改端口不能根治爆破,但能过滤掉大量默认端口扫描流量,效果立竿见影。
第三,审计日志。在SQL Server里开启登录审计,定期检查失败登录记录。发现异常来源IP,可以在安全组里直接拉黑这个IP段,反手给自己的访问IP加白名单。
第四,有条件的话,管理操作尽量走内网。比如用云平台提供的VPC内部网络连接数据库,公网只留给必要的业务端口。这个方案对大部分个人使用场景来说配置成本偏高,但值得知道这个方向。
6.3 排障方法论:从内到外逐层验证
最后分享一个让我少踩很多坑的排查习惯。遇到远程连接失败,我按这个顺序来:先在服务器本机执行netstat -ano | findstr 1433,确认SQL Server在监听;然后本机telnet 127.0.0.1 1433,确认防火墙没拦截本机回环;接着从本地电脑Test-NetConnection公网IP 1433,确认安全组和防火墙外部链路;最后才打开SSMS试账号密码。
这四步里哪一步从通变成不通,问题就锁定在哪一段。本机监听都不正常,去查SQL Server配置;本机通、外网不通,重点查安全组和Windows防火墙。用这个方法,大多数远程访问问题能在十分钟内定位,而不是盲猜乱试。
之前有一次给客户配远程访问,按正常流程走了一遍还是不通过。从内到外验了一遍,本机监听正常,本机telnet正常,安全组也放了1433,Windows防火墙也加了规则,外网就是不通。最后发现实例关联了两个安全组,一个是我新加规则的那个,另一个是早期创建、一直挂在实例上没拆下来的旧安全组,旧安全组默认拒绝所有入站。解绑旧安全组之后,连接立刻通了。从那以后我每次看安全组,都会留意实例到底关联了哪几个组,而不只是看新配置的那个,这个习惯帮我解决了不少类似的疑难杂症。
