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. 查寻 /etc/resolv.conf, 是一个文件链接.

user@node2:~$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Apr 23 17:40 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

/run/systemd/resolve 目录, 有2个文件, 它们每次开机时都会重新生成(看文件时间)

user@node2:~$ ll /run/systemd/resolve
total 8
drwxr-xr-x  2 systemd-resolve systemd-resolve 120 Jun 22 09:19 ./
drwxr-xr-x 24 root            root            620 Jun 22 12:52 ../
srw-rw-rw-  1 systemd-resolve systemd-resolve   0 Jun 21 23:18 io.systemd.Resolve=
srw-------  1 systemd-resolve systemd-resolve   0 Jun 21 23:18 io.systemd.Resolve.Monitor=
-rw-r--r--  1 systemd-resolve systemd-resolve 950 Jun 21 23:18 resolv.conf
-rw-r--r--  1 systemd-resolve systemd-resolve 920 Jun 22 09:18 stub-resolv.conf

所以不能直接修改这两个文件, 因为它们会开机重新生成. 旧内容被覆盖.
而且你用vim 打开 /etc/resolv.conf 文件, 也可以看到如下提示:
This file is managed by man:systemd-resolved(8). Do not edit.
可见该文件是由systemd-resolved 服务来管理,不要编辑.

2. 查询域名解析服务名称

user@node2:~$  systemctl status |grep resolv
           │ ├─systemd-resolved.service
           │ │ └─330132 /usr/lib/systemd/systemd-resolved
               │ └─888442 grep --color=auto resolv

3. 查询域名解析服务状态

● systemd-resolved.service - Network Name Resolution
     Loaded: loaded (/usr/lib/systemd/system/systemd-resolved.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-06-21 23:18:13 CST; 13h ago
       Docs: man:systemd-resolved.service(8)
             man:org.freedesktop.resolve1(5)
             https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
             https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
   Main PID: 330132 (systemd-resolve)
     Status: "Processing requests..."
      Tasks: 1 (limit: 76690)
     Memory: 2.8M (peak: 3.8M)
        CPU: 1.031s
     CGroup: /system.slice/systemd-resolved.service
             └─330132 /usr/lib/systemd/systemd-resolved

Jun 21 23:18:13 node2 systemd[1]: Started systemd-resolved.service - Network Name Resolution.
Jun 21 23:18:25 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.46.151.
Jun 22 01:11:56 node2 systemd-resolved[330132]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 202.106.46.151.
Jun 22 01:11:56 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.46.151.
Jun 22 08:16:56 node2 systemd-resolved[330132]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 202.106.46.151.
Jun 22 08:16:56 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.46.151.
Jun 22 09:03:16 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.195.68.
Jun 22 09:19:08 node2 systemd-resolved[330132]: Grace period over, resuming full feature set (UDP+EDNS0) for DNS server 202.106.195.68.
Jun 22 09:19:08 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 202.106.195.68.
Jun 22 10:33:23 node2 systemd-resolved[330132]: Using degraded feature set UDP instead of UDP+EDNS0 for DNS server 2408:8000:1010:1::8.

4. 查找服务配置文件.

开启两个终端,一个终端执行监视,一个重启systemd-resolved服务。
fswatch 监视 /etc/systemd 目录, -t 是打印时间, -x 是打印事件

user@node2:~$ fswatch -t -x /etc/systemd

然后执行 停止,启动 systemd-resolved 服务

user@node2:~$ sudo systemctl stop systemd-resolved
[sudo] password for user:
user@node2:~$ sudo systemctl start systemd-resolved

监视到如下事件:

user@node2:~$ fswatch -t -x /etc/systemd
Sat 22 Jun 2024 01:03:41 PM CST /etc/systemd IsDir
Sat 22 Jun 2024 01:03:41 PM CST /etc/systemd PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific
Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific

Sat 22 Jun 2024 01:03:42 PM CST /etc/systemd/resolved.conf PlatformSpecific说明它访问了 /etc/systemd/resolved.conf 文件, 这也仅仅表示打开服务会访问这个文件,
通过查找网络资源, 确认还是要手工修改/etc/systemd/resolved.conf 这个文件

5. 编辑服务配置文件 /etc/systemd/resolved.conf

打开这个文件, 看到是一个空文件, 由若干行但都被# 号注释着, 把第一行DNS 的注释号去掉,
写成:

DNS=8.8.8.8

这个文件改动后,重启服务:

systemctl restart systemd-resolved
systemctl enable systemd-resolved

开机会依照它重新生成 /run/systemd/resolve/resolv.conf 文件

  1. 验证
    重启机器,看到/run/systemd/resolve 目录下新生成的文件
user@node2:~$ ll /run/systemd/resolve
total 8
drwxr-xr-x  2 systemd-resolve systemd-resolve 120 Jun 22 13:21 ./
drwxr-xr-x 24 root            root            620 Jun 22 13:21 ../
srw-rw-rw-  1 systemd-resolve systemd-resolve   0 Jun 22 13:21 io.systemd.Resolve=
srw-------  1 systemd-resolve systemd-resolve   0 Jun 22 13:21 io.systemd.Resolve.Monitor=
-rw-r--r--  1 systemd-resolve systemd-resolve 969 Jun 22 13:21 resolv.conf
-rw-r--r--  1 systemd-resolve systemd-resolve 920 Jun 22 09:18 stub-resolv.conf

查看内容: stub-resolv.conf 没有改变

resolv.conf 内容已经添加了:

nameserver 8.8.8.8

6. 结论: 其实只要一步修改

修改 /etc/systemd/resolved.conf, 添加DNS=8.8.8.8
验证: 开机后,ping baidu.com 可以ping 通

7. 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

systemd-resolvedsystemd 的一个组件,负责管理和缓存 DNS 解析请求。它提供了一个本地的 DNS 服务器,监听在 127.0.0.53 上,通过它可以代理和缓存 DNS 查询。


补充: centos7 下也有/etc/resolv.conf 被重置问题. 解决方法


1. 查看 /etc/resolv.conf 文件

$ cat /etc/resolv.conf
# Generated by NetworkManager

可见它是由NetworkManager 来生成的.

$ systemctl status |grep -i network
发现
      ├─NetworkManager.service
             │ └─954 /usr/sbin/NetworkManager --no-daemon

2. 编辑NetworkManager 的配置文件

vim /etc/NetworkManager/NetworkManager.conf
[main]下添加dns=8.8.8.8, 如下示例

[main]
dns=8.8.8.8

3. 重启网络服务验证.

$ systemctl restart NetworkManager.service
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8

发现 /etc/resolv.conf 已经添加了 nameserver ,问题解决!

参考资料:
https://blog.csdn.net/hejinjing_tom_com/article/details/134310580

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值