如何自建 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 服務器設置為此服務器地址,理應能正常查詢。


CC BY-SA 4.0

本文使用 CC BY-SA 4.0 授權

標籤:

分類:

更新時間: