解析

解析

设置:

一个 debian jessie 设备通过 ppp 连接到互联网

我们使用 systemd-networking,根本不使用 /etc/network/interface。

systemd-resolved 用于 DNS。

版本:

systemctl --version
systemd 230
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
armv7l GNU/Linux
kernel 4.4.14-v7+

(版本是来自 jessie-backports 的版本)

这对于以太网 + W-Lan 工作正常,但对于 ppp 则失败。

原因:自定义连接脚本

0000usepeerdns 000resolvconf

仍在写入 /etc/resolv.conf,而不是连接到 systemd-resolved 提供的 dbus 服务器。

所以我试图让 PPP 接口进行 DNS 解析,这应该可以通过我读到的内容通过 DBUS 调用 SetLinkDNS 来实现(链接在最后)

获取接口 ID(在我们的例子中为 5)

ip l
..
5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 700 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 3                                                         
link/ppp    
..

读取链路接口5当前状态

busctl introspect org.freedesktop.resolve1 /org/freedesktop/resolve1/link/_35 |grep DNS 
.DNS                                property  a(iay)    0                 -

在接口 5 上使用 1 个 IPV4 地址设置 DNS(以 google DNS 为例)(第三个整数的解释是什么?)

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 5 1 2 4 8 8 8 8
Link ppp0 is managed.

读出值,仍然为空,因此无法插入这些值。

busctl introspect org.freedesktop.resolve1 /org/freedesktop/resolve1/link/_35 |grep DNS 
.DNS                                property  a(iay)    0  

那么我该如何进一步调试才能最终使其正常工作呢?

回退到 /etc/network/interfaces 或“正常”/etc/resolv.conf 不是一个选项。

我使用的资源(还有更多,但这些是相关的):

systemd Github 问题跟踪器

freedesktop wiki 网络管理器

乔纳森尼奥 VPN DNS 问题跟踪器

来自 jonathanio 的 VPN DNS 更改脚本

答案1

发生此问题是因为网络已经由 systemd 管理。

在相应的 /etc/systemd/network/ 文件中禁用 systemd-resolved 的管理。

重新加载并重新启动守护进程 systemctl daemon-reload systemctl restart systemd-resolved 使错误消息Link ppp0 is managed消失。

我通过阅读更多内容、在 freenode #systemd irc 频道提问、在那里获取一些指针帮助以及阅读源代码找到了答案。

以下将接口 5 上的 DNS 设置为 google DNS

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 5 1 2 4 8 8 8 8

答案2

抛开旧的已修复错误不谈,如果你碰巧正在使用,今天使用/systemd-resolved.service更容易(在我正在测试的系统上,这两个实际上是不同名称下的相同可执行文件)。该方法仍然有效,尽管语法有点难记住,尤其是对于多个 DNS 服务器。resolvectlsystemd-resolvebusctl

下面的示例假设8.8.8.8作为唯一的 DNS 服务器或8.8.8.8 8.8.4.4。正在设置的设备也被假定为ppp0

解析

我发现这是今天最简单的:

resolvectl dns ppp0 8.8.8.8 8.8.4.4

查看状态:

resolvectl status

systemd 解析

我还没找到如何分配DNS 服务器地址使用 systemd-resolve,尽管我怀疑它会很简单:

systemd-resolve --interface=ppp0 --set-dns=8.8.8.8

要查看状态(请注意输出与resolvectl的输出如何相同):

systemd-resolve --status

总线控制

具有一台 DNS 服务器的 Busctl:

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' $(ip link show dev tun0 | sed 's/:.*//') 1 2 4 8 8 8 8

SetLinkDNS后面字段的语法是“signature” 'ia(iay)',“device id” 7(我这次有7个,你得到的id会有所不同),“DNS服务器数量” 1,IPv4地址似乎需要接下来的两个参数是24,最后是 IP 的四个八位字节:8 8 8 8。因此,对于两个 DNS 服务器,您将使用:

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' $(ip link show dev tun0 | sed 's/:.*//') 2 2 4 8 8 8 8 2 4 8 8 4 4

您可以通过以下方式获取有关方法/签名的更多信息:

busctl introspect org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager

要获取当前 DNS 状态:

busctl get-property org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager DNS

可能有一种更直接的方法来获取设备 ID /proc/net;但ip link ... | sed ...我首先想到的是。

相关内容