2017-08-22 1787 views
0

首先我搜索了类似主题的网站,并阅读了RFC 1535和FQDN wiki,但他们似乎没有回答这个问题。主机名和完全限定域名(FQDN)之间的区别

让我以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访问它。 使之成为可能的一种方法是添加一个CNAME记录,将 documents.example.com指向docs.example.com。当有人访问 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(因为它不是relialbe)

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

正常情况下查询IP是缓存/递归服务器请求根然后TLD然后子域直到它获得IP。是否有可能做到这一点?得到IP然后以某种方式得到了子域然后TLD然后根然后我得到了FQDN?

7)是不是FQDN和IP映射到1?1?

这里是我,当我运行

host 216.58.193.78 

输出:

为什么一个IP映射到两个FQDN? 一台机器两个FQDN,它是如何工作的?

+0

你正在从Python的Socket API反向工作,试图学习DNS术语,并在过程中变得非常困惑。要做的是帮助解释套接字API调用如何映射到DNS相关术语,这需要我们引用Python的文档 - 使其成为一个脱离主题的编程问题(即StackOverflow)此外,#4与Google的web服务器如何在该IP上运行有关地址处理由Web浏览器发送的不同'Hostname'头部。一旦你将一个名字映射到IP地址,DNS的作用就结束了,反之则反向DNS。 –

+0

@Alnitak你对在Stack上处理这个问题感兴趣吗?溢出?我无法解剖这一个没有不得不参考Python文档来解释这些调用实际上在做什么,所以我认为这相当正确地属于SO。 –

+0

@AndrewB我刚刚更新了StackOverflow的帖子来匹配这篇文章,所以他们现在完全一样。感谢任何地方的帮助 – oNion

回答

1

无论术语FQDN的语义如何,我们都必须看到Python的socket.getfqdn()确实是

socket.getfqdn([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来自IP 74.125.200.93PTR记录。

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

这里,FQDN该域名具有主机youtube.com实际上www被定义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.)使这个假设为假

1

“主机名”是一个不明确的术语,在许多不同的上下文中用于表示许多不同的事物,大致而言,除了某些可以被认为是主机的名称之外,它们没有共同之处。试图将所谓的“主机名”视为同一件事,甚至是某种明确定义的事情,只会导致挫败感和困惑。

完全限定域名(FQDN)是一个DNS特定的术语,它回溯到RFC 1035,这意味着一个DNS域名与其所有组件标签完全拼写在一起(而不是一个域名会留下一些标签上下文暗示)。

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

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地址反向查询被要求一个PTR纪录78.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地址和名称之间固定的1对1映射是相当普遍的做法,即使这些映射不代表主机具有名称。

另一个例子(使用/ 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)反向查找为您提供了一个DNS中的PTR,它可以是任何事情。如果需要它可以返回localhost。没有要求PTR是FQDN,但最有意义的是返回一个。从这个的结果不能不应该交替使用。

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

4)对于HTTP 1.1协议的客户端告诉服务器的请求的服务器名称在地址栏,如果服务器获取它并不期待它可以拒绝它。 Youtube预计将被称为www.youtube.com,如果您连接到该服务并使用其他名称调用该服务,则处理此请求的服务器将返回404错误。

相关问题