15分钟掌握Linux网络故障分层排查法:通过真实案例,手把手教你定位并解决iptables防火墙导致的DNS解析失败问题,附带可复制执行的解决方案和预防措施
1 问题背景
在Linux系统管理中,DNS解析失败是最常见的网络故障之一。本次案例发生在CentOS 7.9生产环境,表现为域名无法解析但IP通信正常,最终定位到防火墙规则阻塞DNS流量。通过系统化的排查流程,我们将展示如何从应用层到网络层逐层定位问题根源。

2 方案总览
IP通 IP不通 DNS解析失败 网络层检查 DNS配置问题 网络连接问题 防火墙规则检查 DNS配置验证 iptables规则分析 resolv.conf配置 删除阻塞规则 添加可靠DNS 验证解决
环境信息:
- 操作系统: CentOS Linux release 7.9.2009 (Core)
- 内核版本: 3.10.0-1160.el7.x86_64
- 网络环境: VMware虚拟机环境
- DNS配置: NetworkManager管理
3 逐步拆解
3.1 症状识别与分层定位
系统出现典型的DNS解析故障,具体表现为:
bash
# DNS解析失败 - 域名无法解析
[root@localhost ~]# ping -c 2 baidu.com
ping: baidu.com: 未知的名称或服务
# IP层通信正常 - 网络连通性验证
[root@localhost ~]# ping 220.181.38.148
PING 220.181.38.148 (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148: icmp_seq=1 ttl=128 time=30.8 ms
--- 220.181.38.148 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss

分层定位原则:
- 网络层正常: IP通信成功,排除物理网络和路由问题
- 应用层异常: 域名解析失败,指向DNS配置或策略问题
- 结论: 问题定位在DNS解析层面,需要检查DNS配置和防火墙规则
排查方向: 从系统DNS配置 → 防火墙规则 → 网络策略逐层深入
3.2 防火墙规则深度分析

执行详细的防火墙规则检查,这是问题的关键突破口:
bash
# 检查OUTPUT链中阻止DNS的规则
[root@localhost ~]# iptables -L OUTPUT -n | grep 53
DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
# 精确定位规则行号
[root@localhost ~]# iptables -L OUTPUT -n --line-numbers | grep 53
1 DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
规则解读:
- 链(Chain): OUTPUT - 处理本机出站流量
- 协议(Protocol): udp - DNS查询主要使用UDP协议
- 目标端口(Destination Port): 53 - 标准DNS服务端口
- 动作(Action): DROP - 直接丢弃匹配的数据包
影响范围: 所有基于UDP的DNS查询请求都被阻止,导致域名无法解析
重大发现: 防火墙OUTPUT链中存在DROP规则,明确阻止了UDP 53端口的DNS查询流量!
3.3 防火墙规则修复与配置优化
执行精准的防火墙规则修复:
bash
# 删除阻止DNS查询的防火墙规则(按行号删除)
[root@localhost ~]# iptables -D OUTPUT 1
# 验证规则删除结果
[root@localhost ~]# iptables -L OUTPUT -n | grep 53
# 无输出,规则已成功删除
# 优化DNS配置文件
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.209.2
nameserver 223.5.5.5 # 阿里云公共DNS
nameserver 8.8.8.8 # Google DNS

发现问题: iptables规则阻塞 执行修复: iptables -D OUTPUT 1 验证修复: 检查规则是否删除 配置优化: 添加可靠DNS 重启网络: systemctl restart network
4 故障解决验证
4.1 解决方案验证测试
执行多维度验证测试,确认问题彻底解决:
bash
# 基础DNS解析测试
[root@localhost ~]# ping baidu.com
PING baidu.com (220.181.7.203) 56(84) bytes of data.
64 bytes from 220.181.7.203: icmp_seq=1 ttl=128 time=34.3 ms
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss
# 多域名解析验证
[root@localhost ~]# ping -c 2 google.com
PING google.com (142.250.190.46) 56(84) bytes of data.
64 bytes from 142.250.190.46: icmp_seq=1 ttl=128 time=35.2 ms
[root@localhost ~]# ping -c 2 tencent.com
PING tencent.com (183.3.226.35) 56(84) bytes of data.
64 bytes from 183.3.226.35: icmp_seq=1 ttl=128 time=28.7 ms
[root@localhost ~]# ping -c 2 aliyun.com
PING aliyun.com (106.11.37.111) 56(84) bytes of data.
64 bytes from 106.11.37.111: icmp_seq=1 ttl=128 time=32.1 ms
# DNS服务器可达性测试
[root@localhost ~]# dig @223.5.5.5 baidu.com
;; Query time: 15 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Mon Nov 03 20:00:00 CST 2025

[在线测试工具] : → DNS解析测试平台 ←
4.2 配置固化与持久化
bash
# 保存iptables规则(确保重启后生效)
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
# 验证配置文件最终状态
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.209.2 # 主DNS
nameserver 223.5.5.5 # 阿里云DNS
nameserver 8.8.8.8 # Google DNS
# 检查网络服务状态
[root@localhost ~]# systemctl status network
● network.service - LSB: Bring up/down networking
Active: active (exited) since Mon 2025-11-03 20:00:00 CST
5 常见坑与解决方案
| 现象 | 原因 | 一行命令验证 | 解决方案 |
|---|---|---|---|
| ping IP通但域名不通 | DNS配置错误或缺失 | cat /etc/resolv.conf |
添加可靠DNS服务器 |
| iptables规则删除后失效 | 未保存规则 | service iptables save |
保存规则并设置开机自启 |
| NetworkManager覆盖配置 | 配置管理冲突 | systemctl status NetworkManager |
禁用NetworkManager或配置优先级 |
| 防火墙重启后规则恢复 | 规则未持久化 | `iptables-save | grep 53` |
5.1 深度分析:NetworkManager与resolv.conf冲突
冲突机制:
- NetworkManager会根据网络连接状态动态更新resolv.conf
- 手动修改的DNS可能被NetworkManager覆盖
- 需要配置NM_CONTROLLED=no或使用dnsmasq
解决方案:
bash
# 方法1:禁用NetworkManager管理
echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-ens33
# 方法2:配置NetworkManager使用指定DNS
nmcli con mod "System eth0" ipv4.dns "8.8.8.8 223.5.5.5"
nmcli con up "System eth0"
6 结论与海报
6.1 核心结论
- 分层排查法是定位网络故障的有效方法,从应用层到网络层逐层验证
- 防火墙规则是DNS解析失败的常见原因,需要重点检查OUTPUT链
- 配置持久化是避免问题复发的关键,修改后必须保存和验证