在過去我們會使用 Bind 來做 DNS resolver 查詢 (allow-recursive),但實際有拿來當成 resolver 的人有可能會遇到 recursive query 問不到的狀況,這在我上一間公司就遇到了很多次 .. 而且加上 Bind 安全性的問題,漸漸的開始有一些取代的方案出現,本篇介紹的就是 Unbound 這套專門處理 Resolver query 的 DNS
Unbound 是一個 open source project,官方介紹:
Unbound is a validating, recursive, and caching DNS resolver
同時他也支援 DNSSEC 和 stub-resolver
Unbound is designed as a set of modular components, so that also DNSSEC (secure DNS) validation and stub-resolvers (that do not run as a server, but are linked into an application) are easily possible.
Ubuntu 16.04 安裝 Unbound
Unbound 的安裝非常簡單,在這之前可以先參考 Documentation。
Step 1. 直接用 apt 安裝 unbound
$ sudo DEBIAN_FRONTEND=noninteractive apt-get -y install unbound
Step 2. 設定 interface,和可以查詢的網路 (192.168.0.0/24)
$ sudo tee /etc/unbound/unbound.conf.d/interface.conf <<EOF server: access-control: 192.168.0.0/24 allow interface: 0.0.0.0 interface: ::0 EOF
Step 3. 設定在 cache 消失之前會預先去要更新的資料回來,讓 cache 不會消失,好處是 client 不需要再等待 Unbound 去要新的 dns record 回來,但 Unbound 則會增加約 10% 的負載和流量,因為只要問過之後這個 cache 就會一直再去更新,而不會消失。
prefetch-key 則是會再使用 DNSKEYs 來驗證,會耗費更多的 CPU 資源。
$ sudo tee /etc/unbound/unbound.conf.d/performance.conf <<EOF server: prefetch: yes prefetch-key: yes EOF
Step 4. 用 . 把 zone forward 去問 Google
$ sudo tee /etc/unbound/unbound.conf.d/forward-zone.conf <<EOF forward-zone: name: "." forward-addr: 8.8.8.8 forward-addr: 8.8.4.4 EOF
Step 5. 開啟 rrset-roundrobin 用 RRSet 的順序來回應。
$ sudo tee /etc/unbound/unbound.conf.d/rrset-roundrobin.conf <<EOF server: rrset-roundrobin: yes EOF
啟動服務
$ sudo systemctl enable unbound.service $ sudo systemctl start unbound.service
搞定!