Skip to content

SQLServer 防火墙配置

防火墙配置概述

SQL Server 防火墙配置是保护数据库安全的重要组成部分,它通过控制网络流量,允许或拒绝特定 IP 地址、端口和协议的访问,防止未授权的网络访问。合理的防火墙配置可以显著提高数据库系统的安全性,减少网络攻击的风险。

核心概念

  1. 防火墙类型

    • Windows 防火墙:运行在 SQL Server 主机上的软件防火墙
    • 网络防火墙:部署在网络边界的硬件或软件防火墙
    • Azure SQL 防火墙:Azure 平台提供的基于 IP 的访问控制
  2. SQL Server 端口

    • 默认端口:1433(TCP)
    • 命名实例动态端口:由 SQL Server Browser 服务分配(默认端口 1434 UDP)
    • Dedicated Administrator Connection (DAC):默认端口 1434 TCP
    • Always On Availability Groups 端点:默认端口 5022 TCP
  3. 访问控制策略

    • 基于 IP 地址的访问控制
    • 基于端口的访问控制
    • 基于协议的访问控制
    • 基于时间的访问控制

Windows 防火墙配置

配置步骤

  1. 打开 Windows 防火墙高级安全性

    • 打开 "控制面板" > "系统和安全" > "Windows Defender 防火墙"
    • 点击 "高级设置"
  2. 创建入站规则

    • 右键点击 "入站规则",选择 "新建规则"
    • 选择 "端口",点击 "下一步"
    • 选择 "TCP",输入 SQL Server 端口(默认 1433),点击 "下一步"
    • 选择 "允许连接",点击 "下一步"
    • 选择适用的网络类型(域、专用、公共),点击 "下一步"
    • 输入规则名称(如 "SQL Server TCP 1433"),点击 "完成"
  3. 为命名实例配置动态端口

    • 打开 SQL Server 配置管理器
    • 导航到 "SQL Server 网络配置" > "<实例名> 的协议"
    • 右键点击 "TCP/IP",选择 "属性"
    • 在 "IP 地址" 选项卡中,向下滚动到 "IPAll" 部分
    • 清除 "TCP 动态端口",在 "TCP 端口" 中输入固定端口(如 1435)
    • 重启 SQL Server 服务
    • 在 Windows 防火墙中为固定端口创建入站规则
  4. 为 SQL Server Browser 服务配置端口

    • 创建 UDP 入站规则,端口 1434
    • 规则名称:"SQL Server Browser UDP 1434"

命令行配置

powershell
# 启用 Windows 防火墙
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True

# 为 SQL Server 默认实例创建入站规则
New-NetFirewallRule -DisplayName "SQL Server TCP 1433" -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow -Enabled True

# 为 SQL Server Browser 服务创建入站规则
New-NetFirewallRule -DisplayName "SQL Server Browser UDP 1434" -Direction Inbound -Protocol UDP -LocalPort 1434 -Action Allow -Enabled True

# 为命名实例创建入站规则
New-NetFirewallRule -DisplayName "SQL Server TCP 1435" -Direction Inbound -Protocol TCP -LocalPort 1435 -Action Allow -Enabled True

网络防火墙配置

配置步骤

  1. 确定 SQL Server 端口

    • 默认实例:1433 TCP
    • 命名实例:固定端口或动态端口(需配置 SQL Server Browser 服务端口 1434 UDP)
    • Always On Availability Groups 端点:默认 5022 TCP
  2. 配置网络防火墙规则

    • 允许客户端 IP 地址或 IP 范围访问 SQL Server 端口
    • 允许 SQL Server 主机访问客户端端口(对于双向通信)
    • 配置规则优先级,确保规则按预期执行
    • 启用日志记录,以便监控和审计
  3. 常见网络防火墙品牌配置示例

    Cisco ASA 防火墙

    access-list sql_server_access extended permit tcp any host <SQL_Server_IP> eq 1433
    access-list sql_server_access extended permit udp any host <SQL_Server_IP> eq 1434
    access-group sql_server_access in interface outside

    Fortinet 防火墙

    config firewall policy
        edit 10
            set name "SQL Server Access"
            set srcintf "wan1"
            set dstintf "internal"
            set srcaddr "all"
            set dstaddr "SQL_Server_IP"
            set action accept
            set schedule "always"
            set service "SQL_Server_Service"  # 包含 TCP 1433 和 UDP 1434
            set logtraffic all
        next
    end

Azure SQL 防火墙配置

