服务连不上,运维第一句往往是你先看下防火墙。结果敲完 systemctl status firewalld,提示服务没装,机器上跑的其实是 iptables,白忙一场。有人干脆直接关掉 firewalld,结果把业务也一起关了。
Linux 没有统一的防火墙,发行版不同,工具也不同。CentOS 7、RHEL 7 之后默认 firewalld,Ubuntu 默认 ufw,还有不少机器保留 iptables 规则。查状态之前先确认在用哪套,命令才不至于报 Unit not found;拿不准就 systemctl list-units --type=service 里搜 firewall。
firewalld 看状态和放行规则
systemctl status firewalld 看服务跑没跑,firewall-cmd --state 直接返回 running 或 not running。再看 firewall-cmd --list-all,能看到当前区域的端口、服务和默认策略。加端口用 firewall-cmd --add-port=8080/tcp --permanent,然后 firewall-cmd --reload 生效,漏了 --permanent 重启就没了。
iptables 和 ufw 命令不通用
iptables -L -n -v 列出规则,-n 不解析域名,-v 带包计数,排查时比默认输出好用。Ubuntu 上 ufw status verbose 一行看全,ufw allow 22/tcp 放行端口;ufw 提示 command not found 就是没装,别和不生效混为一谈。两套工具同时存在的机器不少,iptables 里有规则不代表 firewalld 放行了,反之亦然。
防火墙开着不代表端口通
本机显示放行,外面还是连不上,要看云服务器安全组、机房硬件防火墙和服务监听地址。ss -lntp 确认端口在 0.0.0.0 上监听,只监听 127.0.0.1 的话,防火墙怎么改都没用。有的镜像默认装 firewalld 但没启动,systemctl is-enabled firewalld 看开机是否自启,状态和自启是两回事。
需要临时关防火墙排查,systemctl stop firewalld 是临时,disable 才是永久,别把两者搞反。Linux 查看防火墙状态只是第一步,真正要回答的是这个端口有没有被放行、服务有没有在听。三处都对上,再谈网络通不通。