确定域是区域apex还是子域

时间:2013-05-03 23:22:03

标签: dns bind subdomain

我正在尝试编写一个脚本,其部分功能取决于用户提供的域是否为区域apex(example.com)或不是(www.example.com)。有什么方法可以确定我是在处理区域顶点还是子域?我希望采用纯粹的基于模式的方法,但这看起来很棘手(例如:xx.yy.co不是根域,但xx.co.uk是)。

是否有任何经过验证的方法来确定某个区域是否为根域?

4 个答案:

答案 0 :(得分:4)

Public Suffix List表示可以注册域名的顶级域名和二级域名列表。如果一个名称只有一个超出其列表中匹配条目的级别,那么它就是区域顶点。

答案 1 :(得分:3)

是的,我不得不写一个最近执行此操作的脚本。

  1. 针对您正在检查的实体的权威名称服务器运行非递归查询(即dig +norecurse)。使用查询类型SOA。不要使用递归服务器,行为变得难以预测。如果它是混合auth和递归答案的服务器,请确保在答复中检查AA(权威答案)标记。
  2. 如果响应代码为NOERROR,请检查返回的ANSWER部分的最左侧组件(如果存在)。否则,请查看AUTHORITY部分。其中一个将出席。偏好ANSWER的结果是,这可以确保您的结果是SOA记录,而不是NS记录。它使结果的类型保持一致,如果您针对解析程序库编写内容,这可能很有用。
  3. 如果响应代码为NXDOMAIN,请检查返回的AUTHORITY部分的最左侧组件。显然这不是顶点,但这会告诉你顶点是什么。
  4. 除响应代码之外的任何内容都表示服务器不认为自己具有权威性。
  5. 结果将是最高点。如果您的结果不太具体,那么您的请求不是顶点,如果它们完全相同,则它是顶点。

答案 2 :(得分:0)

www.example.com(假设它不是子域,例如,没有foo.www.example.com条目)将没有DNS SOA RR。但是,example.com可能有其他子域名,例如xyz.example.com,其中包含foo.xyz.example.com和bar.xyz.example.com,因此我不知道这是否对您有所帮助。

答案 3 :(得分:0)

将组件名称向后移动,逐个组件检查NS记录。

示例:www.example.com

  1. www.example.com。有NS记录?否。
  2. 是example.com。有NS记录?是。
  3. com。有NS记录?是。
  4. 根据你所使用的“区域顶点”的定义做出相应的决定(我的问题不是100%明确的。)