Skip to content

MariaDB 防火墙配置

防火墙概述

防火墙是保护数据库服务器的重要安全措施,通过配置防火墙规则,可以限制对 MariaDB 端口的访问,防止未授权访问和恶意攻击。防火墙可以在网络层和传输层对流量进行过滤,是数据库安全体系的第一道防线。

防火墙类型

1. 硬件防火墙

  • 部署在网络边界,提供高性能的流量过滤
  • 适合大型企业和数据中心环境
  • 功能丰富,支持深度包检测、入侵防御等高级功能
  • 通常由网络设备厂商提供(如 Cisco、Juniper、华为等)

2. 软件防火墙

  • 安装在服务器操作系统上,提供主机级别的防护
  • 适合中小型企业和单服务器环境
  • 常见的软件防火墙包括:
    • Linux:iptables、firewalld、nftables
    • Windows:Windows Defender 防火墙
    • macOS:内置防火墙

3. 云防火墙

  • 部署在云平台上,提供云环境下的安全防护
  • 适合云服务器和混合云环境
  • 常见的云防火墙包括:
    • AWS:Security Groups、Network ACLs
    • Azure:Network Security Groups
    • Alibaba Cloud:安全组、网络 ACL

Linux 防火墙配置

iptables 配置

iptables 是 Linux 系统上传统的防火墙工具,通过规则链来过滤网络流量。

基本概念

  • 链(Chain):预定义的规则集合,包括 INPUT、OUTPUT、FORWARD 等
  • 表(Table):包含不同功能的链,包括 filter、nat、mangle 等
  • 规则(Rule):定义如何处理匹配的网络流量,包括 ACCEPT、DROP、REJECT 等动作

配置示例

bash
# 查看当前 iptables 规则
iptables -L -n -v

# 清空当前 iptables 规则
iptables -F

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许回环接口访问
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH 访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许特定 IP 段访问 MariaDB 端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT

# 允许特定 IP 访问 MariaDB 端口
iptables -A INPUT -p tcp -s 10.0.0.5 --dport 3306 -j ACCEPT

# 保存 iptables 规则
# CentOS/RHEL 6
service iptables save
# CentOS/RHEL 7+
iptables-save > /etc/sysconfig/iptables
# Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4

高级规则配置

bash
# 限制每秒连接数,防止 DDoS 攻击
iptables -A INPUT -p tcp --dport 3306 -m limit --limit 100/second --limit-burst 200 -j ACCEPT

# 记录被拒绝的连接
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# 拒绝其他所有连接
iptables -A INPUT -j DROP

firewalld 配置

firewalld 是 CentOS/RHEL 7+ 和 Fedora 系统上的默认防火墙管理工具,提供了更灵活的规则管理方式。

基本概念

  • 区域(Zone):预定义的规则集合,包括 public、internal、external 等
  • 服务(Service):预定义的服务配置,包括 mysql、ssh、http 等
  • 端口(Port):定义允许访问的端口号
  • 富规则(Rich Rule):更复杂的规则配置,支持源地址、目标地址、端口、协议等

配置示例

bash
# 查看当前 firewalld 状态
firewall-cmd --state

# 查看当前默认区域
firewall-cmd --get-default-zone

# 查看当前区域的规则
firewall-cmd --list-all

# 允许 MySQL 服务(默认 3306 端口)
firewall-cmd --permanent --add-service=mysql

# 允许特定端口
firewall-cmd --permanent --add-port=3307/tcp

# 允许特定 IP 访问 MariaDB 端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'

# 允许特定 IP 访问 MariaDB 端口,限制连接数
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port protocol="tcp" port="3306" limit value="100/s" accept'

# 重新加载防火墙规则
firewall-cmd --reload

# 查看修改后的规则
firewall-cmd --list-all

区域管理

bash
# 查看所有可用区域
firewall-cmd --get-zones

# 设置默认区域
firewall-cmd --set-default-zone=internal

# 将网卡添加到特定区域
firewall-cmd --permanent --zone=internal --add-interface=eth0

nftables 配置

nftables 是 Linux 系统上新一代的防火墙工具,旨在替代 iptables,提供更高效的规则处理和更灵活的配置方式。

配置示例

bash
# 查看当前 nftables 规则
nft list ruleset

# 清空当前 nftables 规则
nft flush ruleset

# 创建表和链
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0; policy drop; }
nft add chain inet filter output { type filter hook output priority 0; policy accept; }
nft add chain inet filter forward { type filter hook forward priority 0; policy drop; }

