我已经将我的 Ubuntu 桌面升级到 Bionic Beaver,它切换到systemd-resolve。由于这一变化,LXD DNS 解析停止工作。
为了让 LXD 容器可被发现,我可以运行以下命令。注意,IP10.78.38.1是lxdbr0桥。
$ 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=
!
这是我使用的参考文献:
- 如何检查网络是否正在运行: https://superuser.com/questions/1187633/how-to-debug-systemd-networkd?rq=1#comment1807294_1187633
- 如果已禁用,如何启用: https://askubuntu.com/posts/681768/revisions
重新开始systemd-已解决无需重启:
sudo systemctl restart systemd-resolved
仅供参考:有一种方法可以告诉 systemd 让网络管理器处理接口,以及离开它未受管理并使用平面文件配置运行,例如/etc/resolv.conf
。但如果我处于你的位置,我会让它按原样工作。
答案2
这会破坏您的lxdbr0
但正确的配置systemd-resolved
:
根据链接的手册页man 8 systemd-resolved.service和man 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 --status
。lxbr0
接口现在应该在 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。
这两个旧系统都完全无缝地集成到新系统中,而新系统并不适合您和其他许多人。所有这些只需多花几千字节的代价(这是值得的)。
如果超级大国能够在安装新系统时(以及安装之前)发布有关其新子系统性质的教育性评论,而不是让用户发现系统无法正常工作,然后开始漫长的寻找解决方案,那就太好了。(为什么会想到微软……?)