防火墙规则阻止端口访问是linux服务“启动了却连不上”的最常见原因;需确认服务状态、规则是否生效/匹配/被覆盖、协议与来源是否完整,同时排除安全组、selinux及内核参数等干扰层。

防火墙规则阻止端口访问,是 Linux 服务“明明启动了却连不上”的最常见原因。排查关键不是看规则有没有加,而是确认规则是否生效、是否匹配、是否被更高优先级规则覆盖,以及是否遗漏协议或来源限制。
确认防火墙服务状态和当前规则
先判断防火墙是否真的在运行,并看清实际生效的规则:
- firewalld(CentOS/RHEL 7+、Fedora):运行 sudo firewall-cmd --state,输出 running 表示启用;再执行 sudo firewall-cmd --list-all 查看当前 zone 的所有放行服务、端口、富规则和源地址限制
- iptables(传统或精简系统):运行 sudo iptables -L -n -v,重点观察 INPUT 链中是否有 ACCEPT 规则匹配目标端口和协议,同时注意是否有靠前的 REJECT 或 DROP 规则将其跳过
检查端口放行是否完整且语法正确
firewalld 对端口和协议的组合非常敏感,常见错误包括:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 漏写 /tcp 或 /udp 后缀:例如
firewall-cmd --add-port=8080不生效,必须写成--add-port=8080/tcp - 只用了临时规则但没加 --permanent:重启后失效;添加后务必执行 firewall-cmd --reload 才能生效
- 误用 --add-service 却未确认该服务定义存在:可用 firewall-cmd --get-services 列出支持的服务名,
http、https等是内置的,自定义服务需提前定义 XML 文件
验证规则是否真正匹配流量路径
即使规则存在,也可能因以下原因不生效:
- 规则绑定了特定 zone(如
--zone=public),但网卡实际归属其他 zone(如internal),可用 firewall-cmd --get-active-zones 和 firewall-cmd --get-zone-of-interface=eth0 核对 - 富规则(rich rule)设置了 source address 限制(如仅允许 192.168.1.0/24),而你的客户端 IP 不在范围内
- 使用了 --direct 规则但未 reload,或与 firewalld 原生规则冲突;可运行 firewall-cmd --direct --get-all-rules 检查
排除其他“看起来像防火墙”的拦截层
有些拦截行为容易被误认为防火墙问题:
- 云平台安全组:阿里云、腾讯云、AWS 等都有独立于系统防火墙的安全组策略,必须单独配置放行对应端口和源 IP 段
- SELinux 网络绑定限制(RHEL/CentOS):即使防火墙放行,SELinux 可能禁止服务绑定到网络端口,临时测试可运行 sudo setsebool -P httpd_can_network_bind 1,或查 ausearch -m avc -ts recent 看拒绝日志
-
内核参数 net.ipv4.conf.all.rp_filter:开启反向路径过滤可能导致多网卡环境下的回包被丢弃,可临时设为
0测试










