4

首先,我在网站上搜索了类似的主题,并阅读了 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/答案似乎是肯定的:

例如,如果您有一个服务器,您可以在其中保持所有文档在线,则通常可以通过 docs.example.com 访问它。您可能还想通过documents.example.com 访问它。使这成为可能的一种方法是添加将documents.example.com 指向docs.example.com 的CNAME 记录。当有人访问documents.example.com 时,他们将看到与docs.example.com 完全相同的内容。

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),如果这些规则没有得到执行,那么我怎么能确定我得到了什么?

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

6)DNS查询是否可以倒退?

通常对 IP 的查询是缓存/递归服务器询问 root,然后是 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,如何工作?

4

3 回答 3

2

“主机名”是一个定义不明确的术语,在许多不同的上下文中用于表示许多不同的事物,粗略地说,除了作为可以被视为主机的事物的某种名称之外没有任何共同之处。试图将所有被称为“主机名”的东西视为同一个东西,甚至是某种定义明确的东西,只会导致沮丧和困惑。

完全限定域名 (FQDN) 是 DNS 特定的术语,可追溯到 RFC 1035,这意味着 DNS 域名使用其所有组件标签完全拼写出来(而不是保留某些标签由上下文暗示的域名) .

“主机名”和 FQDN 之间的唯一关系是,对于“主机名”的某些用途,它的值应该是 FQDN。

于 2017-08-25T05:07:09.903 回答
2

无论术语 FQDN 的语义如何,我们都必须了解 Python 的socket.getfqdn()作用

socket.getfqdn([name])

返回 name 的完全限定域名。如果 name 省略或为空,则将其解释为本地主机。要查找完全限定名称,请gethostbyaddr()检查返回的主机名,如果可用,后跟主机的别名。选择包含句点的名字。如果没有完全限定的域名可用,则gethostname()返回返回的主机名。

socket.gethostbyaddr(ip_address)

返回一个三元组(hostname, aliaslist, ipaddrlist),其中 hostname 是响应给定 ip_address 的主要主机名,aliaslist 是同一地址的备用主机名的(可能为空)列表,ipaddrlist 是同一接口上同一接口的 IPv4/v6 地址列表主机(很可能只包含一个地址)。

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

因此,FQDN : sa-in-f93.1e100.net来自PTRIP 的记录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。

另一方面,Canonical Name 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.)使得这个假设是错误的。

于 2017-08-25T07:42:49.230 回答
1

1)它很复杂,其结果取决于系统名称解析设置、使用的库和上下文。在典型的 linux 安装中,主机名是与主机关联的规范名称,可以是 FQDN 或短名称,但应该可以通过任何一种方式解析(如果设置正确)。如果使用 NIS 之类的名称,则主机名只能是短名称,而不是 FQDN。

您的示例(使用 DNS):

$host www.youtube.com
www.youtube.com is an alias for youtube-ui.l.google.com.
youtube-ui.l.google.com has address 216.58.193.78

www.youtube.com在 DNS 响应中有一个CNAME(“C”代表规范),youtube-ui.l.google.com因此您的库调用返回的“主机名”是根据 DNS 的规范名称。

使用 DNS 对 IP 地址的反向查询是通过PTR78.193.58.216.in-addr.arpa

$ host -t PTR 78.193.58.216.in-addr.arpa
78.193.58.216.in-addr.arpa domain name pointer sea15s07-in-f78.1e100.net.

请注意,它指向的名称与我们之前获得的“主机名”不同。这是由于拥有 IP 地址的 ISP 如何设置它,并且在使用 DNS 时会因主机而异。为这种用途在 IP 地址和名称之间设置固定的一对一映射是相当普遍的做法,即使它们不代表主机的名称。

另一个例子(使用 /etc/hosts):

#example hostfile
1.2.3.4 hosta hosta.example.net myothername.example.net
4.3.2.1 hostb.example.net hostb anothername

当使用您的代码但更改"www.youtube.com""hosta","hostb"我们得到:

hosta
('  Aliases : ', ['hosta.example.net', 'myothername.example.net'])
(' Hostname : ', 'hosta')
('     FQDN : ', 'hosta.example.net')
('Addresses : ', ['1.2.3.4'])
hostb
('  Aliases : ', ['hostb', 'anothername'])
(' Hostname : ', 'hostb.example.net')
('     FQDN : ', 'hostb.example.net')
('Addresses : ', ['4.3.2.1'])

所以在主机文件中,“主机名”是IP地址之后的第一个名称。别名就是之后的一切。FQDN 是带点的名字。

同样,这可能因系统和库而异。

2)反向查找为您提供了一个PTR可以是任何东西的DNS。如果需要,它可以返回 localhost。不要求 PTR 必须是 FQDN,但最有意义的是这样返回。由此产生的结果不能也不应该互换使用。

3)是的,在 DNS中www.youtube.comCNAMEyoutube-ui.l.google.com.

4)对于 HTTP 1.1 协议,您的客户端在请求中告诉服务器 URL 栏中的服务器名称,如果服务器获得一个它不期望它可以拒绝它的名称。Youtube 预计会被调用www.youtube.com,如果您连接到它并使用任何其他名称调用它,处理此请求的服务器将返回 404 错误。

于 2017-08-25T06:58:41.533 回答