CentOS 7.9 上要给运维放行 8443,加了 rich rule 之后 ss 能看到监听,外部访问仍然超时,firewall-cmd –list-all 里规则明明在列表里。

真正麻烦的地方在于,几个原因的现象几乎一样。rich rule 写成了 reject,本意是 drop 却拒绝了全部来源;active zone 不是 public,规则加到了默认 zone,网卡实际在另一个 zone 里;规则里 source 用了 /24 但客户端地址不在这段,没被匹配上;加完没 –reload 或者用了 –permanent 没重载,运行时配置没变。

先确认网卡落在哪个 zone

firewall-cmd --get-active-zones

然后看运行时规则是否真的生效

firewall-cmd --zone=public --list-rich-rules

补一条明确的 accept 并重载

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=203.0.113.0/24 port port=8443 protocol=tcp accept' && firewall-cmd --reload

从客户端验证端口是否可达

nc -vz -w3 47.100.1.2 8443

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

这次没动代码,只在配置和运行环境上找原因。

别只看报错消失,验证要多做一步。firewall-cmd –list-all 的 rich rules 里出现该条 accept,nc 显示 succeeded,接口返回 200。

这里还有个坑。–permanent 只写文件不生效,必须 reload;zone 搞错是 rich rule 最常见的失效原因,先看 active zones 再动规则。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189