Ubuntu 20.04 DNS解析原理, 解决resolv.conf被覆盖问题

2023-11-10 11:29

本文主要是介绍Ubuntu 20.04 DNS解析原理, 解决resolv.conf被覆盖问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

------------------------------------------------------------------
author: hjjdebug
date: 2023年 11月 09日 星期四 14:01:11 CST
description: Ubuntu 20.04 DNS解析原理, 解决resolv.conf被覆盖问题
------------------------------------------------------------------
问题:
开机后不能上网, ping baidu.com 不能ping 通,
错误为:
ping: baidu.com: 域名解析暂时失败
修改 /etc/resolv.conf 文件,添加
nameserver 8.8.8.8

再ping baidu.com, 可以ping 通, 可以正常上网.
但是,当重新启动机器后, /etc/resolv.conf 文件被覆盖为旧的文件,
要想上网, 还需要重新修改文件内容.

解决问题的方法很简单,只需要看第7步即可.即修改/etc/systemd/resolved.conf,添加DNS=8.8.8.8
想了解其工作原理,可阅读本博客! 关注以下内容:
1. 域名解析服务是什么? systemd-resolved.service
2. 它起了什么作用? 它将127.0.0.53的请求转发给后端服务请求
3. 后端服务请求服务器是哪个文件? /run/systemd/resolve/resolv.conf
4. 该文件是如何生成的, 开机时由 /etc/systemd/resolved.conf 形成
5. 域名解析的过程?  参考步骤8, 由127.0.0.53转发给后端server
6. 域名解析工具resolvectl 的使用


这里记录一下我解决问题的过程:
解决问题的思路:
1. 查寻 /etc/resolv.conf, 是一个文件链接.
$ls -l /etc/resolv.conf
resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

在 /run/systemd/resolve 目录, 有2个文件, 它们每次开机时都会重新生成(看文件时间)
-rw-r--r--  1 systemd-resolve systemd-resolve 584 11月  9 11:13 resolv.conf
-rw-r--r--  1 systemd-resolve systemd-resolve 717 11月  9 11:13 stub-resolv.conf
所以不能直接修改这两个文件, 因为它们会开机重新生成. 旧内容被覆盖.

而且你用vim 打开 /etc/resolv.conf 文件, 也可以看到如下提示:
This file is managed by man:systemd-resolved(8). Do not edit.

可见该文件是由systemd-resolved 服务来管理,不要编辑.

2. 查询域名解析服务名称
$ systemctl status |grep resolv
 
  ├─systemd-resolved.service
                └─1254 /lib/systemd/systemd-resolved


3. 查询域名解析服务状态
$ systemctl status systemd-resolved
● systemd-resolved.service - Network Name Resolution
     Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; ven>
     Active: active (running) since Thu 2023-11-09 11:13:47 CST; 11min ago
       Docs: man:systemd-resolved.service(8)
             https://www.freedesktop.org/wiki/Software/systemd/resolved
             https://www.freedesktop.org/wiki/Software/systemd/writing-network->
             https://www.freedesktop.org/wiki/Software/systemd/writing-resolver>
   Main PID: 1254 (systemd-resolve)
     Status: "Processing requests..."
      Tasks: 1 (limit: 9103)
     Memory: 8.6M
     CGroup: /system.slice/systemd-resolved.service
             └─1254 /lib/systemd/systemd-resolved


4. 查找服务配置文件.
 
  用lsof -p 1254 只能查看它当前打开的文件,并不能判定它的配置文件是谁.

 用fswatch 监视 /etc/systemd 目录, -t 是打印时间, -x 是打印事件
 $fswatch -t -x /etc/systemd

 然后执行 停止,启动 systemd-resolved 服务
 $ sudo systemctl stop systemd-resolved
 $ sudo systemctl start systemd-resolved
 监视到如下事件:
 2023年11月09日 星期四 11时34分22秒 /etc/systemd/resolved.conf PlatformSpecific
 说明它访问了 /etc/systemd/resolved.conf 文件, 这也仅仅表示打开服务会访问这个文件,

 通过查找网络资源, 确认还是要手工修改/etc/systemd/resolved.conf 这个文件


5. 编辑服务配置文件 /etc/systemd/resolved.conf
打开这个文件, 看到是一个空文件, 由若干行但都被# 号注释着, 把第一行DNS 的注释号去掉,
写成:
DNS=8.8.8.8

这个文件改动后, 开机会依照它重新生成 /run/systemd/resolve/resolv.conf 文件

6. 验证
重启机器,看到/run/systemd/resolve 目录下新生成的文件
-rw-r--r--  1 systemd-resolve systemd-resolve 584 11月  9 12:42 resolv.conf
-rw-r--r--  1 systemd-resolve systemd-resolve 717 11月  9 12:42 stub-resolv.conf
查看内容: stub-resolv.conf 没有改变
resolv.conf 内容已经添加了:
nameserver 8.8.8.8


7. 结论: 其实只要一步修改
修改 /etc/systemd/resolved.conf, 添加DNS=8.8.8.8
验证: 开机后,ping baidu.com 可以ping 通


8. systemd-resolved 服务起到了什么作用?
在没有systemd-resolved 服务的机器上,域名是这样解析的

    1.从dns缓存里查找域名与ip的映射关系
    2.从/etc/hosts里查找域名与ip的映射关系
    3. 从/etc/resolv.conf里查找dns server,并发起解析请求
    /etc/resolv.conf的内容一般如下:
    nameserver 8.8.8.8


在有systemd-resolved 服务的机器上,域名还是这样解析的
    1.从dns缓存里查找域名与ip的映射关系
    2.从/etc/hosts里查找域名与ip的映射关系
    3. 从/etc/resolv.conf里查找dns server,并发起解析请求
    但是, 此时/etc/resolv.conf 的内容如下:
    nameserver 127.0.0.53
    options edns0 trust-ad

    使得本地解析请求全部发到127.0.0.53

    然后systemd-resolved再根据/run/systemd/resolve/resolv.conf里面的dns server去发起请求
    /run/systemd/resolve/resolv.conf记录的就是真正的后端dns server

9. 域名解析工具 resolvectl

$ ls -l systemd-resolve
lrwxrwxrwx 1 root root 10 3月   2  2023 systemd-resolve -> resolvectl*

systemd-resolve 就是resolvectl 的软链接.

resolvectl 是 systemd 包中的工具:
$ which resolvectl
/bin/resolvectl

$dpkg -S /usr/bin/resolvectl
systemd: /usr/bin/resolvectl

resolvectl 的使用方法:
 $ resolvectl -h
 $ resolvectl status
 $ resolvectl query baidu.com
 $ resolvectl query www.baidu.com

 $ resolvectl flush-caches

$ resolvectl statistics

这篇关于Ubuntu 20.04 DNS解析原理, 解决resolv.conf被覆盖问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382362

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制