Ubuntu

dnsmasq 和 systemd 導致間歇性 CPU 峰值

  • January 11, 2022

問題:

執行 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 速成課程(已接受的答案)

當我嘗試從該答案中獲得的知識時,請查看我的後續和最終解決方案

看起來您可能有dnsmasq127.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.

引用自:https://unix.stackexchange.com/questions/417645