隔壁老哥有需求,折腾了一下午把 systemd-resolved 重新折腾了一遍

2021-02-23 19:16:37 +08:00
 fiveelementgid

问题需求参考老哥的帖子: https://v2ex.com/t/755417

先上成果图 @lizenghui 需求在于走自建 DNS,但是无法理解 NetworkManager 与 systemd-resolved 的关系

梳理了一下(不知道对不对,有错误请踹我):NetworkManager 管理整个网络,systemd-resolved.service 本质上只提供了一个 DNS 服务器(IP:127.0.0.53),NetworkManager 所需要做的只是把 DNS request 交付给 systemd-resolved.service 的 DNS 服务器进行处理

但是对于系统 DNS 工具来说,这个 DNS 服务器(127.0.0.53)是一个黑箱,因此查询的结果只能看到一个 DNS 服务器:

原帖里面老哥采用绕过这个 DNS 服务器,直接用 @指定外部 DNS 服务器会让整个 service 无用

因此正确的处理方案应该是进去 127.0.0.53 内部查看,用 resolvectl(就第一个图)

上面的 Global 段的 DNS 服务器很好改,直接改 /etc/systemd/resolved.conf

但是这个实际上并没有用,因为 .~ 代表匹配的域名

我们可以看到 Global 和 wifi 的 wlp3s0 都有.~

意思是任何域名都会往这两个 field 的所有 DNS 服务器同时发送查询(这就是 split DNS 的 concurrency 优势,被引入的原因),因为 ISP 提供的 10.0.0.1 肯定比 cf 的 1.1.1.1 快,所以肯定会用 ISP 的,这样设置 DNS 会实效

但是实际上你可以学我之前配置的(我之前也没想明白怎么消除 wlp3s0 的),一个一个手动自己加,例如 google.com ,用 wireshark 抓包可以证🉐此时不会向 wlp3s0 的 DNS(就 10.0.0.1)发送 DNS 包查询

但是这种方法很 nt,因为不可能把所有常用的网站列上去

所以最好的解决方案应该是 把 wlp3s0 自动分配的 DNS 消除掉

思路回到最上面,resolved 的 DNS 服务只是单纯接受从 NetworkManager 处接受的 DNS 设置,因此要在 NetworkManager 这一级管理的 Network 动心思

旧版本的配置文件位于:

/etc/sysconfig/network-scripts/

参考配置信息是: man nm-settings-ifcfg-rh

新版本的配置文件位于:

/etc/NetworkManager/system-connections/

参考的配置信息为:man nm-settings

要达到老哥的需求,应该是两个方面: 1.去除 ISP 自带的 DNS 2.添加自己的 DNS

对应上面两点加两条两个指令配置

[完]

3738 次点击
所在节点    程序员
12 条回复
fiveelementgid
2021-02-23 19:18:26 +08:00
@lizenghui 为啥 @不到人
lizenghui
2021-02-23 20:33:03 +08:00
@fiveelementgid 认真拜读了您的文章,真的非常感谢,百忙之中还在研究这个问题。
其实我之前也尝试了 /etc/systemd/resolved.conf 改这个 但是确实像您所说不可能每个域名都加一遍;

后面这种 改 networkmanager 对应连接配置这种也试了,在插有线网是 OK 的。拨了网线 使用 wifi 就会导致无法上网。因为自定义的 DNS:192.168.1.1 无法连接,因为我目前的有线网和 wifi 是两个完全独立的网络。。。(不喷我啊,实际情况)

我下午写了一个临时脚本来解决:
1 、脚本监测有线网状态
2 、如果是有线网连接状态,用 iptables 将本机所有访问 53 端口的 udp 连接重定向到 192.168.1.1
3 、如果是有线网断开的状态,将 iptables 重定向部分去掉

暂时能用,感觉很不优雅。。。
lizenghui
2021-02-23 20:36:43 +08:00
@fiveelementgid 咱可以加个电报,以后方便交流,有点找到伙伴的感觉,身边还真没人能聊这些奇葩的网络问题。
我的电报同名 @ lizenghui
fiveelementgid
2021-02-23 21:34:45 +08:00
“因为我目前的有线网和 wifi 是两个完全独立的网络”
那样的话方案确实不太行,那就只能写脚本了
忙倒是不忙,大学本科在读,准备回学校了,失业人员找实习中
这些网络问题算是很冷门的了,不过我也不是主要做这个的
电报好友+1
yanqiyu
2021-02-23 22:19:45 +08:00
有一点想要提到的,其实 systemd-resolved 提供的 127.0.0.53 只是一个 failback,默认情况下解析会通过 glibc 的 nss 扩展借助 dbus 完成解析。那个 127.0.0.53 一般是给 golang 程序那些 nss 管不到的程序做解析的。不过在 Ubuntu 上那个 nss 模块默认没开,于是修改 resolved.conf 可能有效果,在 Fedora 上可能对于大部分程序就会不好使了。

