使用 systemd-resolved 設定 DNS 域名解析

集大權於一身的 DNS 解析服務

接續上一篇 systemd-networkd 後,是說明 DNS 解析的部份。
一般來說都是給系統(普遍都是 DHCP 配發 DNS server 給各位)處理,也就是系統內的 Name Service Switch(簡稱 NSS)去做解析,但是這東西有些年頭了,新的協定像是 DNSSECDNS over TLS 都沒有支援,對於安全性來說是減少了許多。
於是在 systemd 裡面就有了 systemd-resolved 出現來代替 NSS 的位置。

大部分前面都說過了,就從設定檔開始說起吧!
大致上跟域名解析會有幾個檔案有關係:

  • /etc/hosts
    這是本機的 DNS 查詢,這個優先權最大,有符合的話會直接被套用不會再查詢。
  • /etc/resolv.conf
    這是 DNS 伺服器設定的位置,需要查詢就會從這裡抓伺服器。
  • /etc/systemd/resolved.conf
    這是 systemd-resolved 的設定檔,也是今天的主軸。

設定系統使用 systemd-resolved

預設來說都不會採用 systemd-resolved 作為 DNS 查詢,所以都要自己設定一下。
systemd-resolved 是一個獨立的 DNS 服務,有 API 可以呼叫查詢,但是同時也提供的傳統的 nameserver 監聽服務,也就是說,如果你開啟了 systemd-resolved 服務,但是沒有用任何 API 或是對它發送查詢的話也是沒有用的,接下來就是讓查詢會往 systemd-resolved 送囉。
一般來說都是透過 /etc/resolv.conf 更改 nameserver 去指定 DNS 位置,不過 systemd-resolved 自己有提供文件,所以這邊就直接 link 過去就可以了。
# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
這樣的話就會把一般的 DNS 查詢也丟過去了,也不用自己管理 /etc/resolv.conf ,最方便的設定方式了。之後看 /etc/resolv.conf 會長像這樣:

# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0

基本上就是跟 /etc/resolv.conf 長差不多,就是 nameserver 指定到 127.0.0.53,這就是 systemd-resolved 監聽的位置,這邊就完成 DNS 查詢的轉換了。

設定 systemd-resolved

設定檔位置在 /etc/systemd/resolved.conf ,打開就像這樣(我把註解刪掉):

[Resolve]
#DNS=
#FallbackDNS=1.1.1.1 9.9.9.10 8.8.8.8 2606:4700:4700::1111 2620:fe::10 2001:4860:4860::8888
#Domains=
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=allow-downgrade
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes

一般來說其實不太用動它,自己可以運作很好,不過還是稍微說一下幾個重點:

  1. DNS=
    基本上是會從 DHCP 裡面撈,如果撈不到就會抓 /etc/resolv.conf 來用。
  2. FallbackDNS=
    如果連 /etc/resolv.conf 都沒有可以用的,就會抓這裡的來用,基本上不太會用到這裡的位置。
  3. DNSSEC=
    yesno 以及 allow-downgrade,最後一個(也是預設選項)就是如果查詢時簽名驗證失敗的話,也允許使用結果。
    但是有開啟 DNSSEC 的話都會增加一點反應時間,如果覺得查詢變很慢的話,可以考慮關閉一下 DNSSEC。
  4. Cache=
    開啟本機快取,算是最主要得功能之一,因為你查詢過後,就可以直接從本機撈不用再往外跑一次,速度會快上許多,又如果有開啟 DNSSEC 的話,更不用走大老遠再次查詢已經驗證過的資料了。

筆者個人人為,需要改的就只有 DNSSEC 視情況可以關閉,DNS 的話可以在 AP 上 或是 systemd-networkd 上就設定好不需要這邊手動指定。
詳細可以參考 systemd-resolved(8) 以及 resolved.conf(5)

一些工具

上面設定完後,可以看一下下面的工具,方便偵錯或是檢視運作情況。

resolvectl

常用的會有:

  • resolvectl query domain | ip address
    用於 DNS 的正向或反向查詢,取決於輸入資料。
    裡面也會寫查詢的協議、回應時間等等資料。
  • resolvectl status
    查詢目前 systemd-resolved 的設定。
  • resolvectl statistics
    查詢 systemd-resolved 的統計資料,像是快取數量及命中率。
  • resolvectl flush-caches
    清除本機 DNS 快取,一般來說應該用不到,除非 DNS 被污染而快取錯誤的資料吧。

結論

雖然有這麼多新的功能,但是我只是要查詢 DNS 而已啊要這麼多東西幹麻呢?至少在台灣用不到吧,沒有網路封鎖的地方,不怕被 MITM 也不怕域名污染。
不過如果哪一天我們面臨到這樣的問提,或許就可以有恃無恐的解決這問題了。

補充

我不太清楚是為什麼,筆者自己之前會有 ping 回不來的問題,也有 gpg 無法連接金鑰伺服的問題,如果有遇到上述問題的話,就還是改回 nameserver 1.1.1.1 吧,這篇就當長知識就好。

文章於 2023-05-08 01:06 更新

 Share!