dnsmasq 和 systemd 導致間歇性 CPU 峰值
問題:
執行 Ubuntu 17.10
我已經嘗試解決(呵呵)這個問題大約一周了,儘管有無數的Google搜尋和大約 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 查詢。那不是解決方案。
解決了!
請參閱引導我找到解決方案的 telcoM 的 DNS 速成課程(已接受的答案)
當我嘗試從該答案中獲得的知識時,請查看我的後續和最終解決方案
看起來您可能有
dnsmasq
127.0.0.1 中的程序和 127.0.0.53systemd-resolved
中的程序在彼此之間來回傳遞查詢,從而導致循環。即使dnsmasq
單獨也可能能夠循環,因為預設情況下它/etc/resolv.conf
會查找真正的 DNS 伺服器以用於它沒有資訊的名稱。您的 DNS 配置可能有很多層:
- 首先,您可以通過 DHCP 或類似方式從 ISP 獲得 DNS 伺服器資訊。
- 然後,有
NetworkManager
,可以將其配置為覆蓋資訊並dnsmasq
改為使用,但目前未以這種方式配置。- 相反,
NetworkManager
被配置為使用該resolvconf
工具來更新真實的/etc/resolv.conf
. 並且dnsmasq
可能包括一個插入式配置,resolvconf
用於覆蓋 DHCP 接收的任何 DNS 服務,並在dnsmasq
執行時使用 127.0.0.1 代替。- systemd-resolved 還可能包括一個用於 的插入式配置
resolvconf
,但顯然被dnsmasq
.我還不明白 127.0.1.1 和 127.0.0.53 是從哪裡來的。它們是否可能
dnsmasq
在 Ubuntu 的預設配置中被提及?正如它在評論中所說
/etc/resolv.conf
,執行此命令以查看有關systemd-resolved
配置的更多資訊:systemd-resolve --status
還要檢查
/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
通過將此行添加到其配置中來輕鬆地使用它:resolv-file=/run/NetworkManager/resolv.conf
這告訴
dnsmasq
了從哪裡獲取那些它還不知道的東西的 DNS 資訊。所以如果你想使用Google DNS,你可以dnsmasq
配置resolv-file=/etc/google-dns-resolv.conf
並將 Google DNS 的 DNS 配置行以通常格式放入
/etc/google-dns-resolv.conf
.