配置步骤

  1. 登录 Azure 门户

    • 导航到 Azure SQL 数据库或 Azure SQL Managed Instance
  2. 配置服务器级防火墙规则

    • 选择 "安全" > "防火墙和虚拟网络"
    • 点击 "添加客户端 IP" 添加当前客户端 IP
    • 或点击 "添加现有虚拟网络" 添加 Azure 虚拟网络
    • 或点击 "添加 IP 范围" 添加自定义 IP 范围
    • 点击 "保存"
  3. 配置数据库级防火墙规则

    • 连接到 master 数据库
    • 使用 T-SQL 创建数据库级防火墙规则
    sql
    -- 创建数据库级防火墙规则
    EXEC sp_set_database_firewall_rule 
        @name = N'AllowSpecificIP', 
        @start_ip_address = '192.168.1.100', 
        @end_ip_address = '192.168.1.100';
    
    -- 查看数据库级防火墙规则
    SELECT * FROM sys.database_firewall_rules;
    
    -- 删除数据库级防火墙规则
    EXEC sp_delete_database_firewall_rule @name = N'AllowSpecificIP';
  4. 配置虚拟网络服务端点

    • 在 Azure 虚拟网络中启用 "Microsoft.Sql" 服务端点
    • 在 Azure SQL 防火墙设置中添加虚拟网络规则
    • 选择虚拟网络和子网
    • 点击 "保存"

Azure CLI 配置

ini
# 登录 Azure
az login

# 设置默认订阅
az account set --subscription <subscription-id>

# 创建服务器级防火墙规则
az sql server firewall-rule create \
    --resource-group <resource-group-name> \
    --server <server-name> \
    --name AllowMyIP \
    --start-ip-address <client-ip> \
    --end-ip-address <client-ip>

# 创建虚拟网络规则
az sql server vnet-rule create \
    --resource-group <resource-group-name> \
    --server <server-name> \
    --name AllowVNet \
    --vnet-name <vnet-name> \
    --subnet <subnet-name>

最佳实践

1. 最小权限原则

  • 只允许必要的 IP 地址和 IP 范围访问 SQL Server
  • 避免使用 "允许所有 IP" 配置(0.0.0.0-255.255.255.255)
  • 定期审查和更新防火墙规则,移除不必要的访问权限
  • 为不同环境(开发、测试、生产)配置不同的防火墙规则

2. 端口配置最佳实践

  • 为命名实例使用固定端口,避免使用动态端口
  • 考虑更改默认端口(1433),减少端口扫描的风险
  • 为不同的 SQL Server 实例使用不同的端口
  • 为管理连接(DAC)配置单独的端口

3. 监控和审计

  • 启用防火墙日志记录,监控访问尝试
  • 定期审查防火墙日志,识别异常访问模式
  • 配置警报,当检测到可疑访问尝试时通知管理员
  • 保存防火墙配置和变更历史,用于合规检查

4. 分层防御

  • 同时配置 Windows 防火墙和网络防火墙,实现分层防御
  • 对于 Azure SQL,结合使用防火墙规则和虚拟网络服务端点
  • 考虑使用 VPN 或 ExpressRoute 连接,加密客户端和服务器之间的通信
  • 实现入侵检测和预防系统(IDS/IPS),进一步增强安全性

5. 自动化配置

  • 使用 PowerShell、Azure CLI 或其他脚本工具自动化防火墙配置
  • 实现防火墙配置的版本控制和变更管理
  • 定期备份防火墙配置,以便在发生故障时快速恢复
  • 考虑使用基础设施即代码(IaC)工具管理防火墙配置

常见问题及解决方案

问题1:客户端无法连接到 SQL Server

症状

  • 错误消息:"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible."
  • 客户端无法通过网络连接到 SQL Server

解决方案

  1. 验证 SQL Server 是否正在运行
  2. 检查 SQL Server 网络配置,确保 TCP/IP 协议已启用
  3. 验证防火墙规则是否允许客户端 IP 地址和端口访问
  4. 检查网络连接,确保客户端和服务器之间的网络通信正常
  5. 尝试使用 telnet 或 Test-NetConnection 测试端口连通性

问题2:命名实例无法连接

症状

  • 错误消息:"Could not locate server/instance specified"
  • 客户端可以连接到默认实例,但无法连接到命名实例

解决方案

  1. 确保 SQL Server Browser 服务正在运行
  2. 配置防火墙允许 UDP 端口 1434 访问
  3. 为命名实例配置固定端口,并在防火墙中开放该端口
  4. 尝试使用 "服务器名称,端口" 格式连接(如 ServerName,1435)
  5. 检查 SQL Server Browser 服务的权限设置

