1. 程式人生 > >在滴滴雲 DC2 雲伺服器上搭建本地 DNS 服務

在滴滴雲 DC2 雲伺服器上搭建本地 DNS 服務

搭建本地 DNS 伺服器具有很多用處,例如作為本地 DNS 使用、應對 ISP 的 DNS 劫持、智慧 DNS 加快解析速度、遮蔽網頁廣告、指定域名解析到特定的 IP 上等。

一、DNS 查詢過程簡介

DNS 是網路分層裡的應用層協議,事實上它是為其他應用層協議工作的,簡單說就是把域名轉化為 IP 地址(同時也提供反向域名查詢的功能),因為機器識別的是擁有固定格式和含義的 IP 地址,而域名則沒有固定格式,不利於機器識別,因此當訪問某個域名,如 http://www.google.com ,實際訪問的是它的 IP 地址。

DNS 實際查詢過程分為多步,例如當用戶在位址列輸入一個 URL 之後,瀏覽器首先查詢瀏覽器快取,找不到就去查詢 Hosts 檔案和本地 DNS 快取,如果 Hosts 和本地 DNS 快取都沒有找到域名對應的 IP,則進入路由器的快取中檢查,若未找到則進入 ISP DNS 快取中查詢,最終才向根 DNS 伺服器發出 DNS 查詢報文,再找不到就報錯。DNS 主要使用 UDP 收發報文,也支援 TCP 收發,TCP、UDP 訪問均使用熟知埠 53。

二、使用 DNSmasq 搭建 DNS 服務

DNSmasq 是一個輕量級的 DNS、TFTP 和 DHCP 伺服器。它的目的是給區域網提供配對的 DNS 和 DHCP 服務。 DNSmasq 接受 DNS 查詢,並從一個小的本地快取記憶體應答它們或將其轉發到一個真正的遞迴 DNS 伺服器。該軟體也被安裝在路由器上來快取 DNS 查詢。DNSmasq 可以解決小範圍的 DNS 查詢問題,如果業務是跨機房、跨地區的話不建議使用 DNSmasq做為 DNS 解析伺服器。

2.1 DNSmasq 安裝

DNSmasq 可通過 yum 安裝或原始碼安裝,使用 yum 安裝時,執行:

yum install dnsmasq –y

如果想使用最新版本,可從官網下載原始碼包進行安裝,DNSmasq 官網為:http://www.thekelleys.org.uk/dnsmasq/doc.html , DNSmasq下載地址為:http://www.thekelleys.org.uk/dnsmasq/

tar –zxvf dnsmasq-2.76.tar.gz
cd dnsmasq-2.76
make install

2.2 DNSmasq 配置與使用

2.2.1 DNSmasq 的配置

DNSmasq 的配置在 /etc/dnsmasq.conf 中。DNSmasq 的查詢順序是先解析 Hosts 檔案,再解析 /etc/dnsmasq.d/

下的 *.conf 檔案,最後通過 /etc/resolv.conf 或自定義的 resolv-file 指定配置的上游 DNS 進行查詢。

本文僅對 DNSmasq 中 DNS 配置部分進行簡要介紹,更多詳細配置參考 /etc/dnsmasq.conf 註釋。

配置項 配置項說明
resolv-file 定義從哪獲取上游DNS伺服器的地址, 預設從/etc/resolv.conf獲取
strict-order 嚴格按照/etc/resolv.conf中的配置順序進行查詢,直到取得結果
listen-address 定義dnsmasq監聽的地址
no-hosts 不通過/etc/hosts進行本地DNS查詢
no-resolv 不通過/etc/resolv.conf或resolv-file配置進行上游DNS查詢
server 對不同域名指定使用不同的上游DNS,可用於智慧DNS加速
port 指定DNS埠,預設為53,port=0將完全禁用DNS功能
cache-size 快取條數,預設為150條
bogus-nxdomain 對於任何被解析到此IP的域名,響應NXDOMAIN使其解析失敗。通常用於訪問不存在的域名時,禁止其跳轉到運營商的廣告站點

首先配置 dnsmasq.conf,設定監聽地址及上游 DNS 伺服器地址,根據需要設定 DNS 查詢順序,域名解析策略等,例如:

resolv-file=/etc/resolv.dnsmasq.conf
strict-order      
listen-address=127.0.0.1

然後在 /etc/resolv.dnsmasq.conf 中新增需要的上游 DNS 地址,如:

echo 'nameserver 8.8.8.8' > /etc/resolv.dnsmasq.conf

修改 /etc/resolv.conf,新增本地 DNS 服務地址,如:

echo 'nameserver 127.0.0.1' > /etc/resolv.conf

配置完成後,先查詢配置是否正確(其他選項見 DNSmasq --help):

dnsmasq --test

確認配置無誤後,啟動 DNSmasq 服務:

service dnsmasq start

2.2.2 使用 DNSmasq 進行 DNS 查詢

通過 dig 或 host 命令可以進行 DNS 查詢,由於之前在 /etc/resolv.conf 中配置了本地 DNS,因此會首先通過 DNSmasq 進行本地查詢,查詢結果如下:

dig blog.didiyun.com

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> blog.didiyun.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31164
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;blog.didiyun.com.		IN	A

;; ANSWER SECTION:
blog.didiyun.com.	59	IN	CNAME	f2oviq.waf.didiyun.com.
f2oviq.waf.didiyun.com.	599	IN	A	116.85.0.249
f2oviq.waf.didiyun.com.	599	IN	A	116.85.0.248

;; Query time: 725 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Dec 17 19:19:21 CST 2018
;; MSG SIZE  rcvd: 102

域名地址對映變化頻率較低,為提高查詢效率,主機在啟動時從本地伺服器下載名和地址的全部資料,並維護存放自己最近使用的域名的快取,並且只在從快取中找不到名字時才使用根域名伺服器發起查詢。

在 DNS 查詢過程中,當一個 DNS 伺服器接收到一個 DNS 回答後,會將其資訊快取一段時間,當再有一個對相同域名的查詢時,便可直接回復。通過 DNS 快取,大部分查詢都只需要本地 DNS 伺服器便可完成解析。

在使用 DNSmasq時會發現,當一段時間內再次查詢相同域名時,會發現 Query time 減少為 0 msec。

2.2.3 清除 DNSmasq 的 DNS 快取

有時 DNS 快取可能存在被汙染的風險(e.g. 路由器被攻擊導致域名 DNS 快取被修改,或某個域名地址對映發生變更),此時可以通過清除快取來讓本地 DNS 伺服器重新回到上級 DNS 進行查詢。DNSmasq 服務只需重新啟動即可清除 DNS 快取:service dnsmasq restart