You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows Server 2016中SQL Server 2016如何仅允许指定IP远程连接?

仅允许指定IP远程连接SQL Server 2016的解决方案

我来帮你搞定这个头疼的问题!你遇到的核心矛盾是:必须开TCP/IP做数据库同步,但防火墙规则没生效,导致所有IP都能尝试连接,还被暴力破解骚扰。下面是几个经过验证的靠谱方法,按顺序试大概率能解决:

一、先把Windows防火墙规则配置对(最关键)

你之前的防火墙规则没生效,大概率是配置顺序或细节出错了,重新按这个步骤来:

  1. 先确认SQL Server的TCP/IP协议是开启的:打开SQL Server Configuration Manager→SQL Server Network Configuration→Protocols for MSSQLSERVER,确保TCP/IP是启用状态,重启SQL Server服务让设置生效。
  2. 打开Windows Defender防火墙高级设置:控制面板→系统和安全→Windows Defender防火墙→高级设置。
  3. 新建入站规则:
    • 规则类型选「端口」,点击下一步;
    • 选择「TCP」,特定本地端口填1433(如果是命名实例,先去SQL配置管理器的TCP/IP属性里查实际用的端口,别填错),点击下一步;
    • 行动选「允许连接」,点击下一步;
    • 勾选你需要的网络环境(比如域、专用,公网如果不需要就别勾),点击下一步;
    • 给规则起个好记的名字,比如「允许指定IP访问SQL 1433端口」,完成创建。
  4. 编辑规则的作用域:
    • 找到刚创建的规则,右键→属性→切换到「远程IP地址」选项卡;
    • 选择「下列IP地址」,点击「添加」,把你要允许的本地数据库IP逐个加进去;
    • 务必不要选「任何IP地址」,这样只有指定IP能连,其他都会被防火墙拦截。
  5. 清理旧规则:把之前创建的无效防火墙规则全部删掉,避免规则冲突导致新规则不生效。

二、加个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请求,从根源上减少暴露面:

  1. 打开SQL Server Configuration Manager→SQL Server Network Configuration→Protocols for MSSQLSERVER→TCP/IP,右键选属性;
  2. 切换到「IP地址」选项卡,找到服务器上的目标IP(比如你用来同步的内网IP),把「Active」设为Yes,「Enabled」设为Yes
  3. 把其他不需要的IP(比如公网IP、无关内网IP)的「Enabled」设为No
  4. 重启SQL Server服务,这样SQL只会在你指定的IP上接收连接请求,其他IP根本连不上。

补充:你之前防火墙失效的可能原因

  • 规则顺序问题:Windows防火墙是按规则从上到下匹配的,如果有允许所有IP的规则在前面,后面的阻止规则就不会触发;
  • 端口填错:命名实例默认不用1433,是动态端口,得先查清楚实际端口;
  • 网络环境不匹配:比如你的电脑在公网,但规则只应用到域网络,导致规则无效。

按上面的方法一步步来,应该就能实现只让指定IP连接SQL Server,同时挡住那些暴力破解的请求了。记得每一步操作后测试一下,确保指定IP能正常连接,其他IP连不上。

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

火山引擎 最新活动