运行 dhclient 后,dnsmasq 可以进行本地解析,但几分钟后就会停止工作

运行 dhclient 后,dnsmasq 可以进行本地解析,但几分钟后就会停止工作

我遇到了一个奇怪的问题。顺便说一下,我使用的是 Ubuntu 17.10。

我正在尝试配置一个自定义 TLD,将其称为 .mytld,以解析为 127.0.0.1,这样我就可以托管本地网站而无需更新/etc/hosts

在这台机器上,网络接口由 NetworkManager 管理,它才不是dns=dnsmasq[main]的部分有一行/etc/NetworkManager/NetworkManager.conf

我安装了 dnsmasq 并确认它正在运行。

我编辑/etc/dnsmasq.conf并添加:

listen-address=127.0.0.1

我创建/etc/dnsmasq.d/mytld.conf并添加了:

address=/.mytld/127.0.0.1

我编辑/etc/dhcp/dhclient.conf并添加了:

prepend domain-name-servers 127.0.0.1;

NetworkManager重新启动并dnsmasq手动执行后dhclient,我确认127.0.0.1已被添加为 DNS 服务器(10.0.0.1 是我的网关机器):

$ nmcli
[ ... ]
DNS configuration:
        servers: 127.0.0.1 10.0.0.1
[snip]

由于 NetworkManager 正在管理网络,因此/etc/resolv.conf包含 NM 存根服务器:

$ cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 127.0.0.53

$ systemd-resolve --status
[...]
Link 2 (eno1)
         [...]
         DNS Servers: 127.0.0.1
                      10.0.0.1
[snip]

完成所有这些之后,当我 ping 任意 host.mytld 时,我得到了一个很好的响应:

$ ping -c 1 test.mytld
PING test.mytld (127.0.0.1) 56(84) bytes of data.
64 bytes of data from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.026 ms
[ snip ]

$ dig A test.mytld
[ ... ]
;; ANSWER SECTION:
test.mytld.     0   IN  A   127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
[snip]

所以,它确实起了作用——但只持续了一小段时间。

正常运行几分钟后,情况开始变糟。CPU systemd-resolved占用率达到 100%,dnsmasq徘徊在 50% 左右。(我有一个 6 核、12 线程的 CPU。)

样本来自top

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
20659 systemd+  20   0   66368   6448   5272 R  98.7  0.0  27:31.57 systemd-resolve
13834 dnsmasq   20   0   64516   2840   2424 R  59.3  0.0  35:50.65 dnsmasq

在此过程中,*.mytld仍解析为 127.0.0.1。然后,过了一会儿(可能需要几十分钟),无论发生什么,都会systemd-resolved自行dnsmasq解决 - 两个进程仍在运行,具有相同的 PID。

但是 NetworkManager 给出的响应不再起作用:

$ ping -c 1 test.mytld
PING test.mytld (198.105.244.228) 56(84) bytes of data.

--- test.mytld ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

$ dig A test.mytld
;; ANSWER SECTION:
test.mytld.     10  IN  A   198.105.244.228
test.mytld.     10  IN  A   198.105.244.228

;; Query time: 31 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)

然而,奇怪的是,nmcli和仍然按顺序systemd-resolve --status将名称服务器报告为127.0.0.1和。10.0.0.1

此时,我必须重新运行dhclient才能让一切再次正常工作:

$ sudo dhclient
RTNETLINK answers: File exists

$ ping -c 1 test.mytld
PING test.mytld (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.129 ms

--- test.mytld ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.129/0.129/0.129/0.000 ms

然后这个循环重复进行:过了一会儿,systemd-resolved他们dnsmasq开始发疯;然后他们恢复过来,但解决方案却失败了。

相关内容