如何使用 DNSMAQ 搭建 DNS 服务器?
作者 |?阿文
責編 |?郭芮
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<<-?opcode:?QUERY,?status:?NOERROR,?id:?26189
 ;;?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地址。
- MX 郵件記錄(Mail eXchange),返回接收電子郵件的服務器地址。
- CNAME 規范名稱記錄(Canonical Name),返回另一個域名,即當前查詢的域名是另一個域名的跳轉。
- PTR 逆向查詢記錄(Pointer Record),只用于從IP地址查詢域名
- CAA CAA(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.配置文件在 /etc/dnsmasq.conf,我們要讓它能用起來需要做如下配置:  
?
????#指定上游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.創建 /etc/resolv.dnsmasq.conf ?,然后添加:
?
????#?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.然后創建 /etc/dnsmasq.d/cloud.conf,添加:
?
????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廣告
格式是:
?
address=/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,PREFERRED>
 ????????outif?(null)
 ????????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<<-?opcode:?QUERY,?status:?NOERROR,?id:?41523
 ????;;?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】
Python入門到進階思維導圖分享
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
?熱 文?推 薦?
?
點擊閱讀原文參與開發者大調查,好禮送不停!
總結
以上是生活随笔為你收集整理的如何使用 DNSMAQ 搭建 DNS 服务器?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: [NOI2018] 归程(线段树维护并查
- 下一篇: Zju2112 Dynamic Rank