问题3:Azure SQL 数据库无法连接

症状

  • 错误消息:"Client with IP address 'x.x.x.x' is not allowed to access the server."
  • 客户端无法连接到 Azure SQL 数据库

解决方案

  1. 检查 Azure SQL 防火墙规则,确保客户端 IP 地址已添加
  2. 验证客户端 IP 地址是否为静态 IP,或使用动态 DNS
  3. 考虑使用虚拟网络服务端点或私有终结点
  4. 检查 Azure SQL 服务器的状态和服务健康
  5. 尝试重新创建防火墙规则

问题4:防火墙规则不生效

症状

  • 已添加防火墙规则,但客户端仍然无法连接
  • 防火墙规则变更后没有立即生效

解决方案

  1. 验证防火墙规则的方向(入站/出站)是否正确
  2. 检查防火墙规则的优先级,确保没有被其他规则覆盖
  3. 重启防火墙服务,确保规则生效
  4. 检查网络拓扑,确保流量经过配置的防火墙
  5. 验证 IP 地址和端口配置是否正确

常见问题(FAQ)

Q1:SQL Server 默认端口是什么?

A:SQL Server 默认实例的默认端口是 1433(TCP)。命名实例默认使用动态端口,由 SQL Server Browser 服务(端口 1434 UDP)分配。

Q2:如何更改 SQL Server 默认端口?

A:可以通过 SQL Server 配置管理器更改默认端口:

  1. 打开 SQL Server 配置管理器
  2. 导航到 "SQL Server 网络配置" > "<实例名> 的协议"
  3. 右键点击 "TCP/IP",选择 "属性"
  4. 在 "IP 地址" 选项卡中,设置 "TCP 端口" 为新端口
  5. 重启 SQL Server 服务
  6. 更新防火墙规则以允许新端口

Q3:是否应该更改 SQL Server 默认端口?

A:更改默认端口可以减少端口扫描的风险,但这只是一种安全通过模糊性的措施,不能替代其他安全措施。建议结合其他安全措施(如防火墙、加密、身份验证)使用。

Q4:如何测试 SQL Server 端口连通性?

A:可以使用以下方法测试端口连通性:

  • 使用 telnet 命令:telnet <server-name> <port>
  • 使用 PowerShell:Test-NetConnection -ComputerName <server-name> -Port <port>
  • 使用 psqloc 工具:psping <server-name>:<port>
  • 使用 SQL Server Management Studio 连接测试

Q5:Azure SQL 防火墙规则的限制是什么?

A:Azure SQL 防火墙规则的限制包括:

  • 服务器级防火墙规则数量上限:128
  • 数据库级防火墙规则数量上限:128
  • IP 地址范围必须在有效 IPv4 范围内
  • 不支持 IPv6(除非使用虚拟网络服务端点或私有终结点)

Q6:如何允许 Azure 服务访问 Azure SQL?

A:可以在 Azure SQL 防火墙设置中启用 "允许 Azure 服务和资源访问此服务器" 选项。这将允许来自 Azure 数据中心的所有 IP 地址访问 SQL Server。

Q7:防火墙配置会影响性能吗?

A:防火墙配置对性能的影响通常很小,但复杂的防火墙规则或大量的规则可能会增加数据包处理延迟。建议:

  • 保持防火墙规则简洁,避免不必要的规则
  • 优化规则顺序,将最常用的规则放在前面
  • 定期清理过期和不必要的规则

Q8:如何备份和恢复防火墙配置?

A:备份和恢复防火墙配置的方法:

  • Windows 防火墙:使用 netsh advfirewall exportnetsh advfirewall import 命令
  • 网络防火墙:使用厂商提供的备份和恢复功能
  • Azure SQL 防火墙:使用 Azure CLI 或 PowerShell 脚本导出和导入规则

总结

SQL Server 防火墙配置是保护数据库安全的重要组成部分,它通过控制网络流量,防止未授权的网络访问。合理的防火墙配置应该遵循最小权限原则,只允许必要的 IP 地址和端口访问 SQL Server。

防火墙配置包括 Windows 防火墙、网络防火墙和 Azure SQL 防火墙,每种防火墙都有其特定的配置方法和最佳实践。通过结合使用多种防火墙技术,可以实现分层防御,进一步增强数据库系统的安全性。

对于 DBA 来说,深入理解 SQL Server 防火墙配置的原理和最佳实践,能够帮助组织实施更安全的网络访问控制策略,保护数据库资源免受网络攻击。定期审查和更新防火墙规则,监控防火墙日志,也是确保防火墙有效性的重要措施。