Ubuntu 22.04下部分域名DNS解析失败的问题排查及修复求助
我最近碰到个特别诡异的问题:用Ubuntu上的Firefox访问部分网站时,要么图片加载不出来,甚至有个网站直接连不上,但换Windows 11上的同版本Firefox(同一4G网络、同样配置了OpenDNS)就完全正常。
排查后发现不是浏览器的锅——用nslookup或者dig测试,Ubuntu这边确实解析失败那些出问题的域名。常用站点比如谷歌、油管都没问题,就俩网站出状况,虽然不影响日常,但实在搞不懂:同网络同DNS设置,为啥Linux发的请求就解析失败?
下面给你几个排查和修复的思路,都是实际运维中常用的方法:
一、先确认系统实际在用的DNS服务器
有时候咱们手动设置的DNS可能没生效,被系统的NetworkManager或者systemd-resolved给“偷偷替换”了。你可以跑这俩命令查一下当前实际生效的DNS:
# 查看systemd-resolved配置的DNS systemd-resolve --status | grep "DNS Servers" # 查看resolv.conf里的实际DNS cat /etc/resolv.conf
要是显示的不是OpenDNS的IP(通常是208.67.222.222和208.67.220.220),那说明系统没走你配置的DNS,得先把这个问题解决——比如检查NetworkManager的DNS设置,或者确保systemd-resolved没有覆盖你的配置。
二、抓包对比DNS请求的差异
既然Windows能成功、Ubuntu不行,那抓个包看看两者的DNS请求到底有啥不一样。在Ubuntu上用tcpdump抓DNS流量:
sudo tcpdump -i any port 53 -w dns_failure.pcap
然后访问那个出问题的网站,等个几秒按Ctrl+C停止抓包。之后用Wireshark打开这个pcap文件,重点看:
- DNS请求有没有正常发出去?
- DNS服务器有没有回应?
- 请求的EDNS0参数、TTL值这些和Windows上的请求有没有差异?
有些DNS服务器会对不同操作系统的请求做特殊处理(虽然少见,但真的存在),抓包能帮你揪出细节。
三、直接指定DNS服务器测试
试试跳过系统默认的DNS配置,直接用OpenDNS服务器解析出问题的域名:
dig @208.67.222.222 你的问题域名.com nslookup 你的问题域名.com 208.67.222.222
如果这样能成功,那说明系统的DNS转发或者缓存出问题了;要是还是失败,那试试换个公共DNS比如Cloudflare(1.1.1.1)或者谷歌DNS(8.8.8.8)再测:
dig @1.1.1.1 你的问题域名.com
如果换DNS能成功,那大概率是OpenDNS那边对Linux的请求有过滤规则,要么换个DNS用,要么联系OpenDNS客服问问情况。
四、清理DNS缓存+检查本地hosts
Ubuntu默认用systemd-resolved做DNS缓存,先清一下缓存试试:
sudo systemd-resolve --flush-caches
另外检查下/etc/hosts文件有没有误加那个问题域名的错误解析:
cat /etc/hosts | grep 你的问题域名.com
要是有相关条目,删掉就行。
五、测试不同的DNS解析参数
有些Linux系统的DNS解析会用到EDNS0扩展,部分DNS服务器可能对这个扩展的支持有问题。试试用dig加上不同参数测试:
# 启用EDNS0 dig +edns=0 你的问题域名.com # 禁用EDNS0 dig +noedns 你的问题域名.com
如果某个参数下能成功解析,那可以配置systemd-resolved强制使用这个参数——比如编辑/etc/systemd/resolved.conf,添加DNSSEC=no或者EDNS0=no,然后重启服务:
sudo systemctl restart systemd-resolved
要是上面的步骤都试过还是没头绪,建议把dig失败的完整输出(包括Windows上成功的输出)贴出来,或者把tcpdump抓包的关键信息(敏感内容打码)放上来,这样更容易定位问题。
备注:内容来源于stack exchange,提问作者Marco




