拿到的 CentOS 7 服务器,部署完项目,端口在服务器本机明明通着,外部就是访问不了。排查了半天,结果发现是防火墙规则压根没放行。这个场景我猜很多运维和开发朋友都经历过,尤其是第一次接触 CentOS 7 的时候,总是绕不开“防火墙”和“服务器端口”这对组合。
这篇文章我不想只丢给你几条命令,而是把 CentOS 7 上防火墙运行的底层机制、安装过程、项目端口开放的各种姿势,以及“端口放行了却依然不通”这类高发问题的完整排查链路一次性讲清楚。无论你是刚接手服务器的新手,还是已经踩过几个坑的进阶用户,照着这篇文章的思路走一遍,应该能省下不少排查时间。
1. CentOS 7 防火墙机制拆解:firewalld 是怎么拦端口的
1.1 搞清楚 firewalld 和 iptables 的关系
排查端口问题前,先把底层机制想明白。CentOS 6 及更早版本,系统自带的是 iptables 服务,规则直接写在 /etc/sysconfig/iptables 里,改完需要重启 iptables 服务才能生效。到了 CentOS 7,默认的管理工具换成了 firewalld,它本身并不是一个全新的包过滤引擎,底层依然走内核的 netfilter 框架,只是用一套更友好的配置方式,把规则加工成 iptables 规则并加载进内核。
可以这样理解:netfilter 是真正干活的检查员,firewalld 是站在门口的经理,负责接收你“放行 8080 端口”的指令,转化成检查员能执行的标准名单。
所以有一个很常见的误区:你执行 iptables -L 看一眼,发现规则链里空空的,就判断“防火墙没拦”,然后跑去查代码、查网络,折腾一圈无果,最后发现真正的拦截逻辑在 firewalld 的规则层。反过来,你用 firewall-cmd --list-all 看到的规则,也不等于 iptables -L 里全部的内容,因为 firewalld 会把规则拆成多个自定义链,比如 IN_public_allow,只有顺着链往下看才看得到全貌。排查的时候,两者要结合起来看。
1.2 zone 区域:一套规则对应一种信任级别
firewalld 引入了“区域”这个概念,这也是很多人刚接触时不理解的地方。你可以把区域理解成一套针对不同网
