什么是DNS的正向解析与反向解析?代码实现?
DNS采用C/S機制。實現域名與IP地址轉換。DNS服務器用于存儲資源記錄并提供名稱查詢服務,DNS客戶端也稱解析程序,用來插敘服務器并獲取名稱解析信息。
正向解析與反向解析
按照DNS查詢目的,可將DNS解析分為以下兩種類型。
- 正向解析
根據計算機的DNS名稱(即域名)解析出相應的IP地址。
大部分DNS解析都是正向解析,即根據DNS域名查詢對應的IP地址及其他相關信息。正向解析又稱標準查詢。正向解析記錄存儲在正向解析區域文件中。
- 反向解析
根據計算機的IP地址解析其DNS名稱,多用來為服務器進行身份驗證。
有時我們也會用到反向解析,即通過IP地址查詢對應的域名,最典型的就是判斷IP地址所對應的域名是否合法。由于反向解析的特殊性,RFC 1304規定了固定格式的反向解析區域后綴格式in-addr.arpa
與DNS名稱不同,當IP地址從左到右讀時,它們是以相反的方式解釋的,所以對每個8位字節值需要使用域的反序,因此建立 in-addr-arpa。
反向解析區域文件與正向解析區域文件格式相同,只是其主要內容是用于建立IP地址到DNS域名的轉換記錄,即PTR資源指針記錄。PTR資源指針記錄和A資源記錄正好相反,它是將IP地址解析成DNS域名的資源記錄。
域名解析的具體過程
域名系統 (DNS) 旨在將主機名解析為 IP 地址。 將名稱解析為 IP 地址的過程稱為“正向解析”。 DNS 樹被組織成一個倒置的樹結構,地址的最不具體的部分在頂部,地址的最具體的部分在底部。
我們知道DNS服務器里面有兩個區域,即“正向查找區域”和“反向查找區域”,正向查找區域就是我們通常所說的域名解析,反向查找區域即是所說的IP反向解析,我們下面來解析上圖的域名解析過程。
- 當客戶機提出查詢請求時,首先在本地計算機的緩存中查找。如果在本地無法獲得查詢信息,則將查詢請求發給DNS服務器。
- 首先客戶機將域名查詢請求發送到本地DNS服務器,當本地DNS服務器接到查詢后,首先在該服務器管理的區域的記錄中查找,如果找到該記錄,則利用此記錄進行解析;如果沒有區域信息可以滿足查詢要求,服務器在本地的緩存中查找。
- 如果本地服務器不能在本地找到客戶機查詢的信息,將客戶機請求發送到根域名DNS服務器。
- 根域名服務器負責解析客戶機請求的根域部分,它將包含下一級域名信息的DNS服務器地址返回給客戶機的DNS服務器地址。
- 客戶機的DNS服務器利用根域名服務器解析的地址訪問下一級DNS服務器,得到再下一級域我的DNS服務器地址。
- 按照上述遞歸方法逐級接近查詢目標,最后在有目標域名的DNS服務器上找到相應IP地址信息。
- 客戶機的本地DNS服務器將遞歸查詢結果返回客戶機。
- 客戶機利用從本地DNS服務器查詢得到的IP訪問目標主機,就完成了一個解析過程。
正向解析可以通過主機名獲取其對應的廣域網IP地址,使用 nslookup 命令在 Linux上輸入
nslookup 【domain】
從返回的信息中可以看到正向解析的結果。
如何做反向DNS?
我們可以通過命令來執行反向 DNS 查找
1、使用 nslookup 命令
2、使用 dig 命令
3、使用 rDNS 查找工具
反向 DNS 查找命令
nslooup命令
nslookup最簡單的用法是查詢域名對應的IP地址,也可以使用IP地址查找域名,例如:
nslookup [ip_address]
使用nslookup可以輸出返回指定 IP 地址的域名。
由于在域名系統中,一個IP地址可以對應多個域名,因此從IP出發去找域名,理論上應該遍歷整個域名樹,但這在Internet上是不現實的。為了完成逆向域名解析,系統提供一個特別域,該特別域稱為逆向解析域in-addr.arpa。
在 IPv6 中,PTR 記錄將 rDNS 條目存儲在 .ip6.arpa 域中,而不是 .in-addr.arpa。
dig命令
Linux下解析域名除了使用nslookup之外,還可以使用dig命令來解析域名,dig命令可以得到更多的域名信息。
dig命令是一個用于詢問 DNS 域名服務器的靈活的工具。常見使用:
dig -x [ip_address]
更多關于dig命令,可以查找man手冊。
dig -x 8.8.8.8
輸出顯示指定 IP 地址的域名。
DNS反向解析實現
int main(int argc, char* argv[]) {int ret = 0;DNS_QUERY query;/* 只接受一個命令行參數 */if (argc != 2 || (argc == 2 && argv[1][0] == '-')) {fprintf(stderr, "usage: %s [DOMAIN | IP]\n\n", argv[0]);return -1;}/* 從傳遞的域(或 IP)創建 DNS_QUERY */query = createQuery(argv[1]);/* DNS 查詢的十六進制轉儲 */printf("\nDNS Query (%i bytes):\n", query.len);if (query.len == 0)return -1;hexDump(query.bytes, query.len);ret = dnsLookup(&query);if (ret == -1){printf("dnsLookup fail!!!\n");return -1;}printf("\n");return 0; }編譯運行
總結
反向 DNS 是從 IP 地址對域名的 DNS 查找。 常規 DNS 請求從域名解析 IP 地址,而 rDNS 則相反,因此名稱相反。
域名是為了方便記憶而專門建立的一套地址轉換系統,要訪問一臺互聯網上的服務器,最終還必須通過IP地址來實現,域名解析就是將域名重新轉換為IP地址的過程。這一過程通過域名解析系統DNS來完成。
歡迎關注微信公眾號【程序猿編碼】,需要DNS反向源碼的添加本人微信號(c17865354792)
總結
以上是生活随笔為你收集整理的什么是DNS的正向解析与反向解析?代码实现?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编解码学习笔记(七):微软Windows
- 下一篇: python清屏幕_如何在python中