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

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景