ubuntu linux DNS 系统流程逻辑

Chat Conversation

Note: This is purely the output of the chat conversation and does not contain any raw data, codebase snippets, etc. used to generate the output.

User Input

ssh 10.42.0.1 nvidia nvidia nvidia

用户密码以及sudo都是一样的

ssh检查dns的相关的进程有哪些? 我需要学习dns的整个系统的架构的流程。学会自己自己设计。还有这些dns相关进程对应的配置文件。然后给我解读它们的配置文件。

最后给我说说链路是如何的!

我配置的dns 以及ISP 分配的DNS

还有我如何看到实时的使用的dns的是哪个的服务。为什么是选择的它等等。

你可以通过ssh任意操作,来完成我需要的需求,甚至是潜在的我没有说的需求,越全越好

User Input

Continue

User accepted the command sshpass -p nvidia ssh -o StrictHostKeyChecking=no nvidia@10.42.0.1 "uname -a; cat /etc/os-release"

User accepted the command sshpass -p nvidia ssh -o StrictHostKeyChecking=no nvidia@10.42.0.1 "echo nvidia | sudo -S systemctl status systemd-resolved; ls -l /etc/resolv.conf; cat /etc/resolv.conf; echo nvidia | sudo -S ss -tulpn | grep ':53 '"

User accepted the command sshpass -p nvidia ssh -o StrictHostKeyChecking=no nvidia@10.42.0.1 "ps -f -p 2840"

User accepted the command sshpass -p nvidia ssh -o StrictHostKeyChecking=no nvidia@10.42.0.1 "resolvectl status; nmcli dev show"

Planner Response

根据你在SSH机器 10.42.0.1 上的实际运行情况,我已经深入检查了系统的网络和DNS架构。

下面为你系统性地梳理这台 Ubuntu机器(以及一般 Linux 中)的 DNS 架构流程、进程、配置文件 ,以及 链路流向和如何实时探测

1. SSH检查到的 DNS 相关进程有哪些?

通过 ss -tulpnps 的排查,你的机器上目前有两个主要的 DNS 相关服务在运行:

  • systemd-resolved (PID: 332)
    • 监听地址 : 127.0.0.53:53
    • 作用: Ubuntu 系统默认的本地 DNS 解析和缓存守护进程。它负责拦截本机上所有应用程序发起的 DNS 查询,并将这些请求转发给真正配置的上游或 ISP 提供的 DNS 服务器。
  • dnsmasq (PID: 2840)
    • 监听地址 : 10.42.0.1:53
    • 启动方式 : 由 NetworkManager 拉起,用于网络共享(例如你可能开了一个名为 ROS_Hotspot_Ailook_0000 的 WiFi 热点)。
    • 作用 : 给连入这个热点(wlan0,IP为 10.42.0.1)的外部设备(如你的电脑、手机)提供 DHCP 分配和 DNS 代理服务。

2. DNS 整个系统的架构流程与配置文件设计

在现代 Ubuntu (Systemd) 中,DNS 架构设计类似于一个多级代理池。如果你要自己设计或修改,它的整体串联流程如下:

核心链路架构
  1. APP 发出请求 :应用程序(比如 ping baidu.com)调用标准的 GNU C Library (glibc) 的函数 gethostbyname()
  2. 第一级代理(基础路由)glibc 会去读取配置文件 /etc/resolv.conf 。在这个机器上,里面只写了一行 nameserver 127.0.0.53
  3. 第二级代理(DNS 缓存与智能路由) :请求被发给了本地的 systemd-resolved 进程(即 127.0.0.53)。这个进程充当一个"智能DNS路由器"。
  4. 第三级代理(上游出口)systemd-resolved 会根据各个网卡的路由优先级,决定把 DNS 查询发给哪个上游 DNS 服务器(如你的 4G模块或宽带光猫 分配的 DNS)。

对于 热点下挂的外部设备 ,流程是:
手机 ➡️ 请求 10.42.0.1:53 (dnsmasq) ➡️ 转发给系统的 127.0.0.53 (systemd-resolved) ➡️ 外部真实 DNS 服务器。

对应的配置文件解读
  • /etc/resolv.conf
    解读 :它是 glibc 唯一认准的门面。在你这台机器上,它是一个符号链接,指向 ../run/resolvconf/resolv.conf。现代 Linux 强烈不建议手动改这个文件,因为每次重启网络都会被 systemd-resolvedNetworkManager 重新覆盖为 127.0.0.53

  • /etc/systemd/resolved.conf
    解读 :这是 systemd-resolved 的全局配置文件。在这里你可以手动配置全局 Fallback DNS(比如 DNS=8.8.8.8114.114.114.114)。自己做设计时,通过修改此文件并重启 systemctl restart systemd-resolved 可以硬性干预本机的解析。

  • /run/systemd/resolve/resolv.conf
    解读 :如果某个古老的程序不支持 127.0.0.53 这种存根模式,你可以把 /etc/resolv.conf 软链接到本文件。这个文件里记录了 真实的物理DNS地址(直接绕过本地缓存)。


