如何為內網服務設定自訂網域與 HTTPS:保留 TLD、ACME 證書與本地 DNS 的實踐

假設一個情況,內部 NAT 網路有以下設施僅為內網服務:

  • 路由器兼任 DNS Server 192.168.1.1/24
  • 本地 Web Server 192.168.1.100/24

如何為這本地 Web Server 設定域名,最好還能有 HTTPS?

Local TLDs

首先想到的是使用幾個保留域名, 可以在 DNS Srever 中設定這樣的記錄:

A   web.local.      192.168.1.100
A   web.lan.        192.168.1.100
A   web.internal.   192.168.1.100

*.local. 雖然是本地專用的 TLD,但被指定為 mDNS 專用,所以亂用會出事。

*.intranet.*.private.*.corp.*.home.*.lan. ... 也是 RFC 6762 規範的保留 TLDs, 但 Firefox 無法解析,會跳到搜尋,需要到 about:config 打開相關的選項,但這哪是個人事阿。

*.internal. 既是保留 TLD,又可以被解析,看上去是目前私有 TLD 的最佳解。 但講道理,別人域名都兩三個字母,這真的是又臭又長,你要我打這個單字我還不如打 IP ...

保留 TLDs 誰都可以添加記錄,所以除了自己簽發,自然是沒有 TLS 證書的。還要考慮發行證書,這又哪是個人事阿。

Real Domain

Domain Name System 比我想象的還要 naïve ... 我原本還在想,要是在 CloudFlare 裡面添加 NAT 的 IP,那萬一被人 nslookup 到了是有多丟人。 我還擔心 ACME 不給本地 IP 簽發證書,沒想到人家根本就不管你網路。

假設購買的域名是 domain.example, 在設定 DHCP 的時候,DNS 伺服器首選「本地」的 DNS Server,即是 192.168.1.1/24, 在「本地」的 DNS Server 中設定這樣的記錄:

A   lan.domain.example.     192.168.1.100

由於記錄位於 NAT 之內的「本地」的 DNS Server,所以這個 lan.domain.example 是無法被外部網路解析的。

ACME 是自動簽發 TLS 證書給伺服器,讓伺服器有 HTTPS 可以用。 在伺服器發出 ACME 請求後,ACME 會給一個「權杖」,把權杖輸進 DNS 記錄,ACME 看到了就證明了你對域名的控制權(即是「ACME DNS-01 考驗」)。 所以 ACME 並不關心伺服器在哪個網路下。

所以其實只要在 本地 Web Server 中就像架設對外的網站一樣,指定託管商(例如 CloudFlare)的 API 就行,讓伺服器自己完成 ACME 挑戰。

Reference