问题需求参考老哥的帖子: 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
对应上面两点加两条两个指令配置
[完]
1
fiveelementgid OP @lizenghui 为啥 @不到人
|
2
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 重定向部分去掉 暂时能用,感觉很不优雅。。。 |
3
lizenghui 2021-02-23 20:36:43 +08:00
@fiveelementgid 咱可以加个电报,以后方便交流,有点找到伙伴的感觉,身边还真没人能聊这些奇葩的网络问题。
我的电报同名 @ lizenghui |
4
fiveelementgid OP “因为我目前的有线网和 wifi 是两个完全独立的网络”
那样的话方案确实不太行,那就只能写脚本了 忙倒是不忙,大学本科在读,准备回学校了,失业人员找实习中 这些网络问题算是很冷门的了,不过我也不是主要做这个的 电报好友+1 |
5
yanqiyu 2021-02-23 22:19:45 +08:00 2
有一点想要提到的,其实 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 |
6
fiveelementgid OP @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` |
7
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 。 |
8
fiveelementgid OP @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) ``` |
9
hanguofu 2021-02-24 02:31:03 +08:00
顺便问问 : 怎样才能在不修改路由器的设置的前提下, 在局域网内输入自定义的域名 就可以访问自己在 局域网内的设备 ?
|
11
lizenghui 2021-02-24 09:02:41 +08:00
|
12
fiveelementgid OP @hanguofu 两个方案:
1.改 hosts 文件,hard code,不过需要局域网内的设备的 ip 固定 2.局域网内设备 ip 不固定的话,可能需要 DNS 。 其他更多方案你可以考虑从更下一层 arp 层级直接进行 Mac 绑定(话说路由器可以根据设备 Mac 值直接绑定固定 ip 吧 |