如何使用 DNSMAQ 搭建 DNS 服務器?

如何使用 DNSMAQ 搭建 DNS 服務器?

作者 | 阿文

DNSmasq是一個小巧且方便地用於配置DNS和DHCP的工具,適用於小型網絡,它提供了DNS功能和可選擇的DHCP功能。自己搭建公共DNS更加靈活,如果是在本地搭建,還可以大幅提高解析速度。

相比較BIND那複雜的配置來說,dnsmasq輕量很多。

如何使用 DNSMAQ 搭建 DNS 服务器?

概念

首先,我們需要了解幾個概念,即根服務器和 DNS 的解析步驟方便大家理解。

根域名服務器(root name server)是互聯網域名解析系統(DNS)中最高級別的域名服務器,負責返回頂級域名的權威域名服務器的地址。我們在網址中鍵入的域名,其背後都需要通過 DNS 系統去解析返回 IP,從而讓用戶訪問指定的服務器資源。而 DNS 查詢解析記錄並不是直接去根服務器去查詢,而是逐級遞歸往上一層一層的去查。

目前世界上共計有 13 臺根服務器,由12 個不同的獨立組織運營,其中美國控制的有10臺,歐洲2臺,位於英國和瑞典,亞洲1臺位於日本。具體的根服務器信息,可也在 https://root-servers.org/ 查看。

如何使用 DNSMAQ 搭建 DNS 服务器?

我們可以使用 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 的解析結果,而響應包則會返回解析結果給你。

如何使用 DNSMAQ 搭建 DNS 服务器?

事實上,一個 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地址查詢域名

  • CAACAA(Certification Authority Authorization,證書頒發機構授權)是一項防止HTTPS證書錯誤頒發的安全措施,遵從IETF RFC6844。從2017年9月8日起,要求CA(Certification Authority,證書頒發)機構執行CAA強制性檢查。

通常來說,為了服務的安全可靠,至少應該有兩條NS 記錄,而A記錄和MX記錄也可以有多條,這樣就提供了服務的冗餘性,防止出現單點失敗。

如何使用 DNSMAQ 搭建 DNS 服务器?

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 搭建 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。

如何使用 DNSMAQ 搭建 DNS 服务器?

實現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.

如何使用 DNSMAQ 搭建 DNS 服务器?

測試

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】


分享到:


相關文章: