首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

限制 SQL Server 僅允許特定 IP 存取的三種實作方案

     編輯:關於SqlServer

方案一:Windows 防火牆規則(最簡單、效能最佳)

在執行 SQL Server 的伺服器上,建立「輸入規則」:

  • 規則類型:自訂 → 協議:TCP → 本機埠:1433(或自訂埠)。
  • 範圍:遠端 IP 位址 → 新增允許的用戶端 IP(如 192.168.1.100),其餘預設封鎖。
  • 動作:允許連線 → 套用至「網域/專用/公用」所有設定檔。

進階建議:將 SQL Server 預設埠 1433 修改為非標準埠(如 2433),降低自動掃描攻擊風險。

方案二:SQL Server 2005+ 端點限制(需專用網卡)

適用於多網卡伺服器,僅允許特定網卡(IP)接收 TDS 封包。

-- 1. 停用預設 TCP 端點
ALTER ENDPOINT [TSQL Default TCP] STATE = STOPPED;
GO

-- 2. 建立新端點,綁定特定 IP(例:192.168.1.1)與埠 1433
CREATE ENDPOINT [TSQL User TCP]
STATE = STARTED
AS TCP (
    LISTENER_PORT = 1433,
    LISTENER_IP = (192.168.1.1)  -- 僅監聽此網卡
)
FOR TSQL();
GO

-- 3. 授予 public(或指定登入)連線權限
GRANT CONNECT ON ENDPOINT::[TSQL User TCP] TO [public];
GO

完成後,只有經由 192.168.1.1 這張網卡進入的封包才能建立連線。若同時限制登入帳號,可將 TO [public] 改為 TO [SpecificLogin]。

方案三:登入觸發器攔截(SQL Server 2005 SP2+)

不需額外網卡,透過 LOGON 觸發器在驗證階段直接拒絕非白名單 IP。

USE master;
GO
CREATE TRIGGER tr_LoginCheck
ON ALL SERVER
FOR LOGON
AS
BEGIN
    DECLARE @clientIP NVARCHAR(48) = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(48)');
    -- 允許清單(支援 CIDR 或單一 IP,此處示範單一 IP)
    IF @clientIP NOT IN ('192.168.1.1', '127.0.0.1', '::1')
    BEGIN
        ROLLBACK;  -- 直接終止連線
    END
END;
GO

注意:

  • 觸發器邏輯錯誤可能導致所有連線(含管理員)被拒,部署前請在測試環境驗證。
  • 若誤鎖自己,可用 專用管理員連線 (DAC) 連線停用觸發器:sqlcmd -A -S localhost -Q "DISABLE TRIGGER tr_LoginCheck ON ALL SERVER"。
  • 高併發環境下觸發器會增加微小延遲,極端敏感場景建議用防火牆/端點方案。

方案比較與選型建議

維度防火牆端點限制登入觸發器
部署複雜度低中(需專用網卡)中
效能影響無(核心層過濾)無(網路層綁定)極低(驗證階段)
彈性高(支援 CIDR、群組)低(綁定實體 IP)高(可寫複雜邏輯)
適用版本所有版本SQL 2005+SQL 2005 SP2+
推薦場景通用生產環境首選多網卡隔離區段需動態名單、無法改網路設定

綜合建議:優先使用 Windows 防火牆,配合修改預設埠;若有嚴格網段隔離需求,搭配端點限制;僅在無法調整網路設定時啟用登入觸發器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved