2017-08-22 124 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錯誤。

相關問題