问题:
运行 Ubuntu 17.10
我已经尝试解决(呵呵)这个问题大约一周了,尽管有无数的谷歌搜索和大约 20 次不同的尝试,但我无法阻止 dnsmasq 周期性地导致我的 CPU 因以下违规者而飙升约一分钟:
systemd-resolved
systemd-journald
dnsmasq
监控journalctl -f
每次发生时我都会看到:
达到的最大并发 dns 查询数 (150)
伴随/之前是对某个域的疯狂请求循环(通常是 ubuntu 连接检查),如下所示:
query[A] connectivity-check.ubuntu.com from 127.0.0.1
forwarded connectivity-check.ubuntu.com to 127.0.1.1
forwarded connectivity-check.ubuntu.com to 127.0.0.53
query[A] connectivity-check.ubuntu.com from 127.0.0.1
forwarded connectivity-check.ubuntu.com to 127.0.0.53
query[AAAA] connectivity-check.ubuntu.com from 127.0.0.1
forwarded connectivity-check.ubuntu.com to 127.0.0.53
query[AAAA] connectivity-check.ubuntu.com from 127.0.0.1
forwarded connectivity-check.ubuntu.com to 127.0.0.53
query[A] connectivity-check.ubuntu.com from 127.0.0.1
forwarded connectivity-check.ubuntu.com to 127.0.0.53
query[AAAA] connectivity-check.ubuntu.com from 127.0.0.1
forwarded connectivity-check.ubuntu.com to 127.0.0.53
我发现更改我的/etc/resolv.conf以使用nameserver 127.0.0.53
会导致尖峰几乎瞬间消散。
但是,由于网络管理器会定期更新该文件,因此我必须大约每小时执行一次。
配置:
/etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 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.1
search fios-router.home
/etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile
[ifupdown]
managed=false
[device]
wifi.scan-rand-mac-address=no
/etc/dnsmasq.conf
// All default except this at the very end for my wildcard DNS
address=/asmar.d/127.0.0.1
/run/dnsmasq/resolv.conf
nameserver 127.0.0.53
/运行/resolvconf/接口:
lo.dnsmasq
:
nameserver 127.0.0.1
systemd-resolved
:
nameserver 127.0.0.53
/etc/resolvconf/interface-order:
# interface-order(5)
lo.inet6
lo.inet
lo.@(dnsmasq|pdnsd)
lo.!(pdns|pdns-recursor)
lo
tun*
tap*
hso*
em+([0-9])?(_+([0-9]))*
p+([0-9])p+([0-9])?(_+([0-9]))*
@(br|eth)*([^.]).inet6
@(br|eth)*([^.]).ip6.@(dhclient|dhcpcd|pump|udhcpc)
@(br|eth)*([^.]).inet
@(br|eth)*([^.]).@(dhclient|dhcpcd|pump|udhcpc)
@(br|eth)*
@(ath|wifi|wlan)*([^.]).inet6
@(ath|wifi|wlan)*([^.]).ip6.@(dhclient|dhcpcd|pump|udhcpc)
@(ath|wifi|wlan)*([^.]).inet
@(ath|wifi|wlan)*([^.]).@(dhclient|dhcpcd|pump|udhcpc)
@(ath|wifi|wlan)*
ppp*
*
systemd-resolve --status
:
Global
DNS Servers: 127.0.0.1
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
18.172.in-addr.arpa
19.172.in-addr.arpa
20.172.in-addr.arpa
21.172.in-addr.arpa
22.172.in-addr.arpa
23.172.in-addr.arpa
24.172.in-addr.arpa
25.172.in-addr.arpa
26.172.in-addr.arpa
27.172.in-addr.arpa
28.172.in-addr.arpa
29.172.in-addr.arpa
30.172.in-addr.arpa
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test
Link 5 (br-b1f5461ac410)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 4 (docker0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 3 (wlp62s0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 2 (enp61s0)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 8.8.8.8
8.8.4.4
::1
问题:
如何在仍使用通配符域名的同时解决此问题?
可选:如何在使用 Google DNS 时实现这一点?
请不要建议增加并发 dns 查询。那不是解决方案。
看起来您可能有
dnsmasq
127.0.0.1 中的进程和 127.0.0.53systemd-resolved
中的进程在彼此之间来回传递查询,从而导致循环。即使dnsmasq
单独也可能能够循环,因为默认情况下它/etc/resolv.conf
会查找真正的 DNS 服务器以用于它没有信息的名称。您的 DNS 配置可能有很多层:
NetworkManager
,可以将其配置为覆盖信息并dnsmasq
改为使用,但当前未以这种方式配置。NetworkManager
被配置为使用该resolvconf
工具来更新真实的/etc/resolv.conf
. 并且dnsmasq
可能包括一个插入式配置,resolvconf
用于覆盖 DHCP 接收的任何 DNS 服务,并在dnsmasq
运行时使用 127.0.0.1 代替。resolvconf
,但显然被dnsmasq
.我还不明白 127.0.1.1 和 127.0.0.53 是从哪里来的。它们是否可能
dnsmasq
在 Ubuntu 的默认配置中被提及?正如它在评论中所说
/etc/resolv.conf
,运行此命令以查看有关systemd-resolved
配置的更多信息:还要检查
/run/resolvconf/interface/
目录的内容:这是该resolvconf
工具收集从各种来源获得的所有 DNS 服务器信息的地方。将/etc/resolvconf/interface-order
确定检查每个源的顺序,直到遇到环回地址或 3 个 DNS 服务器已真正列出/etc/resolv.conf
。由于您
dnsmasq
用于设置通配符域,因此您需要保留127.0.0.1
-/etc/resolv.conf
但您需要配置dnsmasq
为不使用该文件,而是从其他地方获取它应该使用的 DNS 服务器。如果
/run/NetworkManager/resolv.conf
包含您通过 DHCP 从您的 ISP 获得的那些 DNS 服务器,您可以dnsmasq
通过将此行添加到其配置中来轻松地使用它:这告诉
dnsmasq
了从哪里获取那些它还不知道的东西的 DNS 信息。所以如果你想使用谷歌 DNS,你可以dnsmasq
配置并将 Google DNS 的 DNS 配置行以通常格式放入
/etc/google-dns-resolv.conf
.使用 dnsmasq 配置修复了我的 dnsmasq systemd-resolve 竞赛。
/etc/dnsmasq.d/myconfig
在 Ubuntu 18.04 上
1 - 创建 /etc/google-dns-resolv.conf
2 - 创建一个配置文件 /etc/dnsmasq.d/my_dnsmaq.conf
3 - 在 /etc/default/dnsmasq 底部插入
4 - 最后,重新启动您的 dnsmasq 服务
sudo service dnsmasq restart
我在上面使用了Johny 的答案,但是为了正确读取我的 dnsmasq 配置文件,我的答案中的步骤 nº3 丢失了。谢谢
解决方案:
/etc/google-dns-resolv.conf
使用以下内容创建:添加
resolv-file=/etc/google-dns-resolv.conf
到/etc/dnsmasq.conf