# 允许回环接口访问
nft add rule inet filter input iif lo accept

# 允许已建立的连接
nft add rule inet filter input ct state established,related accept

# 允许 SSH 访问
nft add rule inet filter input tcp dport 22 accept

# 允许特定 IP 段访问 MariaDB 端口
nft add rule inet filter input tcp dport 3306 ip saddr 192.168.1.0/24 accept

# 保存 nftables 规则
nft list ruleset > /etc/nftables.conf

Windows 防火墙配置

图形界面配置

  1. 打开 "Windows Defender 防火墙" -> "高级设置"
  2. 右键点击 "入站规则" -> "新建规则"
  3. 选择 "端口" -> 下一步
  4. 选择 "TCP" 和 "特定本地端口",输入 MariaDB 端口号(如 3306)-> 下一步
  5. 选择 "允许连接" -> 下一步
  6. 选择适用的网络类型(建议只选择 "域" 和 "专用")-> 下一步
  7. 输入规则名称(如 "MariaDB 端口")和描述 -> 完成
  8. 右键点击新创建的规则 -> "属性" -> "作用域"
  9. 在 "远程 IP 地址" 中添加允许访问的 IP 地址或 IP 段 -> 确定

PowerShell 配置

powershell
# 查看当前防火墙规则
Get-NetFirewallRule | Where-Object { $_.DisplayName -like "*MariaDB*" }

# 新建 MariaDB 防火墙规则
New-NetFirewallRule -DisplayName "MariaDB Port" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow -Profile Domain,Private

# 新建允许特定 IP 访问 MariaDB 的防火墙规则
New-NetFirewallRule -DisplayName "MariaDB Restricted Access" -Direction Inbound -Protocol TCP -LocalPort 3306 -RemoteAddress 192.168.1.0/24 -Action Allow -Profile Domain,Private

# 禁用防火墙规则
Disable-NetFirewallRule -DisplayName "MariaDB Port"

# 删除防火墙规则
Remove-NetFirewallRule -DisplayName "MariaDB Port"

macOS 防火墙配置

图形界面配置

  1. 打开 "系统偏好设置" -> "安全性与隐私" -> "防火墙"
  2. 点击 "锁" 图标,输入管理员密码解锁
  3. 点击 "打开防火墙"
  4. 点击 "防火墙选项"
  5. 点击 "+" 按钮,添加 MariaDB 进程或端口
  6. 选择 "允许传入连接" 或 "允许来自特定 IP 的连接"
  7. 点击 "好" 保存设置

命令行配置

bash
# 查看防火墙状态
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate

# 开启防火墙
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on

# 允许特定应用访问网络
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/mysql/bin/mysqld
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/local/mysql/bin/mysqld

云防火墙配置

AWS 安全组配置

  1. 登录 AWS 控制台,进入 EC2 服务
  2. 点击 "安全组" -> "创建安全组"
  3. 输入安全组名称和描述
  4. 选择 VPC
  5. 添加入站规则:
    • 类型:MySQL/Aurora
    • 协议:TCP
    • 端口范围:3306
    • 源:选择 "自定义",输入允许访问的 IP 地址或安全组
  6. 添加出站规则(根据需要)
  7. 点击 "创建安全组"
  8. 将安全组关联到 MariaDB 实例

Azure 网络安全组配置

  1. 登录 Azure 门户,进入 "网络安全组"
  2. 点击 "添加",输入名称和订阅信息
  3. 选择资源组和位置
  4. 点击 "创建"
  5. 进入新创建的网络安全组,点击 "入站安全规则" -> "添加"
  6. 输入规则名称,选择优先级
  7. 服务:选择 "MySQL"
  8. 协议:TCP
  9. 源:选择 "IP 地址",输入允许访问的 IP 地址或范围
  10. 目标:任何
  11. 操作:允许
  12. 点击 "添加"
  13. 将网络安全组关联到 MariaDB 虚拟机或子网

Alibaba Cloud 安全组配置

  1. 登录阿里云控制台,进入 "云服务器 ECS" -> "网络与安全" -> "安全组"
  2. 点击 "创建安全组",选择网络类型和模板
  3. 输入安全组名称和描述
  4. 点击 "确定"
  5. 进入安全组详情页,点击 "配置规则"
  6. 点击 "添加安全组规则"
  7. 方向:入方向
  8. 授权策略:允许
  9. 协议类型:MySQL(3306)
  10. 端口范围:3306/3306
  11. 授权对象:输入允许访问的 IP 地址或 CIDR 块
  12. 点击 "确定"
  13. 将安全组关联到 MariaDB ECS 实例