3. DNS 链路是如何处理"我配置的"和"ISP 分配的"?

在你的设备上,负责获取 ISP DNS 的大哥是 NetworkManager 。它通过 DHCP/4G 拨号获取到基站或路由器分配的 DNS,并将这个动态 DNS 通过 D-Bus 接口"塞入"给 systemd-resolved

我检查了你的链路网络接口,当前的核心接口配置如下:

  • usb0 (连接到外网的模块/网卡)
    它配置了 DefaultRoute=yes。ISP 给它分配了中国电信的 IPv6 DNS 服务器 (240e:5a::6666, 240e:5b::6666)。
  • eth0, wlan0 等局域网接口
    并没有接管默认的全局路由。

决断逻辑(为什么最终选了 ISP 的 DNS):
systemd-resolved 会收集所有网卡的 DNS,但并不是随便乱发。因为 usb0 具有 DefaultRoute: yes 属性,systemd-resolved 就把全局域名解析指向了挂在 usb0 上的 240e:5a::6666。这就是 ISP 动态分配给你的,所以你没有手动配置,机器也能正常上网。

如果你自己改了配置文件:

如果你在 /etc/systemd/resolved.conf 或网卡的静态配置里写了全局的 DNS=223.5.5.5,由于用户配置优先级高于 DHCP 动态下发的配置,systemd-resolved 会首先使用配置的阿里 DNS。只有在设定的 DNS 超时或错误时,才会回退 (Fallback) 到 ISP 的 DNS。


4. 如何查看实时使用的 DNS 以及为什么选它?

你可以使用系统自带的一些强悍工具来进行深度排查和观测,而不需要盲目抓包:

工具1:查看当前活动的真实 DNS 服务器到底落在哪谁手里

执行:

bash 复制代码
resolvectl status

看什么?

看带 Current DNS Server: 的那一行。在刚才的排查中,输出显示:

text 复制代码
Link 5 (usb0)
Current DNS Server: 240e:5a::6666

这直接告诉你,当前这一秒钟,系统选择走 usb0240e (电信IPv6) 服务器帮你解析。它被选中的原因是该链路处于 DefaultRoute,网络管理器评估这条路是通向公网的主出口。

工具2:如何实时追踪并且定位走哪条路

执行查询命令(自带路由追踪属性):

bash 复制代码
resolvectl query baidu.com

输出效果 :它会直接告诉你,查找 baidu.com 花费了多少毫秒,并明确打印出类似 Server: 240e:5a::6666Link: usb0。它通过探测各网卡的路由表 Cost,谁的代价最小、哪条路指向公网,就分发给谁。

工具3:如何监控 DNS 服务器的掉线、降级与切换实况?

执行查看实时日志:

bash 复制代码
sudo journalctl -u systemd-resolved -f

你能看到什么?

这也是我在后台看到的。你的机器日志里有类似这样的输出:

Using degraded feature set (UDP) for DNS server 240e:5a::6666.
Grace period over, resuming full feature set (UDP+EDNS0) ...

这说明系统的 DNS 进程在后台默默帮你做很多事:当测试到某个 DNS 不稳定(比如不支持新型的 EDNS 扩展协议),它会自动降级 到最原始的 UDP 53端口协议,如果该服务器彻底罢工,你就会在日志里看到它实时切换到备用的 240e:5b::6666 或者回退到本地配置的服务器。

总结

  1. 本机应用 查 DNS:走 127.0.0.53 缓存代理 ➡️ 上送 ISP 的 240e... 宽带 DNS。
  2. 连接该设备热点的手机 查 DNS:走 10.42.0.1 (dnsmasq) ➡️ 交给宿主机缓存 ➡️ 上送 ISP DNS。
  3. 如果你想彻底接管 全局网络解析(覆盖掉ISP自带的恶心人且可能存在劫持的DNS),请直接修改 /etc/systemd/resolved.conf 并取消 #DNS= 前面的注释,将其改为你信任的地址(比如 119.29.29.29),然后执行 sudo systemctl restart systemd-resolved

User Input

直接这样说不可以的麻? 系统的相关进程是哪些? 它们的对应的配置文件是什么?有哪些配置的文件以及对应的目录

