V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fiveelementgid
V2EX  ›  程序员

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

  •  
  •   fiveelementgid · 8 天前 · 1708 次点击

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

    先上成果图 Screenshot from 2021-02-23 18-32-43.png @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 服务器:

    Screenshot from 2021-02-23 18-41-29.png

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

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

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

    Screenshot from 2021-02-23 18-47-48.png

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

    Screenshot from 2021-02-23 18-50-41.png

    我们可以看到 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

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

    Screenshot from 2021-02-23 19-13-50.png

    Screenshot from 2021-02-23 19-15-42.png

    [完]

    第 1 条附言  ·  8 天前
    补充以下,如果需要自定义多个 DNS,用分号(;)间隔
    dns=1.1.1.1;208.67.222.222;8.8.4.4;
    12 条回复    2021-02-24 13:53:24 +08:00
    fiveelementgid
        1
    fiveelementgid   8 天前
    @lizenghui 为啥 @不到人
    lizenghui
        2
    lizenghui   8 天前
    @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
        3
    lizenghui   8 天前
    @fiveelementgid 咱可以加个电报,以后方便交流,有点找到伙伴的感觉,身边还真没人能聊这些奇葩的网络问题。
    我的电报同名 @ lizenghui
    fiveelementgid
        4
    fiveelementgid   8 天前
    “因为我目前的有线网和 wifi 是两个完全独立的网络”
    那样的话方案确实不太行,那就只能写脚本了
    忙倒是不忙,大学本科在读,准备回学校了,失业人员找实习中
    这些网络问题算是很冷门的了,不过我也不是主要做这个的
    电报好友+1
    yanqiyu
        5
    yanqiyu   8 天前   ❤️ 1
    有一点想要提到的,其实 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
        6
    fiveelementgid   8 天前
    @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
        7
    jim9606   8 天前
    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
        8
    fiveelementgid   8 天前
    @jim9606 我在上一楼说了....systemd-networkd 在 Fedora 默认是关闭的

    ```
    [[email protected] 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
        9
    hanguofu   7 天前
    顺便问问 : 怎样才能在不修改路由器的设置的前提下, 在局域网内输入自定义的域名 就可以访问自己在 局域网内的设备 ?
    defunct9
        10
    defunct9   7 天前 via iPhone
    @hanguofu dnsmasq 劫持吧
    lizenghui
        11
    lizenghui   7 天前
    @yanqiyu
    方案确实可行! V2EX 果然万能!

    @jim9606
    多谢,学到了。

    @hanguofu
    像我一样自建一个 DNS
    fiveelementgid
        12
    fiveelementgid   7 天前 via Android
    @hanguofu 两个方案:
    1.改 hosts 文件,hard code,不过需要局域网内的设备的 ip 固定
    2.局域网内设备 ip 不固定的话,可能需要 DNS 。
    其他更多方案你可以考虑从更下一层 arp 层级直接进行 Mac 绑定(话说路由器可以根据设备 Mac 值直接绑定固定 ip 吧
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1623 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    ♥ Do have faith in what you're doing.