X86控制器想要ping通百度www.baidu.com 解决方案
当前测试基于公司网络测试有可能由于不是个人电脑注册vpn能访问网络,可以后续自己使用网线进行测试
1、tp6000 表现为无法解析域名,因此需要DSN(域名解析)
TP2000也是相同现象
root@invt:~# ping wwww.baidu.com ping: wwww.baidu.com: Temporary failure in name resolution root@invt:~# ping -c 3 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. From 192.168.1.10 icmp_seq=1 Destination Host Unreachable From 192.168.1.10 icmp_seq=2 Destination Host Unreachable From 192.168.1.10 icmp_seq=3 Destination Host Unreachable --- 8.8.8.8 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2026ms pipe 3 root@invt:~#
ubuntu ping 的时候提示如下root@invt:~# ping wwww.baidu.com ping: wwww.baidu.com: Temporary failure in name resolution
这个错误表示 DNS解析失败,但网络本身可能是通的。问题出在域名解析上。以下是完整的排查和解决方案:
一、快速诊断步骤
1. 先测试网络连通性
bash
# 测试网络是否通(用IP地址,绕过DNS)
ping -c 3 8.8.8.8
# 如果IP能ping通 → 网络连接正常,问题在DNS
# 如果IP也ping不通 → 网络本身有问题
2. 检查DNS配置
bash
# 查看当前使用的DNS服务器
cat /etc/resolv.conf
# 应该看到nameserver行,如:nameserver 8.8.8.8
# 如果没有nameserver行,或IP不正确,就是问题所在
3. 手动测试DNS解析
bash
# 使用nslookup测试
nslookup www.baidu.com
# 或使用dig
dig www.baidu.com
# 指定DNS服务器测试(排除本地DNS配置问题)
nslookup www.baidu.com 8.8.8.8
dig @8.8.8.8 www.baidu.com
二、常见原因和解决方案
原因1:DNS服务器配置错误或缺失
解决方案:
bash
# 方法A:临时设置DNS(测试用)
sudo nano /etc/resolv.conf
# 添加或修改为:
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 114.114.114.114
# 测试是否生效
ping -c 3 www.baidu.com
# 方法B:永久设置DNS(根据你的系统选择)
# 对于systemd-resolved(Ubuntu 18.04+默认):
sudo nano /etc/systemd/resolved.conf
# 修改:
[Resolve]
DNS=8.8.8.8 8.8.4.4
# 然后重启
sudo systemctl restart systemd-resolved
# 方法C:使用nmcli(如果使用NetworkManager)
sudo nmcli connection show
sudo nmcli connection modify "你的连接名" ipv4.dns "8.8.8.8 8.8.4.4"
sudo nmcli connection up "你的连接名"
原因2:网络接口没有正确的IP地址
检查并修复:
bash
# 查看网络接口状态
ip addr show
# 或
ifconfig
# 如果没有获取到IP(显示inet),需要设置
# 如果是DHCP,重新获取:
sudo dhclient -r eth0 # 释放
sudo dhclient -v eth0 # 重新获取
# 或者设置静态IP:
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip route add default via 192.168.1.1
原因3:systemd-resolved服务异常
重启服务:
bash
# 检查状态
sudo systemctl status systemd-resolved
# 重启服务
sudo systemctl restart systemd-resolved
# 查看解析状态
resolvectl status
原因4:防火墙或网络限制
检查:
bash
# 测试DNS端口是否可达
nc -zv 8.8.8.8 53
# 或
telnet 8.8.8.8 53
# 检查防火墙规则
sudo iptables -L -n | grep 53
三、完整修复流程(按顺序执行)
步骤1:基础网络检查
bash
# 1.1 检查物理连接(网线/指示灯)
# 1.2 查看接口状态
ip link show eth0
# 应该显示:state UP
# 1.3 获取或设置IP
# 如果是DHCP:
sudo dhclient -v eth0
# 如果是静态IP:
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip route add default via 192.168.1.1
步骤2:DNS配置修复
bash
# 2.1 备份原配置
sudo cp /etc/resolv.conf /etc/resolv.conf.backup
# 2.2 临时设置可用的DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 114.114.114.114" | sudo tee -a /etc/resolv.conf
# 2.3 立即测试
ping -c 3 www.baidu.com
步骤3:永久修复DNS配置
选择适合你系统的方法:
方案A:禁用systemd-resolved,使用静态配置(简单可靠)
bash
# 停止并禁用systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
# 删除符号链接
sudo rm -f /etc/resolv.conf
# 创建静态配置文件
sudo tee /etc/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
nameserver 8.8.4.4
search localdomain
EOF
# 锁定文件防止被修改(可选)
sudo chattr +i /etc/resolv.conf
方案B:正确配置systemd-resolved
bash
# 编辑配置文件
sudo tee /etc/systemd/resolved.conf << EOF
[Resolve]
DNS=8.8.8.8 114.114.114.114 8.8.4.4
FallbackDNS=1.1.1.1 9.9.9.9
Domains=~.
DNSSEC=false
DNSOverTLS=false
EOF
# 重启服务
sudo systemctl restart systemd-resolved
sudo systemctl enable systemd-resolved
# 验证
resolvectl status
方案C:使用Netplan配置(Ubuntu 17.10+)
bash
# 找到配置文件
ls /etc/netplan/
# 编辑(示例,根据你的文件调整)
sudo nano /etc/netplan/00-installer-config.yaml
# 添加或修改:
network:
ethernet:
eth0:
dhcp4: yes
dhcp4-overrides:
use-dns: false # 不使用DHCP提供的DNS
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
# 应用配置
sudo netplan apply
步骤4:最终验证
bash
# 验证DNS解析
nslookup www.baidu.com
dig google.com
# 验证ping
ping -c 3 www.baidu.com
ping -c 3 google.com
# 查看完整DNS信息
cat /etc/resolv.conf
resolvectl status 2>/dev/null || echo "systemd-resolved not active"
四、嵌入式系统特殊注意事项
1. 资源受限系统
bash
# 使用BusyBox的nslookup(如果完整版不可用)
nslookup -type=A www.baidu.com
# 最小化DNS配置
echo "nameserver 8.8.8.8" > /etc/resolv.conf
# 禁用所有可能干扰的服务
systemctl stop systemd-resolved 2>/dev/null
systemctl stop NetworkManager 2>/dev/null
2. 无systemd的嵌入式系统
bash
# 直接管理/etc/resolv.conf
# 在启动脚本中添加DNS配置
cat >> /etc/rc.local << 'EOF'
# 设置DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
EOF
3. 使用connman的网络管理器(常见于IoT设备)
bash
# 检查connman
connmanctl services
# 通过connman设置DNS
connmanctl config <service> --nameservers 8.8.8.8 8.8.4.4
五、一键修复脚本
创建一个修复脚本fix_dns.sh:
bash
#!/bin/bash
# DNS一键修复脚本
echo "=== DNS修复脚本开始 ==="
# 1. 停止可能干扰的服务
sudo systemctl stop systemd-resolved 2>/dev/null
# 2. 设置临时DNS
echo "设置临时DNS服务器..."
sudo tee /etc/resolv.conf > /dev/null << EOF
nameserver 8.8.8.8
nameserver 114.114.114.114
nameserver 8.8.4.4
EOF
# 3. 测试网络连通性
echo "测试网络连通性..."
if ping -c 2 -W 1 8.8.8.8 &> /dev/null; then
echo "✓ 网络连接正常"
else
echo "✗ 网络不通,请检查网线或IP配置"
exit 1
fi
# 4. 测试DNS解析
echo "测试DNS解析..."
if nslookup www.baidu.com &> /dev/null; then
echo "✓ DNS解析正常"
else
echo "✗ DNS解析失败,尝试其他DNS..."
sudo sed -i '1s/^/nameserver 1.1.1.1\n/' /etc/resolv.conf
fi
# 5. 最终测试
echo "最终测试..."
ping -c 2 www.baidu.com && echo "✓ 修复成功!" || echo "✗ 仍有问题,请手动检查"
echo "=== 脚本结束 ==="
给执行权限并运行:
bash
chmod +x fix_dns.sh
sudo ./fix_dns.sh
六、故障排查表格
| 症状 | 可能原因 | 快速测试 | 解决方案 |
|---|---|---|---|
| ping IP通,ping域名失败 | DNS配置问题 | nslookup baidu.com |
设置正确的DNS服务器 |
| 完全ping不通 | 网络断开/IP错误 | ip addr show |
检查IP配置,重新插拔网线 |
| 间歇性解析失败 | DNS服务器不稳定 | dig @114.114.114.114 baidu.com |
更换备用DNS |
| 仅特定域名失败 | 域名被屏蔽/污染 | dig baidu.com +trace |
使用公共DNS |
| 重启后问题重现 | 配置未保存 | ls -l /etc/resolv.conf |
永久修改DNS配置 |
七、最简解决方案
如果着急解决问题,直接执行:
bash
# 1. 设置临时DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 114.114.114.114" | sudo tee -a /etc/resolv.conf
# 2. 禁用自动管理(防止被覆盖)
sudo systemctl stop systemd-resolved 2>/dev/null
sudo systemctl disable systemd-resolved 2>/dev/null
# 3. 测试
ping -c 3 www.baidu.com
关键点:
-
先确保能
ping 8.8.8.8通(网络层正常) -
再确保
/etc/resolv.conf中有正确的nameserver设置 -
防止网络管理服务覆盖你的修改
这样应该能解决Temporary failure in name resolution错误。
2.1 修改该文件时遇到修改后重启又恢复为原来的 ubuntu 的/etc/resolv.conf文件 为什么修改后重启又变回去了
这是因为Ubuntu使用了systemd-resolved或NetworkManager等网络管理服务,它们会自动管理DNS配置。你手动修改/etc/resolv.conf后,这些服务检测到文件被更改,会重新用它们管理的配置覆盖回去。
一、根本原因解析
resolv.conf文件的三种类型:
bash
# 查看你的resolv.conf是什么类型
ls -l /etc/resolv.conf
# 常见的三种情况:
# 1. 符号链接(最常见) → 指向systemd-resolved或NetworkManager管理的文件
lrwxrwxrwx 1 root root 39 Jan 15 10:00 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf————实际查看是一个链接
# 2. 普通文件(可能被NetworkManager管理)
# 3. 静态文件(很少见,需要特定配置)
工作原理:
text
systemd-resolved或NetworkManager
↓
监控DNS配置变化
↓
自动更新/etc/resolv.conf
↓
你手动修改 → 被检测到 → 重新覆盖
二、查看当前DNS管理机制
1. 检查谁在管理resolv.conf
bash
# 方法1:查看文件类型
ls -l /etc/resolv.conf
# 方法2:检查systemd-resolved状态
systemctl status systemd-resolved
# 方法3:检查NetworkManager状态
systemctl status NetworkManager
# 方法4:查看所有可能管理网络的服务
systemctl list-units --type=service | grep -E "(network|resolv|dns)"
2. 查看实际使用的DNS服务器
bash
# 查看systemd-resolved的实际DNS配置
resolvectl status
# 或
systemd-resolve --status
# 查看当前使用的DNS
nmcli dev show | grep DNS # NetworkManager方式
cat /etc/resolv.conf # 当前生效的(可能不是永久的)
三、正确的永久修改方法
方法1:通过systemd-resolved修改(Ubuntu 18.04+默认)
bash
# 1. 编辑resolved配置文件
sudo nano /etc/systemd/resolved.conf
# 2. 修改以下内容(去掉注释#)
[Resolve]
DNS=8.8.8.8 8.8.4.4 # 设置首选DNS服务器
FallbackDNS=1.1.1.1 9.9.9.9 # 备用DNS
Domains=~. # 搜索域名
#DNSSEC=yes # DNS安全扩展(可选)
#DNSOverTLS=opportunistic # DNS over TLS(可选)
# 3. 重启服务生效
sudo systemctl restart systemd-resolved
# 4. 验证配置
resolvectl status
cat /etc/resolv.conf
方法2:通过Netplan修改(Ubuntu 17.10+)
bash
# 1. 找到Netplan配置文件
ls /etc/netplan/
# 通常为:01-netcfg.yaml 或 50-cloud-init.yaml
# 2. 编辑配置文件
sudo nano /etc/netplan/01-netcfg.yaml
# 3. 添加nameservers部分
network:
version: 2
ethernet:
eth0: # 或你的网卡名,用 ip addr 查看
dhcp4: no
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
search: [localdomain] # 搜索域(可选)
# 4. 应用配置
sudo netplan apply
# 5. 验证
resolvectl status
方法3:通过NetworkManager修改(图形界面或命令行)
图形界面:
-
右上角网络图标 → 设置
-
选择网络连接 → 齿轮图标
-
IPv4/IPv6标签页 → DNS → 手动输入DNS服务器
命令行:
bash
# 1. 查看当前连接
nmcli connection show
# 输出类似:NAME UUID TYPE DEVICE
# Wired connection 1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ethernet eth0
# 2. 修改DNS(替换"Wired connection 1"为你的连接名)
sudo nmcli connection mod "Wired connection 1" ipv4.dns "8.8.8.8 8.8.4.4"
sudo nmcli connection mod "Wired connection 1" ipv4.ignore-auto-dns yes
# 3. 重新激活连接
sudo nmcli connection down "Wired connection 1"
sudo nmcli connection up "Wired connection 1"
# 4. 验证
nmcli dev show eth0 | grep DNS
方法4:禁用自动管理(不推荐,但了解原理)
bash
# 1. 停止systemd-resolved管理
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
# 2. 移除符号链接
sudo rm /etc/resolv.conf
# 3. 创建静态文件
sudo nano /etc/resolv.conf
# 内容:
nameserver 8.8.8.8
nameserver 8.8.4.4
search localdomain
# 4. 锁定文件防止被修改
sudo chattr +i /etc/resolv.conf # 解锁用:sudo chattr -i /etc/resolv.conf
四、临时修改方法(重启失效)
如果你只是临时测试:
bash
# 方法1:直接修改(会被覆盖,但可临时使用)
sudo nano /etc/resolv.conf
# 修改后立即生效,但服务重启后会恢复
# 方法2:通过resolvectl临时修改
sudo resolvectl dns eth0 8.8.8.8 8.8.4.4
sudo resolvectl domain eth0 "localdomain"
# 这只对eth0接口生效,重启后失效
# 方法3:临时覆盖整个系统的DNS
sudo systemd-resolve --set-dns=8.8.8.8 --set-dns=8.8.4.4 --interface=eth0
五、诊断DNS问题
1. 检查DNS解析是否工作
bash
# 测试DNS解析
nslookup google.com
# 或
dig google.com
# 指定DNS服务器测试
dig @8.8.8.8 google.com
# 查看DNS缓存(如果使用systemd-resolved)
resolvectl statistics
2. 查看DNS请求的详细过程
bash
# 使用tcpdump抓取DNS包(端口53)
sudo tcpdump -i eth0 port 53 -v
# 或更详细的DNS分析
sudo tcpdump -i eth0 -n -s 0 port 53
六、嵌入式系统的特殊考虑
在嵌入式Ubuntu系统中,可能还有额外的管理机制:
1. Cloud-init(云镜像常见)
bash
# 检查是否使用cloud-init
systemctl status cloud-init
# 修改cloud-init配置
sudo nano /etc/cloud/cloud.cfg.d/99-custom-dns.cfg
# 添加:
manage_resolv_conf: false # 禁止管理resolv.conf
2. DHCP客户端覆盖
bash
# 如果使用dhclient,它也会更新DNS
# 在dhclient配置中指定DNS
sudo nano /etc/dhcp/dhclient.conf
# 添加:
supersede domain-name-servers 8.8.8.8, 8.8.4.4;
七、总结与推荐方案
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| systemd-resolved | Ubuntu 18.04+默认 | 系统集成好,支持DNSSEC | 配置方式不同于传统 |
| Netplan | 新版Ubuntu服务器 | 声明式配置,简单清晰 | 仅限网络配置 |
| NetworkManager | 桌面版/有GUI的系统 | 图形界面支持好 | 对无头服务器可能过重 |
| 静态文件+锁定 | 简单嵌入式系统 | 完全控制,无自动干扰 | 失去自动管理功能 |
推荐操作流程:
bash
# 1. 先查看当前系统使用哪种管理
ls -l /etc/resolv.conf
systemctl status systemd-resolved
# 2. 根据结果选择修改方式
# 如果是符号链接到systemd-resolved:
sudo nano /etc/systemd/resolved.conf
# 3. 修改并重启服务
sudo systemctl restart systemd-resolved
# 4. 验证
resolvectl status
ping -c 3 baidu.com
一句话答案:
Ubuntu修改/etc/resolv.conf后重启变回去,是因为systemd-resolved或NetworkManager等网络服务在自动管理DNS配置。正确做法是修改这些服务的配置文件,而不是直接改resolv.conf。
对于嵌入式开发,如果不需要动态DNS更新,可以考虑禁用这些服务,直接使用静态/etc/resolv.conf并锁定文件,这样可以减少系统复杂度和资源占用。
浙公网安备 33010602011771号