專家見解

如何找到一個域名的所有子域名?

電子郵件

可能出於某些原因,您希望能夠列出某個域名的所有子域名,但一般來說,這些原因歸結於某種網站上攻擊(我們無法容忍的攻擊)或保護自己免受這樣的攻擊,包括審核您的子域名以確保您的 DNS 區域文件中沒有未使用的子域名

您可能也希望能夠獲得一個域名相關的所有服務的完整列表,例如,將其轉移到另一個 DNS 供應商。

在今日的文章中,我們將從技術層面了解什麼是子域名,以及您如何能夠或不能(以及為什麼不!)獲得一個域名的子域名的整個情況。

什麼是子域名?

讓我們從這個基礎問題開始。

當您註冊一個域名時,域名註冊局(即為管理特定頂級域名或 通用頂級域名的實體機構,也就是我們常聽到的網域或域名後綴)會授權該域名的 DNS 區域給您。

請記住:域名系統是分層的。這意味著根域名權限集中在網際網路號碼分配局(Internet Assigned Numbers Authority,以下簡稱 IANA),這是 ICANN 的一部分,負責將頂級域名委託給域名註冊局,然後域名註冊局將權限委託給購買域名的人。

也就是說,如果您註冊域名 example.com,.com 的域名註冊局就會授予您對 example.com 和 .com 域名樹的所有其它 “子分支” 的權限。

就像 .com 可以從 IANA 那裡獲得權限以創建某人請求的任何新的 .com,您也有權限在 “example.com” 樹下創建任何新的子分支。

因此,您可以註冊 foo.example.com、www.example.com, www.foo.example.com 或 www.foo.www.foo.example.com。

當然,這些子分支就是我們所說的子域名。

如何建立一個子域名?

在您已註冊的域名中建立子域名的方式就是一個將該子域名與 DNS 區域文件中的資源相聯的問題。您將使用的 DNS 記錄類型可能會取決於您實際連結的資源類型。

但是,到目前為止,有一種 DNS 記錄類型最常用被使用於子域名中:CNAME 記錄。

CNAME 是一個 “真實名稱” 記錄。與在子域名和資源(例如 A 記錄)之間創建的一對一關係的其它 DNS 記錄類型相反,CNAME 實際上是將子域名轉換為另一個域名的別名。換句話說,它將該子域名映射在另一個域名上。

這實際上賦予了它更大的彈性,這就是為什麼 CNAME 記錄類型是迄今為止創建子域名最常用的記錄類型。

您可以用子域名來做什麼?

子域名可用於任何資源中。最常見的是,它們用於定義個別的命名空間,例如單獨但相關的網站,或代表與網站結構相關的某些內容。例如,將 shop.example.com 這樣的子域名使用在特定網站的線上商店或結帳系統中,或使用 mail.example.com 在代管的網路信箱服務中並不常見 。在全球資訊網的早期,www 子域名當時用於與域名連結的網站,而裸域名(沒有子域名)則是作為 “一般” 使用(例如郵件服務)。

子域名也經常被用來作為將 DNS “擴展” 到基本服務之外的一種方式。DomainKeys Identified Mail 或 DKIM 就是屬於這種情況。DKIM 是一個系統,它使用 DNS 透過公鑰身份驗證對電子郵件發送人進行身份驗證。身份驗證的公鑰部分儲存在 DNS 中的 TXT 類型記錄中。

DKIM 記錄使用子域名作為儲存此密鑰的語法的一部分。所有 DKIM 記錄都是 子域名_domainkey 的子域名上的 TXT 記錄(例如 selector._domainkey.example.com)。

另一個例子是透過 DNS 進行域名控制驗證,以建立 SSL/TLS 安全憑證。

在這種情況下,SSL/TLS 安全憑證頒發機構(以下簡稱 CA)會要求請求建立 SSL/TLS 安全憑證的人驗證他們確實是相關域名的所有權人(或所有權人的僱員/代表)。

CA 會要求證書請求者將特定的 CNAME 記錄添加到他們的 DNS 區域文件中,以有效地建立一個子域名(通常是在隨機字符串上,例如 “12a345b6c78d90efg1234hi56j”),該子域名指向他們自己域名中的特定且相似的隨機字符子域名。

