公司刚上线的新服务,明明已经在防火墙配置文件里放行了端口,结果外部还是访问不了。重启服务、重载规则都试了一遍,问题依旧。这种情况其实挺常见的,配置写对了不代表就一定起作用,中间可能卡在好几个环节。
检查配置文件是否被正确加载
很多人改完 /etc/firewalld/zones/public.xml 或者通过 firewall-cmd 添加规则后,以为自动生效了。但如果你用的是静态配置文件,必须确保 firewalld 服务重新加载了配置。执行下面命令确认:
sudo firewall-cmd --reload
注意,--reload 会清空当前运行时规则并重新读取配置文件,而 --permanent 添加的规则才写入文件。如果只用了临时命令没加 --permanent,重启后规则就没了。
确认使用的是正确的区域(zone)
firewalld 支持多个 zone,比如 public、internal、dmz。如果你把规则加到了 internal,但网卡实际绑定的是 public,那自然不会生效。查看当前默认 zone:
firewall-cmd --get-default-zone
再查网卡所属 zone:
firewall-cmd --get-zone-of-interface=eth0
不对就得调整:
firewall-cmd --zone=public --add-interface=eth0 --permanent
SELinux 或其他安全模块干扰
有时候防火墙规则没问题,但 SELinux 拦截了网络行为。比如你开了 8080 端口跑 Web 服务,但 SELinux 不允许 http_port_t 类型绑定这个端口。可以用下面命令看有没有相关拒绝日志:
sudo ausearch -m avc -ts recent
临时放行端口试试:
sudo semanage port -a -t http_port_t -p tcp 8080
云服务器自带安全组优先级更高
别忘了你在阿里云、腾讯云上开的机器,平台层还有安全组策略。即使本地防火墙全开,安全组没放行对应端口,外网照样连不上。去控制台看看入站规则是不是漏了,这比查本地配置还重要。
服务监听地址是否正确
有个容易忽略的点:服务是不是只绑定了 127.0.0.1?用 netstat 看一眼:
netstat -tulnp | grep :8080
如果显示的是 127.0.0.1:8080,那只有本机能访问。得改服务配置,监听 0.0.0.0:8080 才行。
iptables 规则冲突
有些系统同时跑着 firewalld 和手动写的 iptables 脚本,后者可能会覆盖前者生成的规则。检查当前生效规则:
sudo iptables -L -n | grep 8080
如果有直接的 DROP 或 REJECT 规则在前面匹配到了,firewalld 的 ALLOW 就没机会起作用。
这些问题一个个过一遍,通常都能定位到原因。别急着重装或者换工具,先把链路理清楚。