OpenWrt開發:39---DNS域名解析系統(/etc/resolv.conf)

一、DNS介紹

  • 前一篇文章介紹的主機系統適合小型網絡等一些特殊的場景。在因特網中,主機地址非常龐大,並且主 機的IP地址經常改變,因此使用域名系統 DNS 代替主機系統
  • DNS 可以被視爲一種用於 TCP/IP 應用程序的分佈式數據庫,它提供主機名字和 IP 地址間的相互轉換。這裏提到的分佈式是指在因特網上的單個站點不能擁有所有的信息。每 個站點(如大學中的系、校園、公司或公司的部門)保留它自己的信息數據庫,並運行一 個服務器程序供因特網上的其他系統查詢

二、域名結構

  • 其最頂端有一個未命名的根節點,然後其下分爲好幾個基本類別名稱(稱 爲頂層域名),例如 com、org、net 和 gov 等 3 字符域名,還有 cn、sg、jp 和 us 等兩個字 符國家地區域名
  • 每個節點有一個至多 63 個字符長的標識,域名總長度則不能超過 253 個字符。命名標識中不區分大寫和小寫
  • 命名樹上任何一個節點的域名就是將從該節點到 最高層的域名串連起來,中間使用一個點“.”分隔這些節點。例如,一個完整的域名爲 www.bjbook.net
  • 域名樹中的每個節點必須有一個唯一的名稱,但域名樹中的不同層級節 點可使用相同的標識,只要在不同的父節點下即可

三、DNS報文格式

  • DNS採用客戶機/服務器模型。DNS默認使用TCP和UDP端口 53。DNS的請求和應答封裝在UDP報文中

會話標識

  • 報文頭部的會話標識字段由客戶端生成隨機值填充並由服務器原樣 返回。客戶端通過該字段來匹配請求和響應

flags

  • flags部分非常複雜,如果是請求一般爲0x0100。如果爲響應,通常有兩種情況:0x8182表示服務器失敗;0x8180表示服務器 成功響應

問題數目、回答資源記錄數、授權資源記錄數目、額外資源記錄數目

  • 對於查詢報文,問題數目通常是1,而其他3項則均爲0。對於應答報文,問題數目還是1,回答數至少是1

問題

  • 問題部分中每個問題的格式由 3 部分順序組成:查詢內容、類型(Type)和類(Class)。 類型和類均爲固定的兩個字節長度
  • 查詢內容長度不定,它是一個或多個標識符的序列。每個標識符以首字節的計數值來 說明隨後字符串的字節長度,每個名字的最後字節爲 0 表示結束。計數字節的值必須是 0~ 63 的數字,因爲標識符的最大長度爲 63。高位字節爲二進制 11 時,用於壓縮格式,指向 報文的查詢字符串位置,字符串位置是從 DNS 報文頭部開始計算的

回答資源記錄、授權資源記錄、附加信息資源記錄

  • DNS 報文中最後 3 個字段分別爲回答字段、授權字段和附加信息字段,均採用資源記 錄(Resource Record,RR)格式。資源記錄格式內容順序包含域名、類型、類、生存時間、 數據長度和數據6部分
  • 如下圖所示:域名是記錄中資源數據對應的名字。它的格式和前面介紹的查詢名字段格式相同。類 型和類與問題域內容格式相同。生存時間字段佔4個字節,是客戶程序保留該資源記錄的 秒數,這裏已轉換爲 15 分鐘。資源數據長度佔兩個字節長度。數據部分的格式依賴於類型字段的值,這裏的資源數據是4字節的IP地址

四、域名解析器原理

  • 用戶程序通過解析器與名字服務器交互;用戶查詢和響應是 C 語言編程接口的入參和 返回值,用戶查詢一般是調用 getaddrinfo 函數獲取 IP 地址,Linux 操作系統通常不緩存查 詢結果,每次均調用接口函數進行查詢。現在域名解析器動態庫已經成爲 Linux 主機操作 系統的一部分,供給每一個進程使用
  • 注意,如果未配置名字服務器,解析器將默認向 127.0.0.1 發起查詢

下圖所示爲 Linux 系統的 DNS 解析實現原理。解析器通常對幾個不同的名字服務 器進行多個查詢,才能回答特定用戶的查詢,因此用戶域名查詢可能涉及對幾個網絡的訪問和很長的時間

  • ①解析庫首先查詢主機執行流程,查詢hosts文件是否有對應域名配置
  • ②如果host文件沒有該域名,則在resolv.conf文件中取出第一個域名服務器地址
  • ③然後向域名服務器地址發起域名查詢請求
  • ④等待查詢響應。如果超時,則向下一個域名服務器發起查詢

/etc/resolv.conf配置文件

  • 域名解析器提供因特網域名系統(DNS)的解析C函數庫。解析器配置文件名默認爲resolv.conf,包含C函數庫所需的信息,域名解析時首先讀取這個文件
  • 這個文件的可讀 性非常好,包含一系列的關鍵詞,提供各種類型的解析器信息
  • 常見的配置如下:
    • nameserver:用於配置名字服務器,最多可以設置 3 個名字服務器,每一行一個。 如果有多個名字服務器地址,解析庫將按照列表順序查詢。若第一個名字服務器查詢超 時,再順序查詢下面的名字服務器,直到所有的名字服務器都嘗試一遍。如果沒有名 字服務器地址或者這個配置文件不存在,則默認使用本機(127.0.0.1)作爲名字服務器 地址
    • domain:可以使用相對於本地域名的短名來查詢。如果域名沒有配置,則返回主機名
    • search:search 定義域名的搜索列表,當要查詢沒有域名的主機時,將在由 search 聲明的域中分別順序進行查找,是隻有使用短名時所要附加的域名後綴。domain 和 search 不能共存,如果同時存在,後面出現的將覆蓋前面的定義

五、域名解析實例

①沒有/etc/resolv.conf 配置文件

  • 解析庫默認向本機(127.0.0.1)發起域名查詢,因 OpenWrt 本身帶有 dnsmasq 提供服 務,因此可以返回響應
  • 下圖爲訪問域名時的請求和響應報文

②配置多個域名服務器地址

  • resolv.conf 配置如下:

  • ping 163.com:首先向第一個服務器 59.108.61.61 發起查詢 163.com 的 IP 地址,如果 查不到將使用下一個域名服務器來進行查詢

③配置有domain

  • resolv.conf配置如下圖所示,這種情況下如果訪問完全合格域名,則直接向域名 服務器發起查詢;如果不是完全合格域名,則首先在 hosts 文件中進行查找,如果在 hosts 文件中找不到主機名的 IP 地址,則再向名字服務器發起查詢請求。如果是不帶點的字符 串,則加上域名後綴向名字服務器發起查詢請求,如果中間帶有點,則認爲是一個域名, 將不用加上域名後綴,直接使用該字符串向名字服務器發起請求

  • ①執行“ping 163.com”命令,首先在 hosts 文件中查詢主機 163.com 的 IP 地址, 如果查不到將直接向名字服務器查詢 163.com 的 IP 地址,找到後向目的 IP 發起 ICMP 請求
  • ②執行“ping openwrt”命令,首先在 hosts 文件中查詢主機 openwrt 的 IP 地址,如 果查不到將拼接域名後綴“bjbook.net”,然後向名字服務器查詢 openwrt.bjbook.net 的 IP 地址,找到後向目的 IP 發起 ICMP請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章