我正在尝试启动一个带有systemd派生的容器(来自systemd-容器包,版本241),但是容器无法解析主机名。主机环境是PureOS 9.0,它类似Debian,基于Ubuntu。
容器映像是使用debootstrap创建的,并安装了systemd容器:
debootstrap \
--components main,restricted,universe \
--include systemd-container \
bionic /var/lib/machines/bionic http://archive.ubuntu.com/ubuntu/
echo bionic > /var/lib/machines/bionic/etc/hostname我将从图像目录启动容器:
systemd-nspawn -qbD /var/lib/machines/bionic从容器内部,我可以访问主机网络:
root@bionic:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=130 ms但是DNS解析失败了:
root@bionic:~# ping google.com
ping: google.com: Temporary failure in name resolution容器resolv.conf是我所期望的;它看起来像一个非常标准的本地DNS解析器,它应该由主机系统解析提供。
nameserver 127.0.0.53我看到DNS解析器监听主机:
root@host:~$ lsof -i -Pn | grep LISTEN | grep 53
systemd-r 6957 systemd-network 13u IPv4 5300137 0t0 TCP 127.0.0.53:53 (LISTEN)
systemd-r 7252 systemd-resolve 12u IPv4 5313025 0t0 TCP *:5355 (LISTEN)
systemd-r 7252 systemd-resolve 14u IPv6 5313028 0t0 TCP *:5355 (LISTEN)这与我以前在Ubuntu上使用的设置类似,没有问题。我没有理由相信这在PureOS或我的systemd版本上是行不通的。我猜想主机网络配置中有些东西是不同的,但我不知道该检查什么。
我发现我的主机在默认情况下没有运行systemd解析或。我手动启动了这些服务,行为没有改变。我还阻止了NetworkManager,认为这可能是干扰,但那里也没有运气。
发布于 2021-02-21 05:44:24
我在Linux上尝试使用商业VPN时遇到了这个问题。我和你一样使用了一个带有Debootstrap的Systemd容器。我做了一些研究,发现Systemd容器在DNS中有很多问题,原因有两个:编写代码而不编写文档。在没有测试的情况下在网络上部署一些东西。
我还读了一些文章,这些文章通过搜索Google中的“systemd容器和vpn dns问题”来说明问题。事实证明,有几件事你应该检查,但有一个正确的方法做每件事,并正确的方式起作用。看看我的读物..。
在本文中,作者查看了DNS缓存条目,并发现更新更改了resolv.conf的符号链接。
在本文中,他们将讨论这个问题,以及在拆分DNS的场景中是如何引起的。
如何在Kubernetes 1.10及更早版本上修复它。
一个更简单的解决方案是删除Systemd或使用没有Systemd的Linux发行版,但是创建一个Chroot或容器而不是Systemd容器并不容易。当然,所有其他的注意事项都适用,但是真正的失败点是连接和断开连接到名称服务器。Systemd将在resolv.conf中使用自己的名称服务器。在我使用VPN的情况下,真正的解决方案是创建一个杀死开关,以确保如果与DNS名称服务器的连接丢失,它将不再试图解析DNS。
这种有问题的行为不仅与Systemd容器有关,而且在WSL2中也以类似的方式发生.
又一个值得一读的书!
https://serverfault.com/questions/1046776
复制相似问题