dnsmasq搭建DNS服務器詳解

參考:https://www.phpmianshi.com/?id=101


Dnsmasq 簡介

Dnsmasq 是一個輕量級的 DNS 緩存、DHCP、TFTP、PXE 服務器。

作爲域名解析服務器,dnsmasq 可以通過緩存 DNS 請求來提高對訪問過域名的解析速度。
作爲 DHCP 服務器,Dnsmasq 可以用於爲局域網電腦分配內網 IP 地址和提供路由。DNS 和 DHCP 兩個功能可以同時或分別單獨實現。

 

Dnsmasq 的應用場景


    1. 比如 Kubernetes 的 kube-dns 組件中就用 dnsmasq 容器作爲 DNS 服務器,用 kube-dns 容器作爲 dnsmasq 的上游服務器。dnsmasq 本身具有緩存功能,所以可以大大提高集羣中服務名的解析速度,而不需要每次解析請求都訪問 kube-dns 容器。

    2. 實現 DNS 劫持功能。在自己的服務器上使用taobao.com就訪問自己指定的IP,雖然使用本地hosts文件也可以實現,但是在當下的集羣服務環境下管理那麼多IP地扯池是非常繁瑣的。

 

    3. 在一些dev環境或者辦公環境中,無論是使用或是配置上都更加快捷和簡單

 

Dnsmasq 的工作原理

Dnsmasq 在接受到用戶的一個 DNS 請求時,首先會查找 /etc/hosts 這個文件,如果 /etc/hosts 文件沒有請求的記錄,然後查找 /etc/resolv.conf 中定義的外部 DNS(也叫上游 DNS 服務器,nameserver 配置),外部 DNS 通過遞歸查詢查找到請求後響應給客戶端,然後 dnsmasq 將請求結果緩存下來(緩存到內存)供後續的解析請求。

配置 Dnsmasq 爲 DNS 緩存服務器,同時在 /etc/hosts 文件中加入本地內網解析,這樣一來每當內網機器查詢時就會優先查詢 hosts 文件,這就等於將 /etc/hosts 共享給全內網機器使用,從而解決內網機器互相識別的問題。相比逐臺機器編輯 hosts 文件或者添加 Bind DNS 記錄,僅編輯一個 hosts 文件,這簡直太容易了。\

 

DNS反劫持:
bogus-nxdomain=x.x.x.x
x.x.x.x是劫持域名的服務器地址,可以通過ping一個不存在的域名得到。如ping bucunzai.com。
DNS反污染:
將會被污染的域名發送到不會污染的域名服務器
server=/www.google.com/8.8.8.8
去廣告:
把廣告域名解析爲空:
address=/www.guanggao.com/0.0.0.0

 

Dnsmasq 安裝和配置

Dnsmasq 的安裝特別簡單,以 Centos7 下安裝爲例:
 

sudo yum install -y dnsmasq
vim /etc/dnsmasq.conf 

#監聽本機ip地址 listen-address=127.0.0.1
#如果你想讓本機所在的局域網的電腦也能夠使用上Dnsmasq,應該把本機的局域網IP加上:listen-address=172.21.0.15,127.0.0.1
listen-address=172.21.0.15,127.0.0.1

resolv-file配置上游DNS服務器,如果不開啓就使用linux主機默認的/etc/resolv.conf裏的nameserver
resolv-file=/etc/resolv.conf

#實際解析按照resolv-file中從上到下dns server的順序進行指派解析
strict-order 

#address 可以將指定的域解析爲一個IP地址,即泛域名解析。
# 強制解析域名 將*.phpmianshi.com 解析到10.10.10.10
address=/phpmianshi.com/10.10.10.10

#指定上游DNS服務器 把所有.com的域名全部通過 114.114.114.114 這臺國內DNS服務器來解析
server=/com/114.114.114.114

#本地主機解析記錄 如果你項讀取其他類似/etc/hosts文件,則進行配置
addn-hosts=/etc/hosts
vim /etc/hosts
#解析記錄
10.10.33.22 test.phpmianshi.com
10.10.33.21 test2.phpmianshi.com
10.4.29.106      www.taobao.com
10.4.24.116      www.baidu.com


注意:/etc/hosts 文件修改後需要重啓 dnsmasq,否則修改不會生效。一定要確定是真的重啓了,可以先關閉,netstat -lnp |grep 53 看是否還在監聽。

#重啓
systemctl restart dnsmasq
# 設置爲開機自啓動
systemctl enable dnsmasq
# 啓動 dnsmasq 服務
systemctl start dnsmasq



我們搭建的 DNS 服務器地址爲:172.21.0.15


使用 dig 命令指定 DNS 服務器地址來查看解析是否生效:
 

dig @172.21.0.15 phpmianshi.com

;; QUESTION SECTION:
;phpmianshi.com.                    IN      A

;; ANSWER SECTION:
phpmianshi.com.             0       IN      A       10.10.10.10


驗證 Dnsmasq 緩存功能是否生效

首先使用 dig 查詢一個之前未查詢過的域名,然後看響應時間是多少:178 msec

第一次 dig:
 

dig @172.21.0.15 meichaxun.com

;; QUESTION SECTION:
;meichaxun.com.                 IN      A

;; ANSWER SECTION:
meichaxun.com.          3600    IN      A       47.74.46.59

;; Query time: 178 msec
;; SERVER: 172.21.0.15#53(172.21.0.15)
;; WHEN: Tue May 26 18:35:34 CST 2020
;; MSG SIZE  rcvd: 58

  

第二次 dig:Query time: 0 msec 說明第二次直接是從緩存中取的數據,沒有向上遊服務器發起請求。

 

Dnsmasq 的緩存在哪裏?如何查看?

dnsmasq 的緩存並不是保存在本地磁盤的某個文件,而是存儲在內存中,因此是無法直接查看的。

 

當然作爲一個 Geek,想要查看緩存的內容也是有辦法的:
1.dnsmasq 啓動參數添加 --log-queries
 

vi /usr/lib/systemd/system/dnsmasq.service
ExecStart=/usr/sbin/dnsmasq -k 改爲:ExecStart=/usr/sbin/dnsmasq -k --log-queries




2.重新加載 Systemd Unit 配置文件
 

systemctl daemon-reload



3.重啓 dnsmasq
 

systemctl restart dnsmasq



4.執行如下命令 dump 出來緩存內容到 journal 日誌

kill -SIGUSR1 <PID>


5.查看 dump 出來的 dns 記錄(dnsmasq 當前緩存的內容)

 

dig @172.21.0.15 meichaxun.com
journalctl -u dnsmasq
#最下面找到如下信息,看到了緩存的內容
May 26 18:41:42 VM_0_15_centos dnsmasq[15339]: query[A] meichaxun.com from 172.2
1.0.15
May 26 18:41:42 VM_0_15_centos dnsmasq[15339]: cached meichaxun.com is 47.74.46.
59

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章