双机热备架构下防火墙规则必须全节点同步且绑定物理接口,不可依赖VIP;需统一放行80/443及Keepalived心跳端口112/udp,并确保Nginx配置、限流及WAF规则完全一致。

双机热备架构下防火墙需分层协同
Nginx 双机热备(通常基于 Keepalived 实现 VIP 漂移)本身不处理网络层访问控制,防火墙策略必须在系统层统一设计,避免主备切换时规则不一致导致服务中断或安全缺口。核心原则是:**防火墙规则与 VIP 无关,只绑定物理网卡和端口;所有节点规则必须完全同步。**
系统防火墙规则必须全节点一致
Keepalived 管理的是虚拟 IP(VIP),而 iptables/firewalld/ufw 运行在内核层面,规则作用于实际网络接口(如 eth0)和端口。若主备节点防火墙配置不同,例如主节点放行 80/443、备节点未放行,VIP 切换后用户将无法访问。
- 所有节点执行相同命令开放必要端口:
sudo ufw allow 80/tcp && sudo ufw allow 443/tcp && sudo ufw default deny incoming
或 firewalld:
sudo firewall-cmd --permanent --add-port=80/tcp && sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload - 禁止仅对 VIP 绑定规则——VIP 是逻辑地址,iptables 不识别 VIP 的“归属”,只按入站接口+目标端口匹配。因此无需、也不应为 VIP 单独写规则。
- 心跳端口(如 Keepalived 默认使用 UDP 112)也需放行,否则状态检测失败,引发误切换:
sudo ufw allow 112/udp(或对应 firewalld/iptables 规则)
应用层防护建议部署在 VIP 前置位置
Nginx 自身的 allow/deny、limit_req 等指令可做细粒度控制,但双机环境下需确保配置文件完全一致(通过 Ansible、rsync 或 Git 同步),否则可能主备响应行为不一。
- 敏感路径(如
/admin)建议用 IP 白名单:
location /admin { allow 10.0.1.0/24; deny all; } - 防暴力请求统一启用限流:
limit_req_zone $binary_remote_addr zone=login:10m rate=2r/s;
并在对应 location 中引用,主备配置必须相同。 - 若需 WAF 级防护(如 SQL 注入、XSS),推荐部署 ModSecurity —— 它作为 Nginx 动态模块运行,规则加载独立于 VIP,且支持共享规则集,比单节点 nginx 配置更可靠。
高可用场景下的额外防火墙注意点
双机热备常用于对外提供稳定服务,此时防火墙还需兼顾可观测性与故障隔离:
- 禁用“默认 DROP 后再开 80/443”这类粗放策略;应显式允许所需流量,并记录拒绝日志便于排障:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -j LOG --log-prefix "FW-DROP: "
sudo iptables -A INPUT -j DROP - 避免在防火墙中限制源 IP 访问 Nginx 端口——除非业务明确要求(如仅内网管理)。因公网用户 IP 不可控,过度限制反而影响可用性。
- 云环境建议配合安全组(如 AWS Security Group、阿里云 ECS 安全组)做第一道过滤,主机防火墙做第二道,形成冗余而不冲突。


















