我有一個 AWS EC2 執行個體網路。他們中的大多數都使用預設 VPC 的 DNS 解析器來防止滲透並解析內部網域(使用自訂 TLD)。一切都很好。
然而,有一個(Ubuntu)實例需要使用通用的公共解析器來存取整個互聯網(例如8.8.8.8)
我透過將 /etc/systemd/resolved.conf 替換為
[Resolve]
DNS=8.8.8.8 208.67.222
並且加入 /etc/systemd/resolved.conf.d/MYTLD.conf
[Resolve]
Domains=MYTLD
DNS=10.6.0.2
重新啟動 systemd-resolved 後,實例可以很好地解析所有域。但是,當我將這個完全相同的配置應用於 us-east-2 中幾乎相同的網路時,公共 DNS 就不起作用。
我在 StackExchange 上發現的一項建議是將 /etc/resolv.conf 符號連結到 /run/systemd/resolve/resolv.conf。這使得公共 DNS 開始解析,但內部 TLD 停止了。
如何讓 DNS 在任何區域都能一致解析?
答案1
我已經找到了我的解決方案。
DNS 解析器被設定為預設區塊(顯然。這就是本次練習的重點。)但回應被設定為 NODATA。這創建了一個競爭條件:systemd-resolve 使用鏈路本地多播名稱解析取得 DNS 結果。這意味著它同時查詢 AWS 內部伺服器和其中一台公用伺服器。 LLMNR 傳回它所獲得的第一個成功結果或最後一個失敗結果(如果所有結果都是失敗)
從技術上講,來自 DNS 解析器的 NODATA 結果是成功的,因此如果結果先到達,則傳回該結果。將操作更改為 NXDOMAIN(從 systemd-resolve 的角度來看這是失敗的結果)解決了問題。