logo

Keepalived与防火墙Zone协同配置指南:安全与高可用的平衡之道

作者:搬砖的石头2025.09.26 20:42浏览量:8

简介:本文详细阐述Keepalived在防火墙开启环境下如何配置Zone规则,解决高可用集群与网络安全的协同问题,提供可落地的技术方案。

一、问题背景:高可用与安全的冲突

在构建高可用集群时,Keepalived通过VRRP协议实现主备节点快速切换,确保服务连续性。然而,当系统启用防火墙(如firewalld或iptables)时,VRRP广播包可能被拦截,导致主备切换失败。同时,防火墙的Zone机制通过划分不同安全域来管理流量,若配置不当,Keepalived的VIP(虚拟IP)通信也会受阻。

典型场景

  • 防火墙默认拒绝所有入站流量,Keepalived的VRRP多播包(224.0.0.18)无法通过
  • VIP绑定后,外部访问被Zone规则拦截
  • 主备节点切换时,防火墙未动态更新允许规则

二、防火墙Zone核心概念解析

1. Zone的作用与分类

防火墙Zone是Linux系统(如firewalld)中用于隔离不同安全级别的逻辑区域,常见Zone包括:

  • trusted:允许所有流量
  • public:仅允许已授权的服务(默认限制入站)
  • internal:内部网络专用,信任度高于public
  • drop:丢弃所有入站请求

每个网络接口必须关联到一个Zone,流量根据源接口的Zone应用对应规则。

2. Keepalived与Zone的交互逻辑

Keepalived运行时涉及两类流量:

  1. 控制流量:VRRP多播包(目的IP 224.0.0.18,端口112)
  2. 数据流量:通过VIP访问的实际服务(如80/443端口)

若未正确配置Zone规则,两类流量均可能被拦截。例如,public Zone默认拒绝所有非授权入站,需显式放行VRRP和VIP相关端口。

三、Keepalived防火墙配置实战

1. 环境准备

假设系统使用firewalld作为防火墙管理工具,两台节点(Node1、Node2)均启用public Zone。

  1. # 查看当前Zone配置
  2. firewall-cmd --get-active-zones
  3. # 输出示例:
  4. # public
  5. # interfaces: eth0

2. 放行VRRP协议

VRRP使用多播地址224.0.0.18和端口112,需在public Zone中添加服务:

  1. # 添加VRRP服务(firewalld内置服务)
  2. firewall-cmd --zone=public --add-service=vrrp --permanent
  3. # 重新加载防火墙规则
  4. firewall-cmd --reload

验证

  1. firewall-cmd --zone=public --list-services
  2. # 输出应包含vrrp

3. 配置VIP通信规则

假设VIP为192.168.1.100,需放行该IP的入站流量:

方法一:使用rich规则(推荐)

  1. firewall-cmd --zone=public --add-rich-rule='
  2. rule family="ipv4" source address="192.168.1.100" accept
  3. ' --permanent
  4. firewall-cmd --reload

方法二:绑定接口到专用Zone

  1. 创建专用Zone(如keepalived-zone):

    1. firewall-cmd --new-zone=keepalived-zone --permanent
    2. firewall-cmd --reload
  2. 将VIP绑定接口(如eth0:1)关联到该Zone:

    1. # 假设VIP绑定到eth0:1
    2. nmcli connection modify "eth0:1" connection.zone keepalived-zone
    3. # 重启网络服务(根据系统调整)
    4. systemctl restart NetworkManager
  3. 在keepalived-zone中放行所有流量:

    1. firewall-cmd --zone=keepalived-zone --add-service=http --permanent
    2. firewall-cmd --zone=keepalived-zone --add-service=https --permanent
    3. firewall-cmd --reload

4. 动态规则更新(主备切换时)

当主备切换时,VIP会从一个节点迁移到另一个节点。需确保防火墙规则随VIP动态调整:

方案一:使用脚本触发规则更新

在Keepalived的notify脚本中调用防火墙更新命令:

  1. # /etc/keepalived/notify.sh 示例
  2. case "$1" in
  3. MASTER)
  4. firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' --permanent
  5. firewall-cmd --reload
  6. ;;
  7. BACKUP)
  8. firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" accept' --permanent
  9. firewall-cmd --reload
  10. ;;
  11. esac

方案二:使用firewalld的direct接口

通过firewall-cmd --direct直接插入iptables规则,避免持久化配置冲突:

  1. # 主节点启动时添加规则
  2. firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -d 192.168.1.100 -j ACCEPT
  3. # 备节点移除规则(需结合notify脚本)

四、常见问题与排查

1. VRRP多播包被拦截

现象keepalived.log中出现VRRP_Instance(VI_1) Entering MASTER STATE但备节点未响应。
排查步骤

  1. 检查防火墙是否放行vrrp服务:

    1. firewall-cmd --zone=public --list-services | grep vrrp
  2. 使用tcpdump抓包分析:

    1. tcpdump -i eth0 -n host 224.0.0.18

2. VIP访问被拒绝

现象:VIP可ping通,但HTTP服务无法访问。
解决方案

  1. 确认服务端口是否放行:

    1. firewall-cmd --zone=public --list-ports
  2. 检查是否绑定到正确Zone:

    1. firewall-cmd --get-zone-of-interface=eth0:1

五、最佳实践建议

  1. 最小权限原则:仅放行Keepalived必需的端口(VRRP 112/udp、服务端口如80/443)
  2. 专用Zone隔离:为VIP绑定接口创建独立Zone,避免影响其他接口规则
  3. 自动化运维:通过Ansible等工具统一管理两节点的防火墙配置
  4. 日志监控:启用firewalld的日志功能,记录被拒绝的流量:
    1. # /etc/firewalld/firewalld.conf
    2. LogDenied=all
    3. # 重启服务
    4. systemctl restart firewalld

六、总结

在启用防火墙的环境下部署Keepalived,需重点关注VRRP协议和VIP流量的Zone规则配置。通过合理划分Zone、动态更新规则以及结合监控工具,可实现高可用集群与网络安全的双重保障。实际配置时,建议先在测试环境验证规则生效性,再逐步应用到生产环境。

相关文章推荐

发表评论

活动