
排查网络问题时,Linux 防火墙(尤其是 iptables 或 nftables)常是被忽略的关键环节。连接不通、端口无响应、服务无法访问,很多情况并非应用或网络配置问题,而是防火墙规则主动丢弃了流量。
确认当前启用的防火墙服务
先明确系统实际运行的是哪套防火墙机制,避免在错误的工具上浪费时间:
- 运行 systemctl list-units | grep -i firewall 查看是否启用了
firewalld(常见于 CentOS/RHEL/Fedora) - 运行 iptables -L -n -v 或 nft list ruleset 检查底层规则是否存在(即使
firewalld在运行,它也通过这些后端生效) - Debian/Ubuntu 默认不启用
ufw,但若已启用,用 sudo ufw status verbose 查看详细状态
检查规则是否匹配并丢弃目标流量
仅看规则列表不够,要确认具体请求是否被某条规则拦截。关键看三点:方向(INPUT/OUTPUT/FORWARD)、协议+端口、动作(ACCEPT/DROP/REJECT):
- 对入站连接(如访问本机 Web 服务),重点检查
INPUT链;使用 iptables -L INPUT -n -v 查看各规则的包计数 —— 若某条 DROP 规则计数持续增长,很可能就是它在拦截 - 注意规则顺序:iptables/nftables 按从上到下匹配,第一条匹配即执行动作,后续不再检查。常见陷阱是“允许特定端口”规则写在了“默认 DROP”之后
- 临时加一条记录型规则辅助诊断:例如在 INPUT 链最前插入 iptables -I INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP-DEBUG: ",再查 dmesg 或 journalctl -k | grep HTTP-DEBUG 看请求是否到达及被哪条规则处理
区分本地回环与外部访问的规则差异
很多服务(如数据库、API)默认只监听 127.0.0.1,而防火墙规则可能放行了 localhost 流量,却未开放外部网卡接口:
- 用 ss -tlnp | grep :端口号 确认服务绑定的是
0.0.0.0(所有接口)还是127.0.0.1(仅本地) - 检查防火墙是否限制了特定网卡:比如 iptables -L INPUT -n -v 中某条规则带
-i eth0,但实际流量走的是ens33或enp0s3,就会漏匹配 - 云服务器还需注意安全组(Security Group)—— 它在宿主机层面过滤,比 Linux 防火墙更前置,务必同步检查
临时禁用防火墙快速验证
为排除干扰,可临时关闭防火墙验证是否为根本原因(操作后记得及时恢复):
-
firewalld: sudo systemctl stop firewalld(重启后自动恢复需disable) -
ufw: sudo ufw disable - 原生 iptables: sudo iptables -P INPUT ACCEPT && sudo iptables -F(仅清空规则,策略设为 ACCEPT;重启网络服务或机器后规则会恢复)










