Oracle RAC节点间通信必须配置firewalld白名单,覆盖PUBLIC IP、PRIVATE IP及169.254.0.0/16 HAIP网段,并显式放开私网TCP/UDP全端口与管理网段SSH,否则导致心跳失败或实例无法启动。
oracle rac 节点间通信必须走白名单,不能只开 1521 端口;firewalld 默认规则会拦掉 haip(169.254.x.x)、私网 udp、动态端口范围等关键流量,直接导致集群心跳失败或实例无法启动。
firewall-cmd 添加 rich-rule 白名单时必须覆盖三类地址
Oracle RAC 集群依赖三类网络平面通信,防火墙策略必须显式放行对应 source address,否则 crsctl check cluster 可能报 “CRS-4639: Could not contact Oracle High Availability Services” 或节点反复 evict。
- 所有 PUBLIC IP(含 VIP、SCAN IP):如
172.16.100.19、172.16.100.119、172.16.100.100 - 所有 PRIVATE IP(私网地址):如
100.100.100.19、100.100.100.30—— 注意不是网卡名,是ip a实际看到的地址 - HAIP 地址段:
169.254.0.0/16(11.2.0.2+ 版本强制使用),不能只写单个 HAIP,必须用 CIDR
错误做法是逐条加单 IP rich-rule,漏掉一个 HAIP 就可能触发 OCR 同步失败;正确方式优先用网段,再补漏具体 VIP/SCAN:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.100.0/24" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="100.100.100.0/24" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="169.254.0.0/16" accept'
UDP 和高范围端口必须显式放开,不能只开 TCP 1521
RAC 私网通信大量依赖 UDP(如 GCS、GES 消息),且 Oracle 后台进程(如 PMON、LMD)会使用临时端口主动发起连接。只开 1521/tcp 会导致节点间资源争用超时、gc cr block busy 等等待事件飙升。
- 私网必须同时放开 TCP + UDP 全端口:
port protocol="tcp" port="1-65535"和port protocol="udp" port="1-65535" - 公网访问数据库只需开
1521/tcp,但客户端连上后,listener 会重定向到随机端口(尤其在非 Shared Socket 模式下),所以业务网段也建议放开9000-65500的 TCP/UDP - 临时端口范围需与系统一致:检查
cat /proc/sys/net/ipv4/ip_local_port_range,若为9000 65500,firewalld 规则里就不能写1024-65535——多开的低端口无意义,反而增加攻击面
示例(针对私网段):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="100.100.100.0/24" port protocol="tcp" port="1-65535" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="100.100.100.0/24" port protocol="udp" port="1-65535" accept'
避免 firewall-cmd --remove-service=ssh 导致 SSH 中断
执行 firewall-cmd --permanent --remove-service=ssh 后不 reload,当前 SSH 连接仍可用;但一旦 reload 或重启 firewalld,所有未显式放行的 22/tcp 流量会被拒绝——包括你正在用的堡垒机跳转链路。
- 不要删默认 ssh service,改用 rich-rule 显式放行可信管理网段,例如:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.2.30.0/24" port protocol="tcp" port="22" accept' - 如果已删且失联,需物理/带外登录,用
systemctl stop firewalld临时恢复,再补规则 -
firewall-cmd --list-all必须看到sources:下有你的管理 IP 段,而不是仅靠services:里的 ssh
reload 前必须检查规则顺序和冲突
firewalld 是按 rich-rule 插入顺序匹配的,先插入的 rule 优先级更高。如果先加了 source address="0.0.0.0/0" port="1521" accept,再加 VIP 白名单,后者实际不会生效。
- 用
firewall-cmd --permanent --list-rich-rules查看当前所有规则,确认 VIP/私网/HAIP 规则在最前面 - 避免混用
--add-port和--add-rich-rule:前者生成 zone-level 规则,后者是 source-level,优先级不同,容易互相覆盖 - 执行
firewall-cmd --reload后,立刻验证:crsctl check cluster -all、oifcfg getif、ping -c2 169.254.x.x(从另一节点 ping HAIP)
最易被忽略的是 HAIP 的 ICMP 通路——很多环境只开了 TCP/UDP,但集群健康检查会发 ICMP echo,没开就表现为“节点在线但无法加入集群”。











