Ipv6

如何從 systemd-resolved 中刪除錯誤的 DNS 伺服器 IP?

  • August 25, 2021

所以我正在測試一個路由器,它向我網路上的所有機器添加了一些隨機 IPv6 地址,包括我的 DNS 伺服器。不知何故,這些 IP 作為有效的 DNS 伺服器被廣播(不確定只有真正的路由器如何發送 IPv6 RA 數據包),但長話短說,現在我所有的機器都在向不存在的 IP 地址發送 DNS 查詢。

如果我重新啟動resolvedsystemctl restart systemd-resolved那麼resolvectl仍然會將這些虛假 IP 顯示為有效的名稱伺服器。

它們已列在其中,/etc/resolv.conf因此如果我將它們刪除並重新啟動systemd-resolved,它只會重新添加虛假 IP。

如果我查看日誌,journalctl --unit=systemd-resolved它會告訴我虛假 IP 正在“降級功能模式”下執行,但沒有告訴我從哪裡找到這些 IP。

它從哪裡獲取這些錯誤的 IP 地址?是否需要刪除一些記憶體文件以使其恢復為僅使用 IPv6 路由器廣告提供的 IP?

經過一些調查和 systemd 錯誤報告,這就是我發現的。

systemd-resolved 從 systemd-networkd 獲取其所有 DNS 資訊,因此專注於 systemd-networkd,因為修復流氓伺服器將流入 systemd-resolved。

數據儲存在/var/run/systemd/netif/每個介面一個文件中。這是內部的,可能會發生變化,因此在您閱讀本文時可能已經移動,但是我能夠為流氓伺服器 grep 這些文件並刪除包含它的文件。當我重新啟動 systemd-networkd 時,它會完整地重新創建已刪除的文件。

在我的情況下,它重新創建了仍然列出的惡意 DNS 伺服器的文件,這意味著它沒有被 systemd 記憶體,而是仍在網路上的某個地方進行廣告。

因為它是一個 IPv6 地址,所以我安裝了radvd(IPv6 路由器廣告守護程序)並執行radvdump以顯示到達機器上的所有 IPv6 RA。果然沒過多久,一個列有惡意 DNS 伺服器的伺服器就到了,所以我可以追捕它並修復它。

如果這不是您的選擇,您可以使用一些 systemd-networkd 選項來解決此問題。這些必須放在配置網路的文件之一中 ( /etc/systemd/network/*.network)。

# Don't use DNS servers from DHCP responses received via IPv4 (default is true)
[DHCPv4]
UseDNS=false

# Don't use DNS servers from DHCPv6 responses received via IPv6 (default is true)
[DHCPv6]
UseDNS=false

[IPv6AcceptRA]
# Don't use DNS servers from IPv6 Router Advertisement (RA) messages (default is true)
UseDNS=false
# Don't start a DHCPv6 client when an RA message is received.
DHCPv6Client=false

您可以使用以下命令:sudo systemd-resolve --flush-caches或(後一個命令sudo resolvectl flush-caches取自手冊頁systemd-resolve

要驗證刷新是否成功,請使用:sudo systemd-resolve --statistics

樣本輸出:

Cache
 Current Cache Size: 0
         Cache Hits: 101
       Cache Misses: 256

還要注意systemd-resolve手冊頁中關於/etc/resolv.conf您在哪種模式下操作的部分?

/etc/resolv.conf

支持四種處理 /etc/resolv.conf 的模式(請參閱 resolv.conf(5)):

systemd-resolved 維護 /run/systemd/resolve/stub-resolv.conf 文件以與傳統 Linux 程序兼容。該文件可能從 /etc/resolv.conf 符號連結。此文件將 127.0.0.53 DNS 存根(見上文)列為唯一的 DNS 伺服器。它還包含 systemd-resolved 正在使用的搜尋域列表。搜尋域列表始終保持最新。請注意,應用程序不應直接使用 /run/systemd/resolve/stub-resolv.conf,而只能通過 /etc/resolv.conf 中的符號連結使用。該文件可以從 /etc/resolv.conf 進行符號連結,以便使用正確的搜尋域設置將繞過本地 DNS API 的所有本地客戶端連接到 systemd-resolved。推薦使用這種操作模式。

提供了一個靜態文件 /usr/lib/systemd/resolv.conf,將 127.0.0.53 DNS 存根(見上文)列為唯一的 DNS 伺服器。該文件可能從 /etc/resolv.conf 符號連結,以便將繞過本地 DNS API 的所有本地客戶端連接到 systemd-resolved。此文件不包含任何搜尋域。

systemd-resolved 維護 /run/systemd/resolve/resolv.conf 文件以與傳統 Linux 程序兼容。該文件可能從 /etc/resolv.conf 符號連結並始終保持最新,包含有關所有已知 DNS 伺服器的資訊。請注意文件格式的限制:它不知道每個介面 DNS 伺服器的概念,因此只包含系統範圍的 DNS 伺服器定義。請注意,應用程序不應直接使用 /run/systemd/resolve/resolv.conf,而只能通過 /etc/resolv.conf 中的符號連結使用。如果使用這種操作模式,繞過任何本地 DNS API 的本地客戶端也將繞過 systemd-resolved 並直接與已知的 DNS 伺服器對話。

或者,/etc/resolv.conf 可能由其他包管理,在這種情況下 systemd-resolved 將讀取它以獲取 DNS 配置數據。在這種操作模式下,systemd-resolved 是這個配置文件的消費者而不是提供者。

請注意,根據 /etc/resolv.conf 是指向 /run/systemd/resolve/resolv.conf 的符號連結還是將 127.0.0.53 列為 DNS 伺服器,會完全自動檢測此文件的選定操作模式。

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