Cloud DNS 是 Google 提供的代管式的全球 Domain Name System(網域名稱系統服務),為一個分布式的分層資料庫(hierarchical distributed database) 用於存儲 IP addresses 和 Domain Name 的對應關係,還可以建立 DNS Zone 並在其下管理和創建 Record 。對應其他的雲端服務是 :

  • Amazon Web Services (AWS) : Amazon Route 53
  • Microsoft Azure : Azure DNS

Cloud DNS 是提供代管功能而不是註冊,而代管的好處是有一個「共同管理維護」的介面 ; 還能「基於地理位置」將流量轉到最接近的服務器從而提高性能與速度 ; 結合「 GCP 雲端安全服務」保護應用程式免於如 DDoS 攻擊。 最後比較特別的是 Google 的 Cloud DNS 服務號稱是 100% SLA 服務保證絕對不會中斷, Google 對其 DNS 服務設計非常的有信心。


開頭也特別提到一點, 「Cloud DNS 是代管而不是註冊」, 那「註冊」跟「代管」有什麼不一樣呢?

  • 註冊其實就是買域名或者是租用域名,原本 Google 有一個 「Google Domain」提供了 DNS 註冊,但是於 2023/09/07 給了 Squarespace
  • 雖然說我們只能找別的域名供應商買域名或者是租域名,但我們可以去設定 Cloud DNS 接管服務,這就是代管

一般來說,在哪裡買或租了域名,則默認的域名解析服務就是該服務商提供的,而 GCP 提供域名代管,例如在 GoDaddy 買了一個域名後,可以去 GCP console 設定 DNS 的資料而不用在 GoDaddy 做管理。

不確定是 Google Domain 被 Squarespace 收購,還是 Google 把 Google Domain 賣給 Squarespace。 但似乎從 2024/05 開始陸續傳出許多 domain missing 的災情

Cloud DNS

域名註冊完後需要設定 DNS Server 才能使用,故接下來要先創建管理介面,一般稱為 DNS 的 Namespace ,在 GCP 頁面上是對應到 DNS Zone

我個人是覺得取名為 DNS Zone 蠻容易誤會的。因為在 GCP 上 Zone 通常是指地理區域的實際機房位置,例如說台灣是 asia-east1 Region ,而其 Region 內有 Zone asia-east1-a 代表機房位置的代號,但 DNS Zone 和地理區域其實沒有任何關係,它是管理 DNS Record 的一個介面名稱罷了,故我覺得用到 Zone 這個名詞蠻不好的。

而 DNS Zone 分成兩種類型 Zone Type 或稱為 Visibility :

  • Private: 需要設置對應 VPC,其 DNS Records 僅供 GCP VPC 內部可見
  • Public: 在一般外網可見,故外部可以訪問,一般來說最常使用的是這個

接下來做一些 Console 上的名詞說明:

  • Zone name

    DNS 分為許多不同的 Zone ,其代表的是 DNS Namespace ,而 Zone name 就是代表 Namespace 的名稱。 CLoud DNS 的管理以 Zone 來劃分,一個 Zone 裡面會保存有相同 DNS Name Suffix。

  • DNS name

    在域名商那邊申請到的 DNS 名稱,例如是申請 helloworld.com. 就是貼到上圖中 GCP Console 的 DNS name 欄位中。

注意一些特別的細微事情,以上述範例假如是申請 helloworld.com

  1. 若在 GCP Console 在上建立 Zone 並指定 DNS name 輸入是 helloworld.com,在完成後看 DNS name 會發現多加了個點在最後面: helloworld.com.

  2. DNS name 輸入是 helloworld.com. 有在最後面加點,在完成後看 DNS name 會保持 helloworld.com.

  3. 若用 terraform 建立 Zone ,那在 DNS name 那邊設定一定要寫成如 helloworld.com. ,最後面一定要加點,要不然會直接回報錯誤

  • DNSSEC (DNS Security Extensions)
    是一套針對 DNS 的網際網路工程任務群組 (IETF) 的擴展,用於驗證對網域名稱尋找的回應。 DNSSEC 不會為這些查找提供隱私保護,但會阻止攻擊者操控對 DNS 請求的回應或對該回應進行 DDOS 攻擊。

常見錯誤是把 DNS zone 、 DNS name 、 DNS Server 當成同一個東西,可參考 Cloudflare 講解。

DNS Record

設定完 DNS Zone 之後,接下來就會在該 Zone 內添加 Record 紀錄。 Record 是 DNS resource 和 domain name 之間的 Mapping,每個 DNS Record 都有 :

  • type
  • TTL(time to live)

在新增 Record 時, Cloud DNS 除了 standard 標準解析之外,還有 Routing Policy 路由政策可以進階設定。 Routing Policy 是在 DNS 查詢時的演算法,用以確定應如何解析特定的 DNS Record,有提供三種可以選擇: 「Standard」、「Weighted Round Robin」、「Geolocation」,除非有設定 Failover Routing Policy,要不然上面三個路由政策只能選一個無法組合。

TTL 作用是設定每一筆紀錄在 DNS 快取伺服器所保留的時間,所以當變更這筆 DNS 紀錄的時候,要等到你設置的 TTL 時間後才會全球生效。

接下來簡要介紹並列出有用過的 Cloud DNS 支援的 DNS Record 類型:

  • A / AAAA Record

    A Record 將域名映射到對應的 IPv4 。常用在想直接將個人網域指向一個固定 IPv4 ,其操作是將 DNS Name 例如 helloworld.com, 指向如 VM 的固定 IP 例如:123.45.67.89。而 AAAA Record 將域名映射到對應的 IPv6

  • CNAME Record(Canonical Name Record)

    將一個域名(或子域名)映射到另一個域名。如果想將個人網域指向另一個名稱,而不是直接指向 IP,則會新增一個 CNAME 記錄。

    例如將 DNS Name 例如 helloworld.example.com 指向另一個目標 DNS Name 例如: helloworld.main.com,這樣當有人輸入 helloworld.example.com 時,DNS 解析會自動將它轉發到 helloworld.main.com。

  • SOA (start of authority)

    SOA 這種 Record 用於指向 DNS Zone 的 Authoritative Name Server 權威名稱伺服器,指定該 Zone 的 administrative contact 資訊。


Practice

有一個 Compute Engine 上運行著多個相關的 APP ,現在想要通過 DNS name 來 expose 公開每個 APP, 若遵循 Google-recommended practices 則應該怎麼做?

由於需要 Expose APP,所以就不能用 Internal DNS,故選擇透過 Public DNS 為每個 App 分配一個公共域名,並將該域名映射到 VM 的 IP 地址,從而使得外部 User 能夠通過域名訪問 App 。

Cloud DNS 提供高效低成本的域名解析,是公開應用程序的最佳方法,符合 Google 的最佳實踐。


參考資料