DNS簡析

Introduction

DNS: Domain Name System,指的是整一個系統,而不是一個特定的機器
NS: Nameserver,提供域名解析服務的機器,給它一個域名,它會給你解析出ip或者給你對應的NS信息
DNS server: 代替用戶的機器向NS查詢域名<->ip
A記錄 -> 域名 -> ip,直接給你ip
NS記錄 -> 域名 -> NS,給你一個NS地址php

Name Server架構

DNS 利用相似樹狀目錄的架構,將主機名稱的管理分配在不一樣層級的 DNS 服務器當中,經由分層管理, 因此每一部 DNS 服務器存儲的數據就不會不少linux

Layer host name domain name
頂級 edu .tw
二級 ksu edu.tw
三級 www ksu.edu.tw

分層管理機制

  • 每部機器只管理下一層的 hostname 對應 IP
  • 至於下層的下層,則受權給下層的 DNS 主機來管理

分層查詢機制

這裏給出一個不太嚴謹的例子。這裏以查詢www.baidu.com 爲例, 展現DNS服務器如何一級級地查詢到它的IP地址,中間要通過三個NS。若是DNS服務器裏面有緩存(一段時間失效),就能夠直接報給client。緩存

下面使用dig +trace來模擬DNS查詢出南京大學小百合bbs的地址安全

dig +trace bbs.nju.edu.cn

; <<>> DiG <<>> +trace bbs.nju.edu.cn
;; global options: +cmd
.            3230    IN    NS    g.root-servers.net.
.            3230    IN    NS    e.root-servers.net.
.            3230    IN    NS    m.root-servers.net.
.            3230    IN    NS    l.root-servers.net.
.            3230    IN    NS    d.root-servers.net.
.            3230    IN    NS    b.root-servers.net.
.            3230    IN    NS    i.root-servers.net.
.            3230    IN    NS    h.root-servers.net.
.            3230    IN    NS    a.root-servers.net.
.            3230    IN    NS    k.root-servers.net.
.            3230    IN    NS    j.root-servers.net.
.            3230    IN    NS    c.root-servers.net.
.            3230    IN    NS    f.root-servers.net.
;; Received 460 bytes from 127.0.1.1#53(127.0.1.1) in 8 ms

cn.            172800    IN    NS    b.dns.cn.
cn.            172800    IN    NS    a.dns.cn.
cn.            172800    IN    NS    ns.cernet.net.
cn.            172800    IN    NS    e.dns.cn.
cn.            172800    IN    NS    d.dns.cn.
cn.            172800    IN    NS    c.dns.cn.
;; Received 513 bytes from 192.5.5.241#53(f.root-servers.net) in 300 ms

edu.cn.            172800    IN    NS    ns2.cuhk.hk.
edu.cn.            172800    IN    NS    deneb.dfn.de.
edu.cn.            172800    IN    NS    dns.edu.cn.
edu.cn.            172800    IN    NS    dns2.edu.cn.
edu.cn.            172800    IN    NS    ns2.cernet.net.
;; Received 716 bytes from 203.119.25.1#53(a.dns.cn) in 30 ms

NJU.edu.cn.        172800    IN    NS    DNS.NJU.EDU.CN.
NJU.edu.cn.        172800    IN    NS    NS.NJU.EDU.CN.
;; Received 131 bytes from 202.112.0.35#53(dns.edu.cn) in 3639 ms

bbs.nju.edu.cn.        10800    IN    A    210.28.129.4
;; Received 59 bytes from 202.119.32.12#53(NS.NJU.EDU.CN) in 167 ms

簡化過程以下:服務器

  • 查詢cn
    127.0.0.1 -> f.root-servers.net
  • 查詢edu.cn
    127.0.0.1 -> a.dns.cn
  • 查詢nju.edu.cn
    127.0.0.1 -> dns.edu.cn
  • 查詢bbs.nju.edu.cn
    127.0.0.1 -> NS.NJU.EDU.CN