systemd-resolved 获得上游 DNS 配置的方法有很多,默认情况下会从 network manager,比如 systemd-networkd 或者 NetworkManager 取得。但是也可以手动配置,确实通过 network manager 层面配置更可靠

至于 #2 提到的,要不试试 FallbackDNS 配置,我建议的配置是
1. 有线网通过 NM 设置 DNS
2. 无线网通过 NM 禁用 DNS
3. 设置 FallbackDNS,在有线网断开的时候 resolved 没有 DNS 配置就会使用 FallbackDNS
fiveelementgid
2021-02-23 22:57:14 +08:00
@yanqiyu 不用 Ubuntu 好多年,systemd-resolved 127.0.0.53 里面的 DNS 服务器的 Global 的也有 fallback 备用 DNS 服务器。Fedora 平台用的 nss-resolv 替换了 nss-dns
https://fedoraproject.org/wiki/Changes/systemd-resolved#Summary

>Ubuntu does not use nss-resolve. Instead, Ubuntu uses the traditional nss-dns provided by glibc upstream, so glibc on Ubuntu continues to read /etc/resolv.conf, as is traditional.

确实 Ubuntu 还可以读 resolv.conf 有效果,NetworkManager 就是上游获取,不过 systemd-networkd 现在基本都是默认关闭了无法使用。你和楼上的老哥说的做法我想了一下,是可行的,但是是应该要修改 systemd-resolved.service 的这个文件

`/etc/systemd/resolved.conf`
jim9606
2021-02-23 23:18:32 +08:00
systemd-resolved 的作用是替换掉 glibc nss,前者支持一些新特性,例如 DoT,同时前者集成 LLMNR 、DNSSEC 、mDNS 等后者需要用插件实现的功能,可以使用 CLI 提供 API 风格查询,也可以通过 stub resolver 127.0.0.1:53 支持。

NetworkManager 本职是网络配置 DHCP 客户端、Wifi 加密、解析服务均依赖外部程序,功能对标的是 systemd-networkd,前者对无线网络支持更完善,后者集成 DHCP 客户端,支持通过 MAC 和驱动名匹配网卡,支持 bond 、bridge 、静态路由等配置,适合服务器使用。目前 Ubuntu Desktop 默认前者,Server 默认后者。

networkd 的配置是 /etc/systemd/network/*.network 及 /etc/systemd/networkd.conf,CLI 为 networkctl 。

resolved 的配置是 /etc/systemd/resolved.conf 及 networkd 配置文件内的 [DNS]小节,CLI 为 resolvectl 。
fiveelementgid
2021-02-23 23:36:56 +08:00
@jim9606 我在上一楼说了....systemd-networkd 在 Fedora 默认是关闭的

```
[GKD@fedora systemd-resolved]$ sudo systemctl status systemd-networkd
● systemd-networkd.service - Network Service
Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd-networkd.service(8)
```
hanguofu
2021-02-24 02:31:03 +08:00
顺便问问 : 怎样才能在不修改路由器的设置的前提下, 在局域网内输入自定义的域名 就可以访问自己在 局域网内的设备 ?
defunct9
2021-02-24 06:23:59 +08:00
@hanguofu dnsmasq 劫持吧
lizenghui
2021-02-24 09:02:41 +08:00
@yanqiyu
方案确实可行! V2EX 果然万能!

@jim9606
多谢,学到了。

@hanguofu
像我一样自建一个 DNS
fiveelementgid
2021-02-24 13:53:24 +08:00
@hanguofu 两个方案:
1.改 hosts 文件,hard code,不过需要局域网内的设备的 ip 固定
2.局域网内设备 ip 不固定的话,可能需要 DNS 。
其他更多方案你可以考虑从更下一层 arp 层级直接进行 Mac 绑定(话说路由器可以根据设备 Mac 值直接绑定固定 ip 吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/755586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX