blj28

导航

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

关键点:

  1. 先确保能ping 8.8.8.8通(网络层正常)

  2. 再确保/etc/resolv.conf中有正确的nameserver设置

  3. 防止网络管理服务覆盖你的修改

这样应该能解决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修改(图形界面或命令行)

图形界面:

  1. 右上角网络图标 → 设置

  2. 选择网络连接 → 齿轮图标

  3. 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并锁定文件,这样可以减少系统复杂度和资源占用。

 
 
 
 
 
 

posted on 2026-01-30 14:01  bailinjun  阅读(5)  评论(0)    收藏  举报