什么是 DNS Server
簡單的說昌腰,DNS Sever 就是把域名轉(zhuǎn)換為 IP 地址的一個服務您宪。如 Google 提供了 8.8.8.8
為什么需要搭建本地的 DNS Server?
最常見的兩種情況是:
- 你有一些虛擬主機芍躏,本次都通過 IP 地址去訪問的太麻煩邪乍,因為 IP 地址很不容易記。
- 本地開發(fā)時对竣,不想每次都用 http://127.0.0.1:3000, http://127.0.0.1:3001 這種來訪問庇楞,而是想用 http://app1.dev
這兩種情況都需要把虛擬的域名轉(zhuǎn)換為對應的 IP, 最簡單的方式是直接修改 /etc/hosts
, 還有一種方式就是搭建一個本地的 DNS Server
安裝前
/本文所有操作都是在 macOS 下完成否纬,其他 *nix 操作系統(tǒng)會稍有區(qū)別/
首先查看一下當前配置了哪些的 DNS resolver
scutil --dns
可以看到類似這樣的輸出
DNS configuration
resolver #1
nameserver[0] : 192.168.31.1
if_index : 4 (en0)
flags : Request A records
reach : Reachable, Directly Reachable Address
后面還有 resolver #2
resolver #3
等
另外先了解一下 dig
命令, dig
是用來查詢 DNS 的一個工具姐刁。
dig www.google.com
輸出
; <<>> DiG 9.8.3-P1 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11696
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 30 IN A 93.46.8.89
;; Query time: 7 msec
;; SERVER: 192.168.31.1#53(192.168.31.1)
;; WHEN: Wed Apr 5 22:23:18 2017
;; MSG SIZE rcvd: 48
這里可以看到,域名 www.google.com
在我的電腦中解析出來 IP 地址是 93.46.8.9
安裝 dnsmasq
brew install dnsmasq
然后 copy 一下配置文件
cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
配置文件所有的配置都是已經(jīng)注釋掉的烦味,可根據(jù)自己的需要取消注釋并修改聂使。dnsmasq 同時還提供了如 DHCP 的其他功能,這里我們只關注 DNS Server 這一塊谬俄。
先在文件最底部增加一行
address=/dev/127.0.0.1
重啟dnsmasq
sudo brew services restart dnsmasq
然后通過 dig
命令來檢查是否生效
dig abc.dev @127.0.0.1
這里的 @127.0.0.1
用來告訴 dig
去 127.0.0.1 這個 dns server 來查詢
輸出結(jié)里(隱藏了頭尾)
;; QUESTION SECTION:
;abc.dev. IN A
;; ANSWER SECTION:
abc.dev. 0 IN A 127.0.0.1
此時已經(jīng)可以看到柏靶,域名abc.dev
的 IP 地址已經(jīng)被解析為 127.0.0.1
但時我們用 ping
命令來測試,是不正確的溃论。這里ping
和沒用指定 @127.0.0.1
的dig
是一樣的屎蜓,默認都是使用 /etc/resolv.conf
指定的 nameserver
來查詢的。
給 macOS 增加更多的nameserver
新建一個 /etc/resolver
目錄钥勋,然后新建一個 /etc/resolver/dev
文件炬转,然后增加新的 nameserver
sudo mkdir -p /etc/resolver
echo 'nameserver 127.0.0.1' | sudo tee /etc/resolver/dev
然后每次系統(tǒng)做 DNS 查詢時,發(fā)現(xiàn)是以 dev 結(jié)尾的域名時算灸,就會使用 /etc/resolver/dev
這個文件里指定的 nameserver 來解析扼劈。同樣的,我們也可以創(chuàng)建一個 /etc/resolver/staging
菲驴,然后讓所有的以 staging 為結(jié)尾的域名都用該文件指定的 nameserver 來解析荐吵。
再次執(zhí)行
scutil --dns
會發(fā)現(xiàn)輸出多了一個 resolver
resolver #8
domain : dev
nameserver[0] : 127.0.0.1
flags : Request A records, Request AAAA records
reach : Reachable, Local Address, Directly Reachable Address
我們可以用 traceroute
命令來查看解析的路徑
traceroute abc.dev
輸出為
traceroute to abc.dev (127.0.0.1), 64 hops max, 52 byte packets
1 localhost (127.0.0.1) 0.196 ms 0.034 ms 0.034 ms
這里可以看到,只有一跳就完成了解析赊瞬。
至此先煎,一個本地的 DNS server 就搭建完成了
More
- 可在 dnsmasq 的配置文件中增加一行
conf-dir=/usr/local/etc/dnsmasq.d/,*.conf
然后按需在相應的目錄創(chuàng)建 dev.conf
, staing.conf
等文件。注意每次修改完配置文件要重啟 dnsmasq
-
address=/dev/127.0.0.1
是一種通配方式巧涧,把所有的以 dev 結(jié)尾的域名都解析為 127.0.0.1薯蝎。
也可以為每個域名都指定一個獨立的 IP ,如在/usr/local/etc/dnsmasq.d/staging.conf
里谤绳,我們可以指定各種 staging 相關的 服務
address=/db.staging/192.168.1.10
address=/app.staging/192.168.1.11
address=/job.staging/192.168.1.12
注意增加新的域名后綴要在 /etc/resolver/
下創(chuàng)建相應的文件并增加 nameserver
-
dnsmasq
默認監(jiān)聽的端口為 53占锯, 所有啟動該服務需要用sudo