這是一個企業級的網站的例子,能夠看出架構

  • 除了最後一步,向Nameserver查詢獲得的記錄都是Nameserver的地址
  • 本身搭建的網站須要有一個本身的Nameserver,存儲本身的網站的ip
  • 本身搭建的網站的Nameserver要向上一級登記
  • 查詢的時候用wireshark抓包,發現本機只和系統指定的DNS服務器通信,說明這些操做目前由DNS服務器來處理。
  • 前面的查詢記錄都是NS記錄,也就是Nameserver的地址,最後一個記錄是A記錄,也就是bbs.nju.edu.cn真正的地址。
  • 這裏會顯示一些數字,也就是DNS查詢結果的TTL
  • NS也有A記錄,由於查詢的過程當中要鏈接NS。

若是搭建一個很簡單的網站,也能夠不用創建Nameserver,向上一級申請填寫你的主機名和ip,這樣就簡便多了。這樣在DNS查詢的最後一步,結果是直接指向你的網站,而不是指向你的網站的dns服務器less

Name Server之間的Master-Slave架構

解析一個域的DNS服務器能夠有多個。這樣數據的同步更新就是一個問題了,因此有了Master-Slave架構。dom

當Master更新了數據以後,Slave會向其拿更新的數據,這樣維護DNS的時候就不用每一臺都去更新了。tcp

DDNS

當你從ISP得到動態IP的時候,IP常常變換的狀況就會顯得很不方便。DDNS機制使得你能夠頻繁地將本身的IP報告給NS,而後Internet上面的DNS主機須要頻繁地更新解析的記錄(設定一個較短的最大緩存時間)。函數

底層協議

DNS一般使用基於port 53的UDP,有時候數據量太大的時候使用TCP

cat /etc/services  | grep 53
domain        53/tcp                # Domain Name Server
domain        53/udp

配置文件

/etc/hosts

用戶自定義的 ip <-> 域名

# cat /etc/hosts
127.0.0.1 localhost.
1.2.3.4 www.fake.com
3.4.5.6 www.fake1.com

/etc/resov.conf

存儲DNS服務器的地址,在DHCP以後,DHCP client會自動修改這個配置文件。

#cat /etc/resolv.conf 
# Generated by dhcpcd
nameserver 8.8.8.8

注意到,uclibc裏面的__dns_lookup函數,會使用__open_nameservers函數從這個文件裏面拿到的DNS服務器的地址,而後向這個地址發送DNS數據包。

相關命令

nslookup

Nslookup is a program to query Internet domain name servers. Nslookup has two modes: interactive and non-interactive

tan@tanhangbo-pc:~$ nslookup bbs.nju.edu.cn
Server:        127.0.1.1
Address:    127.0.1.1#53

Non-authoritative answer:
Name:    bbs.nju.edu.cn
Address: 210.28.129.4

tcpdump抓包結果以下,說明是進行了一次DNS查詢。

host

host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa

@query1
tan@tanhangbo-pc:~$ host bbs.nju.edu.cn
bbs.nju.edu.cn has address 210.28.129.4

@query2
tan@tanhangbo-pc:~$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.

@query3
tan@tanhangbo-pc:~$ host www.baidu.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 61.135.169.125
www.a.shifen.com has address 61.135.169.121

tcpdump抓包結果以下,說明是進行了一次DNS查詢。

能夠看出,host也能夠做爲反解,而且能夠指定DNS服務器的地址讓它進行查詢。

dig

dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and displays the answers that are returned from the name server(s) that were queried. Most DNS administrators use dig to troubleshoot DNS problems because of its flexibility, ease of use and clarity of output. Other lookup tools tend to have less functionality than dig

從man的介紹來看,dig的逼格是最高的,上面已有一個實例,就再也不介紹了。

總結

推薦程度來講,dig > host > nslookup

DNS安全問題

  • 由於DNS服務器是開放的,友好的,因此你發查詢數據的時候它會老老實實地返回一堆你要的數據。因此當你須要攻擊別人的時候,只須要僞造原地址爲別人的ip,向一堆DNS服務器發送查詢,那麼這些DNS服務器的查詢結果就如洪水般淹沒他家的網口。
  • DNS服務器自己若是被攻破,那麼返回的ip地址不必定就是對的,那麼沒有HTTPS保護的網站可能會被僞冒。
  • DNS服務器和客戶端之間是沒有認證的,因此你能夠站在那臺真實的服務器以前攔截你的數據,告訴你一個假的地址。

Reference

http://linux.vbird.org/linux_server/0350dns.php



相關文章
相關標籤/搜索