2026-10-12

有開啟DNSSEC驗證的,今天開始DNS解析失敗的原因及解法

原因: ICANN 在 2026-10-11(昨天)把根區 DNSKEY 改由新金鑰 KSK-2024(key tag 38696) 簽章,也就是根區 DNSSEC 金鑰輪替(Root KSK Rollover)

目前 systemd (255) 內建的信任錨(trust anchor)只有舊的根金鑰 KSK-2017(key tag 20326):

Positive Trust Anchors: . IN DS 20326 8 2 e06d44...

systemd-resolved 不支援 RFC 5011 的信任錨自動更新,所以它找不到可以驗證的金鑰。從根 . IN DNSKEY 開始就驗證失敗,錯誤訊息是 missing-key,之後任何網域都一樣。

解法:
dns-root-data 套件的 /usr/share/dns/root.ds 同時包含 20326 和 38696 兩把。只要把它設成 resolved 的信任錨就可以:

sudo mkdir -p /etc/dnssec-trust-anchors.d
sudo cp /usr/share/dns/root.ds /etc/dnssec-trust-anchors.d/root.positive
sudo sed -i 's/^DNSSEC=.*/DNSSEC=allow-downgrade/' /etc/systemd/resolved.conf   # 或 yes
sudo systemctl restart systemd-resolved
resolvectl query dnssec.works

上游systemd尚未自動更新這一塊,可能覺得DNSSEC驗證有打開的人很少不影響是吧?囧