我遇到了一个奇怪的问题。顺便说一下,我使用的是 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
开始发疯;然后他们恢复过来,但解决方案却失败了。