首先,我在网站上搜索了类似的主题,并阅读了 RFC 1535 和 FQDN wiki,他们似乎没有回答这个问题。

让我以 www.youtube.com 为例。我使用的 Python 脚本:

import socket

for host in ["www.youtube.com"]:
    print(host)
    try:
        hostname, aliases, addresses = socket.gethostbyname_ex(host)
        fqdn = socket.getfqdn(host)
        print("  Aliases : ", aliases)
        print(" Hostname : ", hostname)
        print("     FQDN : ", fqdn)
        print("Addresses : ", addresses)
    except socket.error as msg:
        print("%15s : ERROR: %s" % (host, msg))

输出:

  Aliases :  www.youtube.com
 Hostname :  youtube-ui.l.google.com
     FQDN :  sa-in-f93.1e100.net
Addresses :  ['74.125.200.93', '74.125.200.190', '74.125.200.136', '74.125.200.91']

1) 主机名和 FQDN 之间有什么关系?

根据网站 http://kb.iu.edu/d/aiu(和许多其他网站):对于邮件服务器“mymail.somecollege.edu”,主机名是“mymail”,域是“somecollege.edu”,这些组合在一起形成 FQDN。但显然 www.youtube.com 并非如此。那么,FQDN 到底是什么,所有这些名称之间的关系是什么?

2) 当我反向查找 IP 74.125.200.93 时,主机名变为 sa-in-f93.1e100.net 。为什么反向查找给我 FQDN 作为主机名?这些名称可以互换吗?

socket.gethostbyaddr('74.125.200.93')

 Hostname :  sa-in-f93.1e100.net
  Aliases :  []
Addresses :  ['74.125.200.93']

3) Aliases : www.youtube.com 是否也称为 CNAME?根据 http://support.dnsimple.com/articles/cname-record/ 答案似乎是肯定的:



4) 如果这是真的,为什么我不能使用“youtube-ui.l.google.com”或“sa-in-f93.1e100.net”访问 YouTube?这是我通过直接访问主机名和 FQDN 得到的:

Google

404. That’s an error.

The requested URL / was not found on this server. That’s all we know.

编辑 #1

抱歉回复缓慢,我仍在阅读那些 RFC 文档,我有一些新问题:

再次使用 www.youtube.com 作为示例。

5) FQDN 是如何生成的? 每次我调用 socket.getfqdn()host -t PTR 时,它​​是否会查询父域直到根(动态生成)?或者它只是一个 PTR 记录?(似乎查询 FQDN 依赖于反向查找)如果它是 PTR 记录,那么我如何确定它是一个 FQDN,实际上它可以是 FQDN、CNAME、别名、主机名或一些如果区域 dns 管理员想这样设置它,则使用其他名称。就像 David 和 Esa Jokinen 指出的那样(RFC 1912, 2.1),如果这些规则没有被强制执行,那么我怎么能确定我得到了什么?

所以我想也许查询父域直到 root 是获取 FQDN 的最可靠方法。但是我该怎么做呢?甚至可以在不使用 PTR 的情况下获得 FQDN(因为它不是可靠的)

6) DNS 查询是否有可能倒退?

通常对 IP 的查询是缓存/递归服务器询问根,然后是 TLD,然后是子域,直到它获得 IP。是否可以向后执行此操作?获得了IP,然后以某种方式获得了子域,然后是TLD,然后是root,然后我获得了FQDN?

7)FQDN 和 IP 不应该是 1 对 1 映射的吗?

这是我运行时得到的

host 216.58.193.78

输出:
78.193.58.216.in-addr.arpa domain name pointer sea15s07-in-f78.1e100.net.
78.193.58.216.in-addr.arpa domain name pointer sea15s07-in-f14.1e100.net.

一个IP怎么映射到两个FQDN?
一机两FQDN,是怎么工作的?

最佳答案

不管术语 FQDN 的语义如何,我们必须看到 什么 Python 的 socket.getfqdn()



换句话说,getfqdn() 首先查找反向 PTR 记录,而不管 ACNAME 记录首先指向它。它寻找一个完全限定的域名 (FQDN),并简单地为您提供第一个合适的域名,即第一个以 . 结尾的域名,即根。

因此,FQDN : sa-in-f93.1e100.net 来自 IP PTR74.125.200.93 记录。

93.200.125.74.in-addr.arpa. 86400 IN    PTR     sa-in-f93.1e100.net.

在这里,具有域 www 的主机名 youtube.com 的 FQDN 实际上是根据定义 www.youtube.com. ,包括点。同样, sa-in-f93.1e100.net 不是 FQDN,因为它实际上应该是 sa-in-f93.1e100.net. :
  • 主机名 sa-in-f93 作为 1e100
  • 的子域
  • sa-in-f93.1e100 作为 net
  • 的子域
  • sa-in-f93.1e100.net 作为根 . 的子域。

  • 为什么选择 sa-in-f93.1e100.net. 而不是 www.youtube.com. 仅仅是因为 socket.getfqdn() 是如何设计来确定给定名称的 FQDN 的。

    另一方面,规范名称 CNAME 记录应该按照设计 ( RFC 1035, 3.2.2 ) 指向规范名称,但它通常用作别名,因为它像一个别名一样工作。此外,PTR 记录应该( RFC 1912, 2.1 )给出相同的结果,因为它应该代表给定 IP 的规范名称。

    如果只遵守这一点,那么 socket.getfqdn() 使用的方法将是完全合适的。这里,CNAME youtube-ui.l.google.com. 没有相应的 PTR 记录( 93.200.125.74.in-addr.arpa. IN PTR youtube-ui.l.google.com.) 使这个假设为假。

    关于dns - 主机名和完全限定域名 (FQDN) 之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45902840/

    10-10 00:10