专家见解

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

subdomains

可能出于某些原因,您希望能够列出某个域名的所有子域名,但一般来说,这些原因归结于某种网站上攻击(我们无法容忍的攻击)或保护自己免受这样的攻击,包括审核您的子域名以确保您的 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 查询和专门的在线工具。要获得最全面的列表,您可能必须将上述三种方式结合起来。

最后,在特定域名上建立无限数量的子域名的能力是註册域名非常有价值的方面之一。然而,子域名也可以是一种责任,因此请务必注意确保不安全的子域名不会给您带来问题。