始终将每个链接路由域附加到 NetworkManager 以供 systemd-resolved 使用

始终将每个链接路由域附加到 NetworkManager 以供 systemd-resolved 使用

我正在使用具有路由域的全局 DNS 服务器~.来确保 DNS 查询不会被泄露:

# cat /etc/systemd/resolved.conf.d/dns.conf
[Resolve]
DNS=1.2.3.4#example.org
DNSOverTLS=yes
Domains=~.

由于我使用的是 NetworkManager 而不是 systemd-networkd,因此我还使用此配置默认禁用所有链接的 DNS-over-TLS:

# cat /etc/NetworkManager/conf.d/dns.conf
[connection]
connection.dns-over-tls=0

如果每个链接搜索域都存在,则该域的 DNS 查询将由本地 DNS 服务器解析,如下所示:

# resolvectl
Global
         Protocols: LLMNR=resolve -mDNS +DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub
Current DNS Server: 1.2.3.4#example.org
       DNS Servers: 1.2.3.4#example.org
        DNS Domain: ~.

Link 3 (wlo1)
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.1.1
       DNS Servers: 192.168.1.1
        DNS Domain: local

# resolvectl query device.local
device.local: 192.168.1.2                  -- link: wlo1

-- Information acquired via protocol DNS in 31.6ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

如果我手动将路由域附加到resolvectl domain wlo1 local ~detectportal.firefox.com,它也适用于附加域。我试图实现的是自动执行此过程,而不会丢失从 DHCP 服务器收到的搜索域。我想对所有 WiFi 连接执行此操作,包括我从未连接过的连接。原因是我想允许 Firefox 使用本地 DNS 服务器检测门户。

我还没有创建过这样的东西,它应该可以与 systemd-networkd 一起使用,但如果不使用 systemd-networkd,它似乎会被 systemd-resolved 忽略:

# cat /etc/systemd/network/dns.conf
[Match]
Name=wlo1

[Network]
Domains=~detectportal.firefox.com

更不用说这将取代搜索域,而不是附加路由域。

自从我发布了这个问题,我就有了自己的想法解决方案. 有没有更好的方法来实现这一点?

答案1

这是我能想到的最好的办法:

#!/bin/bash

set -euo pipefail
IFS=$'\n\t'

if [[ $1 != wl* || ! $2 =~ dhcp[46]-change ]]; then
    exit 0
fi

link="$(/usr/sbin/ip link show dev "$1")"
link="${link%%:*}"
domains=(detectportal.firefox.com true)
domains+=($(/usr/bin/busctl --json=short get-property org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager Domains | /usr/bin/jq --argjson link "$link" --raw-output '.data[] | select(.[0] == $link) | .[1], .[2]'))
/usr/bin/busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDomains 'ia(sb)' "$link" "$((${#domains[@]}/2))" "${domains[@]}"

这应该放在/etc/NetworkManager/dispatcher.d/

相关内容