如何自建 DNS 服務器
在合理網絡節點自建 DNS 服務器,可以優化域名解析速度。本文操作以 Arch Linux 為例。
首先安裝dnsmasq
,然後備份dnsmasq
的原配置文件。
sudo pacman -S dnsmasq
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.default
dnsmasq配置
創建新的/etc/dnsmasq.conf
,編輯其內容如下
# replace with your net interfaces
interface=lo,eth0
cache-size=2048
strict-order
no-resolv
server=1.1.1.1
server=1.0.0.1
server=8.8.8.8
server=8.8.4.4
server=208.67.222.222
server=208.67.220.220
address=/xxx.com/127.0.0.2
如果網絡環境依賴於某些預配置的 dns 服務器(通常能於/etc/resolv.conf
中查到),需要依照server=x.x.x.x
的格式,將他們緊接在no-resolv
下方。
本文自建的 DNS 服務器,不是完全意義上的 DNS,而是一個從第三方 DNS 服務商獲取記錄的緩存器。其工作原理如下,當外部用戶首次訪問此 DNS 服務器,提供 dns 查詢服務的 dnsmasq 如發現本地沒有緩存記錄,便會向server
們按順序查詢(strict-order
保證了順序不被隨機)(這裡選用三大 dns 服務商作為上游服務器),查詢到後便不再訪問後面的server
。dnsmasq 會把此結果返回給 client,然後記錄此查詢結果,並緩存於本地(緩存記錄的數量由cache-size
決定)。
利用 dnsmasq 可為預定義域名指定地址記錄的功能,可以達成屏蔽某些域名的目的:如address=/xxx.com/127.0.0.2
使得xxx.com
被解析為無效地址127.0.0.2
,則xxx.com
被事實屏蔽。可以將一些常見的廣告商域名加入,以達到過濾網頁廣告的目的。
系統配置
此步非必須。
如果想讓 dnsmasq 所在的服務器本身也享受到 dnsmasq 所提供的服務,則需要更改/etc/resolv.conf
。在此之前,記得先備份原配置。
sudo cp /etc/resolv.conf /etc/resolv.conf.default
然後更改/etc/resolv.conf
至如下
nameserver 127.0.0.1
至此本機的 dns 查詢會依照/etc/resolv.conf
的指示訪問127.0.0.1:53
,即本地 dnsmasq 服務器。這要求本地 dnsmasq 服務器不能依賴性讀取/etc/resolv.conf
,否則變成為無限套娃——故/etc/dnsmasq.conf
配置中有一句no-resolv
,正是為了避免此種情景。
開啟與測試
sudo systemctl enable --now dnsmasq.service
如果前面一步對 server 本身進行了配置,那麼使用 dig 來查詢某個域名,應該能正常返回結果,且看到SERVER
顯示為127.0.0.1
。
在第三方測試機上將 dns 服務器設置為此服務器地址,理應能正常查詢。