毫無疑問地,還有其它有趣的子域名的使用例子,以上內容讓您可以大致了解子域名的一些使用方式。

總而言之,重要的是要知道子域名是特定域名的 “子分支”。在 DNS 的分層系統中,當域名所有權人向域名註冊局註冊域名時,子域名是委託給域名所有權人的 “命名空間” 的一部分。

子域名有多種用途。具體來說,它們通常用於與代管在裸域名中的網站或網站提供特定服務的獨立網站中,但並非總是如此。在這些情況下,通常會使用 CNAME 記錄。有時候創建它們是為了使用 DNS 以某種形式或其它用途來驗證域名。

在所有情況下,子域名I都是在域名的 DNS 區域文件中被創建的。

現在我們準備繼續討論如何識別特定域名的子域名。

您可以在哪裡找到一個域名的所有子域名?

在區域文件檔中

從上面的解釋中,您可能已經知道定義特定域名的子域名的最佳方法是查看 DNS 區域。

如果您是域名的所有權人或管理員,特別是您有權訪問該域名的 DNS 區域文件,那麼一切變得很簡單。您只需要查看 DNS 區域文件。

如果您在像 Gandi 這樣的域名註冊商中管理您的 DNS,您可以在域名註冊商的介面中找到 DNS 區域文件。

在 Gandi 網站上找到您的 DNS 區域文件

您應該能夠按 “名稱” 對 DNS 記錄列表進行排序,從而獲得所有子域名的列表(子域名將是非 @ 的所有內容)。

如果您想要排除 TXT 記錄和 MX 記錄,您也可以按 “類型” 排序並僅查看具有 CNAME 類型的那些紀錄。

另一種使用 Gandi 界面獲取所有子域名的列表的方法對於具有大量子域名的域名特別有用,當您想要多個域名的所有子域名列表時,或兩者都想要,那您可以使用我們的 DNS 匯出功能

您可以使用此功能創建和下載您的域名的整個區域文件的 CSV 檔,或多個域名的區域文件。然後,您只需按名稱或記錄類型進行欄位排序。

您可以查詢所有子域名的 DNS 嗎?

答案是:不行。您不能只在 DNS 中查詢特定域名的所有子域名列表。

當您查詢 DNS 時,例如當您在瀏覽器中請求網頁時,或在終端窗口中使用指令 `host`,`dig` 或 `nslookup`(這些在大多數情況下功能相同,所以我們在這裡不多加討論其差異)。這些作法適用於查詢您已知的域名或子域名的時候。但如果您嘗試取得所有子域名列表時,那麼關鍵是那些子域名是未知的。可是當您查詢 DNS 時,代表您已經知道要查找的域名或子域名是哪些。

然而,這有一個部分例外。

您可以透過區域傳輸獲得的所有子域名列表嗎?

從技術上來講,是的。這是上面提到的部分例外。 如果您的查詢使用區域傳輸(又名 AXFR),從技術上來看,您可以獲得所有子域名的列表。

對於此查詢,您將會使用 `host`,使用修飾符 -a 和 -l:

host -a -l example.com

在這個例子中,`-a` 等同於 `ANY`,也就是說,它表示輸出將是詳細的, `-l` 表示使用區域傳輸。換句話說,該指令使用區域傳輸來列出域名中的所有主機,也就是所有子域名。

然而,這種方法存在一個巨大的問題,那就是權限問題。

區域傳輸(又稱為 AXFR),作為一般規則,對於大多數請求者來說是禁用的。

為什麼大多數域名都禁用區域傳輸?

首先,我們先討論什麼是區域傳輸。

區域傳輸或 AXFR(AXFR 中的 A 代表 ”命令”,XFR 代表 “傳輸”)是一種用於複製 DNS 區域文件的協議。

AXFR 的主要用例是在主要的名稱伺服器和輔助名稱服務器之間複製 DNS 區域。也就是說,您的域名註冊至少需要兩個 DNS 名稱伺服器,一個主要伺服器和一個輔助伺服器。可以有更多,但這是基本要求。由於輔助是備份,因此可以使用區域傳輸將區域文件的全部內容傳輸至輔助的名稱伺服器。

