首先,我在网站上搜索了类似的主题,并阅读了 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
记录,而不管 A
或 CNAME
记录首先指向它。它寻找一个完全限定的域名 (FQDN),并简单地为您提供第一个合适的域名,即第一个以 .
结尾的域名,即根。
因此,FQDN : sa-in-f93.1e100.net
来自 IP PTR
的 74.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/