公司内网突然无法访问某个内部系统,排查一圈发现不是网络中断,也不是服务挂了,而是防火墙配置文件里悄悄加了一条规则,把请求挡在了门外。这种情况在运维中并不少见,尤其是多人协作的环境下,一个不小心就把本该开放的端口给禁了。
配置文件被禁止访问的典型场景
比如某次更新 Nginx 配置后,顺手重启了防火墙,结果发现新上线的服务死活连不上。查日志显示连接被拒绝,最后定位到是 iptables 的规则文件里多了一行 DROP 所有来自特定网段的流量。问题根源是部署脚本里硬编码了一条默认禁止规则,而后续没做白名单放行。
还有一种情况是权限设置过严。某台服务器上的防火墙配置文件 /etc/firewalld/zones/public.xml 被设成了 600 权限,且属主为 root。普通运维人员即使通过 sudo 编辑器也无法修改,导致紧急调整策略时卡住。
如何检查配置是否生效
别急着改文件,先确认当前运行中的规则是不是你想要的。Linux 下可以用:
sudo firewall-cmd --list-all
查看 firewalld 当前加载的策略。如果发现配置文件里写了允许 8080 端口,但这里没列出来,说明配置没生效,可能是忘记重载:
sudo firewall-cmd --reload
避免误封自己的操作建议
远程改防火墙最怕一不小心把自己踢出去。建议在修改前先加一条临时放行规则,比如保留当前 SSH 端口和 IP 的通行权:
sudo firewall-cmd --add-source=192.168.1.100/32 --zone=trusted --permanent
然后再逐步添加新规则。改完之后再测试,有问题还能从信任源连进去。
另外,配置文件本身也得纳入版本控制。别小看这一点,当多人频繁调整策略时,Git 记录能快速回溯是谁在哪天加了禁止访问的规则。配合 CI 脚本做语法检查,能避免因格式错误导致整套规则加载失败。
SELinux 也会间接导致访问被拒
有时候明明防火墙放行了,服务也起来了,但就是连不上。这时候得看看 SELinux 是否阻止了端口绑定。比如你想用 8081 端口跑 Web 服务,但 SELinux 默认不允许 httpd 绑定这个端口,结果请求被系统层拦截,看起来就像防火墙挡掉了。
可以用下面命令查看当前允许的端口:
sudo semanage port -l | grep http_port_t
如果需要添加,执行:
sudo semanage port -a -t http_port_t -p tcp 8081
这类问题容易让人误判成防火墙配置文件的问题,其实已经超出了传统防火墙的范畴,属于安全模块的访问控制。
实际工作中,很多“禁止访问”并不是因为规则写错了,而是缺乏协同机制和验证流程。建议每次变更都附带测试用例,比如增加一条规则后,自动发起一次目标端口的连通性探测,确保不会误伤线上业务。