我正在使用具有路由域的全局 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/
。