作者 | 阿文
DNSmasq是一個小巧且方便地用於配置DNS和DHCP的工具,適用於小型網絡,它提供了DNS功能和可選擇的DHCP功能。自己搭建公共DNS更加靈活,如果是在本地搭建,還可以大幅提高解析速度。
相比較BIND那複雜的配置來說,dnsmasq輕量很多。

概念
首先,我們需要了解幾個概念,即根服務器和 DNS 的解析步驟方便大家理解。
根域名服務器(root name server)是互聯網域名解析系統(DNS)中最高級別的域名服務器,負責返回頂級域名的權威域名服務器的地址。我們在網址中鍵入的域名,其背後都需要通過 DNS 系統去解析返回 IP,從而讓用戶訪問指定的服務器資源。而 DNS 查詢解析記錄並不是直接去根服務器去查詢,而是逐級遞歸往上一層一層的去查。
目前世界上共計有 13 臺根服務器,由12 個不同的獨立組織運營,其中美國控制的有10臺,歐洲2臺,位於英國和瑞典,亞洲1臺位於日本。具體的根服務器信息,可也在 https://root-servers.org/ 查看。
我們可以使用 dig 命令去查看即可,如下所示:
# dig
; <<>> DiG 9.10.6 <<>> @114.114.114.114
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<189
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 658 IN NS a.root-servers.net.
. 658 IN NS b.root-servers.net.
. 658 IN NS c.root-servers.net.
. 658 IN NS d.root-servers.net.
. 658 IN NS e.root-servers.net.
. 658 IN NS f.root-servers.net.
. 658 IN NS g.root-servers.net.
. 658 IN NS h.root-servers.net.
. 658 IN NS i.root-servers.net.
. 658 IN NS j.root-servers.net.
. 658 IN NS k.root-servers.net.
. 658 IN NS l.root-servers.net.
. 658 IN NS m.root-servers.net.
;; Query time: 39 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Wed Jun 26 17:30:51 CST 2019
;; MSG SIZE rcvd: 239
可以看到,根服務器以 A到 M 開頭的二級域名後面跟上 root-servers.net ,正好是 13 臺,但是這 13 並不是物理上的 13 臺,而是邏輯上的 13 臺,其背後擁有幾百臺的鏡像機器來為其分擔請求,全球很多國家都有根服務器的鏡像,這些鏡像服務器主要是用來分擔根服務器的負載。
一次DNS 查詢可以短到兩個包:一個查詢包、一個響應包,顧名思義,查詢包是用來發送查詢的,例如你要查詢www.baidu.com 的解析結果,而響應包則會返回解析結果給你。
事實上,一個 DNS 的查詢過程非常複雜,它分成很多個步驟:
第一步:客戶機提出域名解析請求,並將該請求發送給本地的域名服務器。
第二步:當本地的域名服務器收到請求後,就先查詢本地的緩存,如果有該紀錄項,則本地的域名服務器就直接把查詢的結果(域名對應的IP地址)返回。
第三步:如果本地的緩存中沒有該紀錄,則本地域名服務器就直接把請求發給根域名服務器,然後根域名服務器再返回給本地域名服務器一個所查詢域(根的子域) 的主域名服務器的地址。
第四步:本地服務器再向上一步返回的域名服務器發送請求,然後接受請求的服務器查詢自己的緩存,如果沒有該紀錄,則返回相關的下級的域名服務器的地址。
第五步:重複第四步,直到找到正確的紀錄。
第六步:本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時還將結果返回給客戶機。
DNS服務器通過分級查詢逐級獲取到對應域名的 IP 地址,大致過程如下:
從"根域名服務器"查到"頂級域名服務器"的NS記錄和A記錄;
從"頂級域名服務器"查到"次級域名服務器"的NS記錄和A記錄;
從"次級域名服務器"查出"主機名"的IP地址。
這裡提到了一些概念,例如 NS A 記錄,這些是 DNS 的記錄類型,常見的記錄類型有:
A地址記錄(Address),返回域名指向的IP地址。
NS域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設置為域名,不能設置為IP地址。
CNAME規範名稱記錄(Canonical Name),返回另一個域名,即當前查詢的域名是另一個域名的跳轉。
PTR逆向查詢記錄(Pointer Record),只用於從IP地址查詢域名
CAACAA(Certification Authority Authorization,證書頒發機構授權)是一項防止HTTPS證書錯誤頒發的安全措施,遵從IETF RFC6844。從2017年9月8日起,要求CA(Certification Authority,證書頒發)機構執行CAA強制性檢查。
通常來說,為了服務的安全可靠,至少應該有兩條NS 記錄,而A記錄和MX記錄也可以有多條,這樣就提供了服務的冗餘性,防止出現單點失敗。
DNS 並不安全
事實上,DNS 是一個很古老的協議,其設計並非完美,存在很多問題,比如劫持、不加密等問題。那麼什麼是 DNS 劫持呢?
DNS劫持又稱域名劫持,是指通過某些手段取得某域名的解析控制權,修改此域名的解析結果,導致對該域名的訪問由原IP地址轉入到修改後的指定IP,其結果就是對特定的網址不能訪問或訪問的是假網址。
如果可以冒充域名服務器,然後把查詢的IP地址設為攻擊者的IP地址,這樣的話,用戶上網就只能看到攻擊者的主頁,而不是用戶想要取得的網站的主頁了,這就是DNS劫持的基本原理。
DNS 劫持危害十分嚴重,輕則導致不能上網,影響網速,重則導致被黑客誘導到惡意網站,導致個人財產和信息洩露或者發佈惡意廣告。
因此,一般我們建議大家把 DNS 地址修改為公共的 DNS,如上面我們所說的 DNS 原理,公共的 DNS 由於使用人數多,其緩存數據更新也比一般的 DNS 要快,解析結果更準確,此外,其帶來的一個好處就是避免被劫持。
目前也有其他的方案可以防止劫持,例如 DNSSEC,域名系統安全擴展,DNSSEC旨在保護應用程序(以及服務這些應用程序的緩存解析器)免受偽造或不當操縱的DNS數據所造成的影響例如域名服務器緩存汙染的數據。來自DNSSEC保護區的所有答案都經過數字簽名。通過檢驗數字簽名,DNS解析器可以核查信息是否與區域所有者發佈的信息相同(未修改和完整),並確係實際負責的DNS服務器所提供。
或者可以自己搭建一個 DNS 服務器。例如在本地搭建一個 dnsmaq 小型的 DNS 服務器來防止劫持。
安裝dnsmaq
以 centos 7 為例,直接執行如下命令:
yum -y install dnsmasq
配置
1.配置文件在 <code>/etc/dnsmasq.conf/<code>,我們要讓它能用起來需要做如下配置:
#指定上游dns服務器
resolv-file=/etc/resolv.dnsmasq.conf
#表示嚴格按照 resolv-file 文件中的順序從上到下進行 DNS 解析, 直到第一個成功解析成功為止
strict-order
# 開啟後會尋找本地的hosts文件在去尋找緩存的域名,最後到上游dns查找
#no-resolv
listen-address=0.0.0.0 #0.0.0.0 設置為公網IP
conf-dir=/etc/dnsmasq.d # 我們的解析記錄都寫到這個目錄下
2.創建 <code>/etc/resolv.dnsmasq.conf/<code>,然後添加:
# cat /etc/resolv.dnsmasq.conf
nameserver 119.29.29.29
nameserver 114.114.114.114
nameserver 8.8.8.8
nameserver 168.95.1.1
3.然後創建 <code>/etc/dnsmasq.d/cloud.conf/<code>,添加:
address=/baidu.com/127.0.0.1 #將百度的域名解析到127.0.0.1
address=/ad.youku.com/127.0.0.1 # 禁止優酷廣告
address=/ad.iqiyi.com/127.0.0.1 # 禁止iqiyi廣告
格式是:
a
ddress=/domain.com/dns
比如上面的百度,我就把它都解析到127.0.0.1。
實現DNS分流
server=/cn/114.114.114.114 # cn的域名都走114的dns
server=/google.com/115.159.220.214 # 將谷歌的解析都走115.159 .220.214
上面的是將所有cn結尾的域名都走114解析,下面是將google.com 走115.159.220.214解析。
開啟防火牆53端口後,本地測試下 53 端口是否是通的:
➜ www nc -vuz 121.42.18.6 53
found 0 associations
found 1 connections:
1: flags=82<connected>
outif
src 192.168.2.32 port 49939
dst 121.42.18.6 port 53
rank info not available
Connection to 121.42.18.6 port 53 [udp/domain] succeeded!
啟動dnsmaq:
service dnsmasq start
設置為開機自啟動。
# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
測試
➜ www dig m.baidu.com @121.42.18.6
; <<>> DiG 9.8.3-P1 <<>> m.baidu.com @121.42.18.6
;; global options: +cmd
;; Got answer:
;; ->>HEADER<1523
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;m.baidu.com. IN A
;; ANSWER SECTION:
m.baidu.com. 0 IN A 127.0.0.1
;; Query time: 30 msec
;; SERVER: 121.42.18.6#53(121.42.18.6)
;; WHEN: Mon Aug 28 10:32:27 2017
;; MSG SIZE rcvd: 45
可以看到,百度的子域名已經被解析到127.0.0.1了,此外還可以配合dnscrypt-proxy 對查詢進行加密,這裡就不展開了。
【End】
閱讀更多 CSDN 的文章