然后说/etc/hosts 的文件 以及/etc/resolvf.conf 的,如果它们不是对应的进程的配置情况。

最后再 说它们的链路。你说的都不全 ssh有一些东西又没有查询,给的太局限了

User accepted the command sshpass -p nvidia ssh -o StrictHostKeyChecking=no nvidia@10.42.0.1 "cat /etc/nsswitch.conf | grep hosts"

User accepted the command sshpass -p nvidia ssh -o StrictHostKeyChecking=no nvidia@10.42.0.1 "ls -la /etc/NetworkManager/conf.d; cat /etc/NetworkManager/NetworkManager.conf"

Planner Response

好的,没问题。为了让你能自己架构和设计,我不再说那些多余的话,直接把所有相关的进程、它们的根配置文件以及它们完整的调用链路剥洋葱般给你梳理清楚。


一、 系统的相关 DNS 进程及配置文件分布

在你的 Ubuntu (Systemd) 架构中,涉及 DNS 解析的活动进程主要有三个,它们分别负责不同的管区。

1. systemd-resolved 进程 (本机的核心 DNS 总管)
  • 作用 :Ubuntu 本机系统级的全局 DNS 缓存和路由守护进程。它对内监听 127.0.0.53,所有本机的程序发出的解析请求,最终都交给它来处理。系统从网卡 DHCP 获取的上游 DNS 也是动态喂给它。
  • 配置与目录
    • /etc/systemd/resolved.conf :其主配置文件。如果你要强行规定全局备用 DNS(比如写死阿里 DNS、腾讯 DNS)、开启/关闭 DNSSEC,就在这个文件里写。
    • /etc/systemd/resolved.conf.d/ :其扩展配置目录,可以在这里放自定义的 .conf 局部覆盖规则。
    • /run/systemd/resolve/ :运行时目录(极其重要,排错必看 )。这个目录是它动态生成的,记录了真实生效的状态。
      • /run/systemd/resolve/stub-resolv.conf:包含 nameserver 127.0.0.53(本机的 resolv.conf 通常就是软链指向这个文件)。
      • /run/systemd/resolve/resolv.conf:这里面记录了它当前代理的真实的物理上游 DNS 地址 (如你的 ISP 地址),可以直接 cat 查看。
2. NetworkManager 进程 (网络连接掌控者)
  • 作用 :负责底层网卡的拨号、插拔、DHCP。如果是动态上网,它会从 ISP 获取 DNS 并且通过 D-Bus 接口"灌给" systemd-resolved 进程。
  • 配置与目录
    • /etc/NetworkManager/NetworkManager.conf :其主全局配置文件 。可以里面设定网络管理策略,比如在这写 dns=none 来阻止它去强行覆写本机 DNS。
    • /etc/NetworkManager/conf.d/:其扩展配置存放目录。
    • /etc/NetworkManager/system-connections/重中之重 !保存每个网卡(比如 WIFI 热点、eth0)的单独配置文件(后缀通常为 .nmconnection )。在这个里面可以把某个网卡的 DNS 设定为静态固定。
3. dnsmasq 进程 (局域网热点 / 桥接的轻量代理)
  • 作用 :你机器上额外存在的进程。它不是用来给本机上网解析的,它只绑定在你的 10.42.0.1 接口,仅仅是为了给连接你这个热点的外部设备(比如手机、其他电脑)提供 DHCP 分配和 DNS 转发。
  • 配置与目录
    • 这个进程是被 NetworkManager 在开 WiFi 热点时"临时拉起"的隔离进程进程,自带了启动参数,所以它没有用系统默认的 /etc/dnsmasq.conf
    • 它加载的专用附加配置目录通常在:/etc/NetworkManager/dnsmasq-shared.d/ (如果你想给热点下发自定义 DNS 劫持规则,可以放在这个目录)。

二、 /etc/hosts/etc/resolv.conf 的真实定位

这两个文件并不是某个后台进程自己独属的配置文件,它们是给所有上层应用程序的底层运行库 (glibc) 提供的统一公共入口标准 API。在 Linux 中只要你想发包,底线必须得读它们。

