如何为特定网络接口保留“systemd-resolve”配置?

如何为特定网络接口保留“systemd-resolve”配置?

我已经将我的 Ubuntu 桌面升级到 Bionic Beaver,它切换到systemd-resolve。由于这一变化,LXD DNS 解析停止工作。

为了让 LXD 容器可被发现,我可以运行以下命令。注意,IP10.78.38.1lxdbr0桥。

$ sudo systemd-resolve --interface lxdbr0 --set-dns 10.78.38.1 --set-domain lxd

有了这个,我就可以通过名称发现 LXD 容器,配置如下所示。

$ systemd-resolve --status
.
.
.
Link 10 (lxdbr0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.78.38.1
          DNS Domain: lxd
.
.
.

然而,系统重启后,这个配置就消失了。

$ systemd-resolve --status
.
.
.
Link 10 (lxdbr0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
.
.
.

为了使上述内容持久,我审查了systemd-resolve手册页http://manpages.ubuntu.com/manpages/bionic/man8/systemd-resolved.service.8.html。它建议创建一个/etc/systemd/resolved.conf.d/lxd.conf文件,但是没有可用的参数可以让我对某个特定的 NIC 进行特定的配置。

答案1

Systemd-networkd将网络配置存储在(至少)三个目录中,也许更多。与您最相关的一个似乎是:

/etc/systemd/network/ 

(它覆盖另外两个,即/lib/systemd/network/run/systemd/network)。

/etc/systemd/network创建与此类似的文本文件:

[Match]
Name=enp0s4

[Network]
DHCP=yes
DNS=192.168.1.1

文件可以有任意名称,只要以 .network 结尾。我的叫做enp0s4.network。正确获取内容是批判的

有关如何建立桥梁的示例,请从此处阅读:

man systemd.network |grep -A 42 "Example 3"

那里给出的例子加上我的代码片段可以设置:

Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.78.38.1

不确定DNS域的语法是什么,如果可以的话,人页面大约是30页Domain=

笔记:正确的语法Domains=不是DOMAIN=

这是我使用的参考文献:

重新开始systemd-已解决无需重启:

sudo systemctl restart systemd-resolved

仅供参考:有一种方法可以告诉 systemd 让网络管理器处理接口,以及离开它未受管理并使用平面文件配置运行,例如/etc/resolv.conf。但如果我处于你的位置,我会让它按原样工作。

答案2

这会破坏您的lxdbr0但正确的配置systemd-resolved

根据链接的手册页man 8 systemd-resolved.serviceman 5 systemd.network,您必须在以下位置使用每个链接配置/etc/systemd/network文件

与之联系的DNS服务器是从全局设置/etc/systemd/resolved.conf,文件中的每链静态设置/etc/systemd/network/*.network,通过DHCP接收到的每个链接动态设置以及其他系统服务提供的任何DNS服务器信息的确定确定的。

为了使您的配置持久,您必须创建该文件/etc/systemd/network/lxdbr0.network

[Match]
Name=lxdbr0

[Network]
DNS=10.78.38.1
Domains=lxd

答案3

这个问题仍然没有可接受的答案,而且由于我在解析主机上的容器名称时也遇到了很多问题,所以我认为我应该提供我的解决方案。我也这样做了,因为这个页面是查找 sytemd-resolved.service 的持久更改时第一个谷歌结果。最后我想说的是,这个问题似乎特定于Ubuntu >= 18.04及其版本systemd-resolved.service

因此,手册页systemd-resolved.service已经提到过。然而,对于 LXD,人们得出了误导性的结论。LXD 接口不需要在 中定义/etc/systemd/network/<iface>.{conf|network}。该接口已经可以工作,因此不需要为 systemd 的网络管理器定义。默认情况下,LXD 已经有一个正在工作的 DNS 服务器监听其网络的第一个主机地址。我们需要做的就是systemd-resolved.service识别这个服务器。

manpage(上面链接)提到了以下内容/etc/systemd/resolved.conf

默认配置是在编译期间定义的,因此只有在需要偏离这些默认值时才需要配置文件。默认情况下,/etc/systemd/ 中的配置文件包含注释掉的条目,显示默认值作为管理员的指南。可以编辑此文件以创建本地覆盖。

我想强调可以编辑此文件以创建本地覆盖。@quat 事实上你也在实际问题中提到了这一点:

为了使上述持久性,我已经审查了Systemd-resolve manpagehttp://manpages.ubuntu.com/manpages/bionic/man8/systemd-resolved.service.8.html。它建议创建一个/etc/systemd/resolved.conf.d/lxd.conf文件,但没有可用的参数可以让我对某个特定的 NIC 进行特定的配置。

1.将 lxd 的 dnsmasq 服务添加到 systemd-resolved.service 全局 dns 设置中:
我不了解您的上一个句子,您不需要指定您的NIC /etc/systemd/resolved.conf

[Resolve]
DNS=10.78.38.1
#OBFallbackDNS=
Domains=LXD
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

保存文件后,重新启动服务器或仅对systemctl restart systemd-resolved.service我来说,这在全新安装的 Ubuntu-18.04.02 上工作正常。如果它不适合您,我假设您进行了非默认的 lxd 安装,或者由于操作系统升级而遇到问题/冲突。

2.更新(NIC 特定设置):
根据Simos 的博客坚持不懈的唯一方法 $ sudo systemd-resolve --interface lxdbr0 --set-dns 10.78.38.1 --set-domain lxd 是在系统启动下初始化NIC的自定义SystemD服务。LinuxContainers.org

博客上提到的示例:
shell脚本通过systemd-resolve(lxdhostdns_start.sh)启用NIC特定DNS

$ cat /usr/local/bin/lxdhostdns_start.sh 
#!/bin/sh

LXDINTERFACE=lxdbr0
LXDDOMAIN=lxd
LXDDNSIP=`ip addr show lxdbr0 | grep -Po 'inet \K[\d.]+'`

/usr/bin/systemd-resolve --interface ${LXDINTERFACE} \
                         --set-dns ${LXDDNSIP} \
                         --set-domain ${LXDDOMAIN}

通过 systemd-resolve 禁用 nic 特定 dns 的 Shell 脚本(lxdhostdns_stop.sh)

$ cat /usr/local/bin/lxdhostdns_stop.sh 
#!/bin/sh

LXDINTERFACE=lxdbr0

/usr/bin/systemd-resolve --interface ${LXDINTERFACE} --revert

创建一个 systemd 服务来管理这两个脚本并在系统启动时初始化它们:

$ sudo cat /lib/systemd/system/lxd-host-dns.service 
[Unit]
Description=LXD host DNS service
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/lxdhostdns_start.sh
RemainAfterExit=true
ExecStop=/usr/local/bin/lxdhostdns_stop.sh
StandardOutput=journal

[Install]
WantedBy=multi-user.target

最后但并非最不重要的是,运行systemctl enable lxd-host-dns.service并重新启动主机,以通过运行来验证更改是否持久systemd-resolve --statuslxbr0接口现在应该在 DNS 范围内(Current Scopes: DNS)。考虑到您的网络,它应该如下所示:

Link 3 (lxdbr0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.78.38.1
          DNS Domain: lxd

我很清楚这不是理想的解决方案,而且从技术上讲,它仍然无法回答您关于在 systemd-resolve 中保留此配置的问题。然而,保留它的问题在于 lxbr0 接口不是由 netplan 管理的,而是由 Ubuntu18.04 上的 systemd 管理的。由于 netplan 不知道该接口,因此您无法使用上述*.network接口配置将 dns 和域设置添加到lxbr0

这个答案现在很长,但我希望它至少能稍微澄清一下问题。 这两种解决方案都可以在 ubuntu 主机上解析容器名称。 第二种更准确,但如果唯一的要求是在主机上进行名称解析,那么通过 lxd 的 dnsmasq 服务在全球范围内可用 /etc/systemd/resolved.conf是一种可行的选择,特别是因为它只需要在配置文件中进行两次编辑。

答案4

对于 Ubuntu 用户(18.04、18.10、19.04、19.10)

我听从了几个小时的建议来工作周围、上方、下方、穿过和在后面systemd-resolve,包括 tapping几首欢快的吉格舞它对我咕哝着,我爬到它上面。

最终对我有用的是

1)别管 systemd-resolve。不要尝试修改它,不要禁用它,不要尝试卸载它,不要取消链接它……不要……否则无尽的痛苦将永远陪伴着你。“但我想节省空间……”相信我,只需接受额外的千字节,然后继续前进……

2)然后,(重新)安装 resolvconf sudo apt install resolvconf。它将与 systemd-resolve 共舞,就像它们天生一对一样。

3)重启后,进行更改如果需要的话就像您以前通过 resolvconf 的机制一样,例如将内容添加到 /etc/resolv.conf.d/resolv.conf/head,或者其他方式。

我发现这两个系统一起创作的音乐,没有我必须参加,感觉很放松。

其次……也许你来自ifupdown,在那里你可以在 /etc/network/interfaces 中声明你的 DNS 服务器以及其他 ip 设置,并让它们真正发挥作用。但现在,已经被颠覆了网络计划systemd-resolve,您正试图飞速穿越新的魔法圈,浪费您宝贵的几分钟、几小时,寻找新的魔法序列以使网络再次运行……

如果是这种情况,请再次接受额外的几千字节(我知道这很荒谬!!);只需(重新)安装 ifupdown**sudo apt install ifupdown**并再次处理 /etc/network/interfaces。

这两个旧系统都完全无缝地集成到新系统中,而新系统并不适合您和其他许多人。所有这些只需多花几千字节的代价(这是值得的)。

如果超级大国能够在安装新系统时(以及安装之前)发布有关其新子系统性质的教育性评论,而不是让用户发现系统无法正常工作,然后开始漫长的寻找解决方案,那就太好了。(为什么会想到微软……?)

相关内容