Windows Server 2016中SQL Server 2016如何仅允许指定IP远程连接?
仅允许指定IP远程连接SQL Server 2016的解决方案
我来帮你搞定这个头疼的问题!你遇到的核心矛盾是:必须开TCP/IP做数据库同步,但防火墙规则没生效,导致所有IP都能尝试连接,还被暴力破解骚扰。下面是几个经过验证的靠谱方法,按顺序试大概率能解决:
一、先把Windows防火墙规则配置对(最关键)
你之前的防火墙规则没生效,大概率是配置顺序或细节出错了,重新按这个步骤来:
- 先确认SQL Server的TCP/IP协议是开启的:打开SQL Server Configuration Manager→SQL Server Network Configuration→Protocols for MSSQLSERVER,确保TCP/IP是启用状态,重启SQL Server服务让设置生效。
- 打开Windows Defender防火墙高级设置:控制面板→系统和安全→Windows Defender防火墙→高级设置。
- 新建入站规则:
- 规则类型选「端口」,点击下一步;
- 选择「TCP」,特定本地端口填
1433(如果是命名实例,先去SQL配置管理器的TCP/IP属性里查实际用的端口,别填错),点击下一步; - 行动选「允许连接」,点击下一步;
- 勾选你需要的网络环境(比如域、专用,公网如果不需要就别勾),点击下一步;
- 给规则起个好记的名字,比如「允许指定IP访问SQL 1433端口」,完成创建。
- 编辑规则的作用域:
- 找到刚创建的规则,右键→属性→切换到「远程IP地址」选项卡;
- 选择「下列IP地址」,点击「添加」,把你要允许的本地数据库IP逐个加进去;
- 务必不要选「任何IP地址」,这样只有指定IP能连,其他都会被防火墙拦截。
- 清理旧规则:把之前创建的无效防火墙规则全部删掉,避免规则冲突导致新规则不生效。
二、加个SQL登录触发器做双重保障(防防火墙漏网)
如果担心防火墙还是有漏洞,可以在SQL层面再加一道防线,创建登录触发器拦截非法IP:
CREATE TRIGGER RestrictLoginByIP ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON AS BEGIN DECLARE @ClientIP NVARCHAR(15) SET @ClientIP = CONVERT(NVARCHAR(15), CONNECTIONPROPERTY('client_net_address')) -- 替换成你允许的IP列表,记得加上本地连接的标识(LOCALHOST/::1) IF @ClientIP NOT IN ('192.168.1.100', '10.0.0.5', 'LOCALHOST', '::1') BEGIN ROLLBACK; END END
这个触发器会在每次登录时检查客户端IP,不在列表里的直接拒绝,就算防火墙出问题,SQL层面也能拦住暴力破解的请求。
三、限制SQL Server仅在指定IP上侦听(另一种思路)
还可以通过SQL配置,让服务器只在特定IP上监听SQL请求,从根源上减少暴露面:
- 打开SQL Server Configuration Manager→SQL Server Network Configuration→Protocols for MSSQLSERVER→TCP/IP,右键选属性;
- 切换到「IP地址」选项卡,找到服务器上的目标IP(比如你用来同步的内网IP),把「Active」设为
Yes,「Enabled」设为Yes; - 把其他不需要的IP(比如公网IP、无关内网IP)的「Enabled」设为
No; - 重启SQL Server服务,这样SQL只会在你指定的IP上接收连接请求,其他IP根本连不上。
补充:你之前防火墙失效的可能原因
- 规则顺序问题:Windows防火墙是按规则从上到下匹配的,如果有允许所有IP的规则在前面,后面的阻止规则就不会触发;
- 端口填错:命名实例默认不用1433,是动态端口,得先查清楚实际端口;
- 网络环境不匹配:比如你的电脑在公网,但规则只应用到域网络,导致规则无效。
按上面的方法一步步来,应该就能实现只让指定IP连接SQL Server,同时挡住那些暴力破解的请求了。记得每一步操作后测试一下,确保指定IP能正常连接,其他IP连不上。
内容的提问来源于stack exchange,提问作者Coskun Ozogul