1. /etc/hosts ------ 无进程归属,强制静态本地映射
  • 作用:本地静态域名解析表。这个文件被存放在硬盘上,不需要通过发起网络包去查。
  • 关联机制 :当我们查找域名时,系统底层的一个核心裁决者文件是 /etc/nsswitch.conf (名称服务切换开关,Name Service Switch),这里面写着 hosts: files dns,意思是永远先看本地 files(即 /etc/hosts ,如果找不到,再发起 dns 网络查询!
  • 用法场景 :最高解析优先级。如果你在这里面写了 127.0.0.1 www.baidu.com,那么 baidu 就会马上指向本地,后续整个 DNS 链路哪怕通畅,也被这个文件短路拦截了。
2. /etc/resolv.conf ------ 系统通用 DNS 标准入口(现已变成受控软链)
  • 作用 :告诉所有应用程序,应该去找哪个 IP 查 DNS。传统的 Linux 我们直接在里面写 nameserver 114.114.114.114
  • 关联机制 :在你的 Ubuntu 中,它也不再是一个实体的静态文件了 。它现在其实是一个指向 /run/resolvconf/resolv.conf 或者 /run/systemd/resolve/stub-resolv.conf软链接
  • 为什么它只显示 127.0.0.53 :因为 systemd-resolved 进程接管了你的系统,它强制覆写了这个软链,把地址霸占成了自己(127.0.0.53),强制要求全系统:"所有的程序,不要自己直接去外面查外网,必须统统发给我这个 127.0.0.53 进程,我来帮你们查。"

三、 DNS 最完整的全链路流向架构(从 APP 到基站 ISP)

现在连线,把上面的珍珠串起来。假如你在终端跑了一个 ping baidu.com,链路如下:

链路阶段 1:库的判断器截获(不涉网)
  1. ping 程序调用底层 glibc 库 gethostbyname() / getaddrinfo()
  2. glibc 去读 /etc/nsswitch.conf ,看到策略要先找 files
  3. glibc 去试图检索 /etc/hosts 。没发现有写 baidu.com 这个记录,于是进入 dns 协议阶段。
链路阶段 2:发送至本机代理层(本机内部回环网)
  1. glibc 去读取唯一的标准 API /etc/resolv.conf ,发现了唯一的地址:nameserver 127.0.0.53
  2. glibc 将解析请求打包给本地回环地址 127.0.0.53:53
  3. 本机的 systemd-resolved 进程接到了这个请求包,先看下自己内存有没有昨天查过还没过期的缓存,没有缓存则继续往下一层丢。
链路阶段 3:路由决策层查出路并送往广域网(实体外网)
  1. NetworkManager 曾经通知过 systemd-resolved 现在的网卡状况。因为你的 USB0 4G网卡模块拨通了 ISP,且处于 Default Route(默认全局路由),拿到了 ISP 大网发给你的外部 DNS ( 240e:5a::6666 )。
  2. systemd-resolved 根据网卡优先级断定,走 USB0 这个接口出去,并将 DNS 请求真实发送给中国电信的 240e:5a::6666 DNS 服务器。
链路阶段 4:回传
  1. ISP 服务器返回真实的外网 IP。
  2. systemd-resolved 收到后先留在自己的缓存里建档,然后通过本机的 udp 127.0.0.53:53 把 IP 丢回给一直就在等结果的 ping 程序的 glibc 库。
  3. ping 程序顺利得到 IP,发起外网 ICMP 请求。

(附加线)如果外部下挂终端通过你接入:

如果手机连入你热点 10.42.0.1 它查询百度的链路是:

手机APP -> 手机的 /etc/resolv.conf (一般是10.42.0.1) -> 丢给你的 10.42.0.1 (dnsmasq 进程) -> dnsmasq 然后拿着请求作为你本机程序发起 gethostbyname,再继续上面的【1 -> 11】所有链路。它就像在你本机原有的套娃外头,再套了一层子网代理。

相关推荐
一个有温度的技术博主4 分钟前
网安实验系列七:域名收集
linux·运维·服务器
我爱学习好爱好爱7 分钟前
Ansible 环境搭建
linux·运维·ansible
人工智能训练43 分钟前
从 1.1.3 到 1.13.2!Ubuntu 24.04 上 Dify 升级保姆级教程(零数据丢失 + 一键迁移)
linux·运维·人工智能·windows·ubuntu·dify
袖手蹲1 小时前
Arduino UNO Q 板载 Nanobot 自动化编程指南之七
运维·人工智能·自动化
我要成为嵌入式大佬1 小时前
正点原子MP157--问题详解--四(关于根文件系统驱动模块指令的注意事项)
linux·运维·服务器
feng68_1 小时前
Redis架构实践
linux·运维·redis·架构·bootstrap
欧云服务器1 小时前
宝塔计划任务怎么自动删除多少个以外的文件?
linux·运维·服务器
吴声子夜歌1 小时前
TypeScript——模块解析
javascript·ubuntu·typescript
淼淼爱喝水1 小时前
openEuler 系统下 Ansible 一键安装教程(保姆级)
运维·ansible·openeuler
XXOOXRT1 小时前
零基础掌握Linux常用命令
linux·运维·服务器