设置:
一个 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 不是一个选项。
我使用的资源(还有更多,但这些是相关的):
答案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 服务器。resolvectl
systemd-resolve
busctl
下面的示例假设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地址似乎需要接下来的两个参数是2
和4
,最后是 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 ...
我首先想到的是。