防火墙规则管理

规则优先级

  • 防火墙规则按照优先级顺序执行,匹配到第一条规则后停止处理
  • 建议将更具体的规则放在前面,更通用的规则放在后面
  • 定期审查和清理不必要的规则

规则文档化

  • 记录所有防火墙规则的用途、创建时间、创建人和过期时间
  • 使用清晰的规则名称和描述,便于理解和维护
  • 定期更新规则文档,确保与实际配置一致

规则测试

  • 配置新规则后,测试从允许的 IP 地址是否可以正常连接
  • 测试从禁止的 IP 地址是否无法连接
  • 使用 telnetnc 命令测试端口连通性:
    bash
    telnet db-server 3306
    nc -zv db-server 3306

常见问题

配置防火墙后无法连接到 MariaDB?

解决方法

  1. 检查防火墙规则是否允许客户端 IP 访问 MariaDB 端口
  2. 检查防火墙是否已正确加载新规则
  3. 检查 MariaDB 是否绑定到正确的 IP 地址
  4. 检查 MariaDB 服务是否正在运行
  5. 查看防火墙日志,了解连接被拒绝的原因

如何查看防火墙日志?

解决方法

  • Linux (iptables):查看 /var/log/messages/var/log/syslog
  • Linux (firewalld)journalctl -u firewalld
  • Windows:查看 "事件查看器" -> "Windows 日志" -> "安全"
  • macOS:查看 "控制台" -> "系统报告" -> "防火墙"
  • 云平台:查看云平台提供的防火墙日志

如何备份和恢复防火墙规则?

解决方法

  • Linux (iptables)
    bash
    # 备份规则
    iptables-save > iptables_backup.conf
    # 恢复规则
    iptables-restore < iptables_backup.conf
  • Linux (firewalld)
    bash
    # 备份规则
    cp /etc/firewalld/zones/*.xml firewalld_backup/
    # 恢复规则
    cp firewalld_backup/*.xml /etc/firewalld/zones/
    firewall-cmd --reload
  • Windows
    powershell
    # 备份规则
    Export-NetFirewallRule -FileName "firewall_rules.wfw"
    # 恢复规则
    Import-NetFirewallRule -FileName "firewall_rules.wfw"

如何处理大量防火墙规则?

解决方法

  1. 对规则进行分组和分类
  2. 使用防火墙管理工具,如 FirewallD、nftables 或第三方工具
  3. 定期清理过期和不必要的规则
  4. 使用自动化工具(如 Ansible、Puppet)管理防火墙规则
  5. 考虑使用下一代防火墙(NGFW),提供更高级的规则管理功能

最佳实践

1. 采用最小权限原则

  • 只允许必要的端口和 IP 地址访问 MariaDB
  • 避免使用 "允许所有 IP"(0.0.0.0/0)的规则
  • 定期审查和更新防火墙规则

2. 多层防火墙策略

  • 在网络边界、主机和云平台层面都配置防火墙
  • 实施深度防御策略,即使一层防火墙被突破,还有其他层保护
  • 结合入侵检测和入侵防御系统(IDS/IPS)

3. 定期监控和审计

  • 监控防火墙日志,及时发现异常连接尝试
  • 定期审计防火墙规则,确保符合安全策略
  • 使用自动化工具检测未授权的防火墙规则更改

4. 自动化管理

  • 使用配置管理工具(如 Ansible、Puppet、Chef)自动化防火墙规则管理
  • 实现防火墙规则的版本控制
  • 建立防火墙规则变更流程,确保所有变更都经过审批

5. 测试和验证

  • 配置新规则后,进行充分的测试验证
  • 定期进行渗透测试,评估防火墙的有效性
  • 制定防火墙故障恢复计划,确保在防火墙出现问题时能够快速恢复

结论

防火墙是保护 MariaDB 数据库的重要安全措施,通过合理配置防火墙规则,可以有效防止未授权访问和恶意攻击。在生产环境中,建议采用多层防火墙策略,结合网络边界防火墙、主机防火墙和云防火墙,实施深度防御。

定期监控和审计防火墙规则,使用自动化工具管理规则,是确保防火墙持续有效运行的关键。通过实施这些最佳实践,可以显著提高 MariaDB 数据库的安全性,保护企业数据资产。