Cloud DNS private zones with CNAME
有些 VM 會無法解析 private zone 裡的 CNAME ,而有些則可以解析的情況。
Short description
查看文件 [1] 所述,當 VM 使用 metadata server 169.254.169.254 為 NS 並且沒有其他替代 NS 的時候, DNS 會 follow this table. 您可查看第一項 Cloud DNS private zone 的 behavior Cloud DNS systems perform queries for the CNAME answer in Cloud DNS private zones that are authorized for the VPC network. Cloud DNS systems do not perform queries for the CNAME answer in any public DNS zones, including Cloud DNS public zones.
所以會無法 query 到網址的 A record。
正常可解析的 VM ,可以先查看 /etc/resolv.conf 的 nameserver,將會是 127.0.0.53,也可以運行 sudo ss -tulnp | grep LISTEN ,會看到 127.0.0.53%lo:53 和 users:(("systemd-resolve",pid=18078,fd=12)) ,代表著 systemd-resolved 在本地建立了一個本地 DNS server,而這時如果透過 systemd-resolve test.example.com 去解析 domain,可看到他會回傳正常的 IP 位置。因此在此 VM 才可以正常的解析 [2]。
我們再來查看無法解析的 VM,以 GKE node (VM) 為例子,會無法看到任何由 systemd-resolved 所建立的 port 和 /etc/resolv.conf 的 nameserver is 169.254.169.254,因此會直接前往 169.254.169.254 去做查詢,最終只會回傳 CNAME 得結果。
Resolution
Workaround 做法可設定 Private DNS forwarding zone [3],將特定的 zone 轉給地端的 DNS Server 去做解析,另外要達成 Private DNS forwarding zone 這個功能,必須在地端 DNS Server 允許來自 35.199.192.0/19 的 IP range。
Any solution?
如 GCP 並未跟地端連接或是地端沒有 DNS server,目前尚無別的方法可執行。
- VM as DNS server.
[1] https://cloud.google.com/dns/docs/cnamechasing
[2] https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html#See Also
[3] https://github.com/spotify/scio/issues/970#issuecomment-519580557