如何從 systemd-resolved 中刪除錯誤的 DNS 伺服器 IP?
所以我正在測試一個路由器,它向我網路上的所有機器添加了一些隨機 IPv6 地址,包括我的 DNS 伺服器。不知何故,這些 IP 作為有效的 DNS 伺服器被廣播(不確定只有真正的路由器如何發送 IPv6 RA 數據包),但長話短說,現在我所有的機器都在向不存在的 IP 地址發送 DNS 查詢。
如果我重新啟動
resolved
,systemctl 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 伺服器,會完全自動檢測此文件的選定操作模式。