利用 Dnsmasq 搭建自己的 DNS 服務器
前言
最近新買了 iPad mini, 在不斷折騰的過程中發現一點讓我非常非常的無語… 還是與網絡有關, 那就是通常情況下, iPad mini 中的 App Store 連接速度那是相當相當相當的慢的, 慢到我打開 App Store 軟件的首頁需要登上 20~30s 纔會有可能訪問成功, 那麼下載一個應用的情況可想而知了. 因爲在編寫 wyatt_hosts 的時候, 也爲了解決在 iMac 上進行 Mac OS 更新慢的問題, 所以關於 iPad mini 基本上也就同樣的解決方法了.
在自己想到折騰一個 dnsmasq 之前, 也在網絡上搜索過其他的解決方案, 比如 V2EX DNS 可是對我來說, 在 iPad mini 上我也需要其他的比如 Google Drive 等也能夠快速的訪問, 而這些問題的解決辦法都在那個 hosts 文件中, 要是我能夠將 iPad mini 給越獄就最好了…
初認
由於 iPad mini 沒有越獄, 所以我現在能想到的辦法就只有自己搭建一臺 dns 服務器了, 在網絡上搜索 linux dns, mac os dns 很多情況下是使用 bind 9 的軟件, 當我閱讀完一些配置指南以後(例如), 說實話, 我嚇倒了 T.T 超級複雜…… 然後, 我在某一篇文章中看到另外一段話”使用 dnsmasq 做 dns 緩存”吸引過去了, 這才讓我去搜索了一下 dnsmasq, 哈哈, It is designed to provide DNS and, optionally, DHCP, to a small network. 這太棒了, 和我的目的一樣, bind 9 雖然是非常流行並且久經沙場的 dns 服務器, 同時這也意味着我需要爲那用不着的 20% 功能去折騰一個龐然大物嗎? 所以最後選擇了更加輕便的 dnsmasq.
安裝
在 *nix 下安裝軟件非常的方便, 因爲我是 Mac OS 所以先 brew search dnsm
搜索看看有沒有現成的, 果然找到, 接下來 brew install dnsmasq
, 經過一系列腳本的安裝, 得到一段話:
To configure dnsmasq, copy the example configuration to /usr/local/etc/dnsmasq.conf and edit to taste.
cp /usr/local/Cellar/dnsmasq/2.61/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
To load dnsmasq automatically on startup, install and load the provided launchd item as follows:
sudo cp /usr/local/Cellar/dnsmasq/2.61/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
在 Mac OS 配置自啓動除非看了這文檔, 否則我還真會糊塗…
配置
看到一個 dnsmasq.conf 的文件了吧, 還是需要一點點配置的, 但非常非常的少.
- 配置 dnsmasq 的上游 dns 服務器;(這是一個 dns 緩存, 那麼其還是需要有上游服務器進行一次域名解析的)
- 配置系統的 dns 服務器, 將 dnsmasq 設置在首位尋找
- 設置 dnsmasq 需要監聽的 IP 地址, 讓其他服務器能夠找到他
對應上面的三個事情, 只有 4 條配置即可, 不要打開 dnsmasq.conf 看到一大片內容就嚇到了.
- 首先配置 resolv-file=/etc/resolv.dnsmasq.conf 這個參數表示 dnsmasq 會從這個指定的文件中尋找上游 dns 服務器
- 將 127.0.0.1 添加到 /etc/resolv.conf 文件的第一行中, 讓系統首先尋找本地的 dnsmasq 服務器取消註釋的
strict-order
表示嚴格安裝 resolv-file 文件中的順序從上到下進行 DNS 解析, 直到第一個成功解析成功爲止 - 確保註釋掉
no-hosts
, 默認情況下這是註釋掉的, dnsmasq 會首先尋找本地的 hosts 文件再去尋找緩存下來的域名, 最後去上游 dns 服務器尋找. - 設置
listen-address=127.0.0.1
, 表示這個 dnsmasq 本機自己使用有效. - 這裏有一個坑 listen-addres , 我爬了好長時間才爬出來..
在這些配置中, listen-address 的參數坑了我好長時間, 最後才能明白如何配置. 例如, 我還需要讓局域網內其他的服務器也能夠首先訪問這個 dnsmasq 來進行域名解析如何配置? listen-address=192.168.1.100
(dnsmasq 所在服務器局域網內 ip), 好吧, 這樣你本機配置的 127.0.0.1 就沒效果了… 如果設置爲 listen-address=127.0.0.1
那局域網內其他服務器就無法訪問到這個 dnsmasq 了, 其實應該這樣設置 listen-address=192.168.1.100,127.0.0.1
這樣你就能雙方都滿足了, 不過需要注意的一點是, 如果 dnsmasq 所在服務器在局域網的 ip 地址變更了與配置文件中的不一樣, 那麼理所當然的再使用配置文件中的那個 ip, 局域網內其他服務器也就找不到這臺 dnsmasq ,也就無法利用本地的 dns 緩存了.
彙總
最後來彙總一下, 能夠快速的部署起來.
resolv.conf
1 2 |
|
1 2 3 4 |
|
1 2 3 |
|
上面設置好以後, 讓我們把 dnsmasq 啓動起來吧:
- 手動啓動:
sudo dnsmasq
just it. - Mac OS 開機自啓動, 這也是我現在設置的方式. 首先運行
brew info dnsmasq
查看軟件信息, 看到有一句話To load dnsmasq: sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
照做就好了, 注意 使用不同版本的 Homebrew 會略有不同, 在版本 0.9.4 的時候, 簡化了, 不需要自己去 copy 一個 Mac OS 下的 plist 文件了(具體答案可在 /usr/local/Library/Formula/dnsmasq.rb 中找到).
關閉
如果想關閉, 就按照 *nix 的常規用 ps ax | grep dns
找到 pid 然後 kill -9 [pid]
就行, 因爲 -9 是 SIGKILL 信號. 同時如果想讓 dnsmasq 清理掉所有緩存的 dns 記錄, 發送一個 SIGHUP(1) 信號給 pid 就好 kill -1 [pid]
這些可通過 man dnsmasq
來看到.
測試
最後就是來測試測試是否起作用了. 這個最簡單啦, 直接使用 dig
命令吧, 執行大於 2 次, 查看其中返回的 “Query time: x msec” 的結果就好, 如果第二次以後 x=0, 那麼就配置成功了.
例子: dig google.com
查看詳細的結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
dig baidu.com +short
僅僅查看解析的 ip
1 2 3 |
|
將電腦開啓 dnsmasq, 然後將 iPad mini 連接進入局域網, 將 DNS 服務處第一個設置成 dnsmasq 服務器所在的 ip, 第二個設置成 V2EX 的, 第三個設置爲 8.8.8.8 (用英文,隔開). 這回, 從 App Store 下載應用的時候, 總算能夠看到明顯的進度條滾動了 T.T