在 DNS 或至少是區域傳輸協議的開始,幾乎沒有理由限制該協議的使用。但很快就清楚地表明,能夠繪製出域名的整個區域會為潛在的攻擊者提供太多公開的訊息而無法保證安全。

特別是,如果有人想要欺騙或傷害您的 DNS,擁有區域文件的完整副本將對他們非常有幫助。

因此,作為一種隱蔽做法的安全性,區域傳輸協議現在幾乎普遍地在 DNS 伺服器上受到 IP 位址或簽署的區域傳輸的限制。但仍有一些攻擊者會嘗試破壞這些限制,並取得成功。

除了 DNS 查詢工具外,您還可以使用哪些方法來查詢子域名?

在這一點上,我們注意到取得域名的所有子域名列表的合法用例開始變得越來越少。如果您無法訪問區域文件,那麼您嘗試列出所有子域名的主要原因可能是某種審核,可能是安全審核或侵入測試。

由於不安全的子域名可能會帶來嚴重的安全風險,因此有必要了解還有哪些其它可用選項,以備不時之需。

但是,如果沒有直接訪問區域文件,您只能確保擁有部分子域列表。

暴力/猜測

最明顯也是最困難的策略就是暴力破解,也就是用猜的方式。

幾乎每個域名都定義了一些子域名,例如 www,以及其它非常常見的子域名,例如 shop 或 mail。但是,透過使用 `dig`,`nslookup` 或 `host` 對大部分的子域名進行 DNS 查詢,您可能會發現一些隱藏的子域名。您或許可以嘗試使用腳本,否則這可能會很耗時。

您可以使用反向 DNS 查詢來查詢子域名嗎?

查詢隱藏子域名的一種方法就是先識別它們可能指向的 IP 位址。如果您能夠透過猜測的方式找到一些子域名,例如 mail.example.com 和 www.example.com,並且您發現它們個別指向同一範圍內的不同 IP 位址,那麼您可以合理地假設其它子域名可能使用同一範圍內的其它 IP 位址。

要查詢與 IP 位址對應的域名,您必須執行與 DNS 查找相反的操作,或者換句話說,反向 DNS 查詢。您可以使用我們上面使用的相同命令進行 DNS 查詢:`dig` 和 `host`。 使用 `host`,您只需要執行類似 `host 123.45.678.910` 的命令來進行反向 DNS 查詢即可。使用 `dig` 的話,您則需要添加 `-x`,因此您的查詢將會是 `dig -x 123.45.678.910`。

然而這種方法並非萬無一失。 如果您的子域名有使用任何 CNAME 紀錄,進行反向 DNS 查詢將無助於識別它們,因為如上所述,CNAME 是別名,因此 IP 位址將與 CNAME 指向的域名相連。

還有其它什麼方式可以查詢子域名呢?

值得一提的是,線上有有許多工具可用來查詢子域名,通常是透過爬取網站來獲取子域名的記錄。

您可以在這裡找到用來搜尋子域名的工具清單

查詢所有子域名列表

出於多種原因,您可能會想要獲取特定域名的所有子域名列表,特別是如果您是該域名的所有權人。通常,您會希望獲得這樣的列表是要作為對您的域名和與之相關的資源進行某種審查的一部分,特別是安全審查。

最終,獲取域名所有子域名列表的最佳方法是訪問該域名的 DNS 區域文件。但是,僅僅擁有訪問權限並不一定會讓事情變得容易。 如果您不能使用區域傳輸協議直接複製域名的區域,您就可以經常在您的 DNS 服務管理網站中查看它(或域名註冊商,或代管服務供應商,具體取決於您擁有 DNS 的位置)。您的供應商或許也提供像 Gandi 的 DNS 匯出功能等服務,您可以在其中下載一個或多個 DNS 區域的 CSV 文件,從而製作一個或多個域名的子域名完整列表。

但是如果您沒有訪問區域文件的權限,這將更加困難,但並非不可能。您可以使用多種不同的方法,包括猜測/暴力破解,反向 DNS 查詢和專門的在線工具。要獲得最全面的列表,您可能必須將上述三種方式結合起來。

最後,在特定域名上建立無限數量的子域名的能力是註冊域名非常有價值的方面之一。然而,子域名也可以是一種責任,因此請務必注意確保不安全的子域名不會給您帶來問題。