在開發(fā)、測試和正式環(huán)境中啊鸭,我們總希望通過同一個域名找到對應(yīng)環(huán)境中的服務(wù)實例赴涵,簡化配置流程,例如在測試環(huán)境中骨宠,讓api.changjinglu.net關(guān)聯(lián)到IP為192.168.1.34的測試服務(wù)器,而在正式環(huán)境中相满,讓api.changjinglu.net關(guān)聯(lián)到IP為47.96.51.143的正式服務(wù)器层亿。
我們現(xiàn)在的解決方案是在本機(jī)的/etc/hosts文件中記錄相應(yīng)的域名IP映射關(guān)系,本機(jī)在嘗試解析一個域名時立美,會先去/etc/hosts中查找該域名對應(yīng)的IP匿又,并訪問相應(yīng)IP的服務(wù)器。只有當(dāng)/etc/hosts中沒有該域名的記錄時建蹄,本機(jī)才會去DNS服務(wù)器進(jìn)行域名解析碌更。
本機(jī)解析域名的優(yōu)先級為DNS緩存>/etc/hosts>DNS服務(wù)。
這個解決方案稍顯繁瑣洞慎,因為每臺機(jī)器都必須在自己的/etc/hosts文件中配置正確的域名IP映射關(guān)系痛单,一旦映射關(guān)系發(fā)生改變,所有機(jī)器又必須全部做相應(yīng)的修改拢蛋。一個更簡潔的解決方案是構(gòu)建一個本地DNS服務(wù)器桦他,讓路由器指向該本地DNS服務(wù)器,讓它統(tǒng)一管理所有通用的域名IP映射谆棱,如果個別開發(fā)者有自己的特別需要快压,可以利用域名解析的優(yōu)先級順序,通過修改自己本機(jī)的/etc/hosts覆蓋本地DNS服務(wù)的映射關(guān)系垃瞧。使用這個新方案蔫劣,當(dāng)局域網(wǎng)中新增某個服務(wù)或某個原有服務(wù)改變IP地址時,只需要在本地DNS服務(wù)器上新增或修改映射配置个从,局域網(wǎng)中的所有機(jī)器無需做修改脉幢,就能享受到正確的映射關(guān)系了。
下面講一講如何通過Dnsmasq實現(xiàn)這個新方案嗦锐。
1. 安裝Dnsmasq
我將本地DNS服務(wù)安裝在了192.168.1.98上嫌松,因為該測試服務(wù)器的系統(tǒng)是ubuntu,使用自帶的包管理器下載并安裝Dnsmasq最簡潔奕污。
sudo apt-get install dnsmasq
2. 配置Dnsmasq
Dnsmasq所有的配置都在/etc/dnsmasq.conf文件中完成萎羔,按照需要簡單做了以下修改。
#首先配置resolv-file碳默,這個參數(shù)表示dnsmasq會從這個指定的文件中尋找上游DNS服務(wù)器
resolv-file=/etc/resolv.dnsmasq.conf
#單設(shè)置127.0.0.1為只能本機(jī)使用贾陷,單設(shè)置本機(jī)IP為只能內(nèi)部全網(wǎng)使用而本機(jī)不能用缘眶,這里需要同時設(shè)置兩者
listen-address=127.0.0.1,192.168.1.98
#dnsmasq緩存設(shè)置
cache-size=1024
然后根據(jù)自己設(shè)置的resolv-file=/etc/resolv.dnsmasq.conf,配置/etc/resolv.dnsmasq.conf文件髓废,指定上游DNS服務(wù)器
nameserver 114.114.114.114
3. 坑
按以上配置配置好Dnsmasq并啟動后巷懈,會發(fā)現(xiàn)Dnsmasq無法正常解析域名,使用ps -ef | grep dnsmasq查看后發(fā)現(xiàn)如下信息
dnsmasq 10384 1 0 15:16 ? 00:00:00 /usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/
dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
其中dnsmasq -r /var/run/dnsmasq/resolv.conf說明Dnsmasq是從/var/run/dnsmasq/resolv.conf文件中獲取上游DNS服務(wù)器慌洪,而非我們指定的resolv-file=/etc/resolv.dnsmasq.conf顶燕。
查閱了無數(shù)文檔以后,發(fā)現(xiàn)在/etc/default/dnsmasq中有一個IGNORE_RESOLVCONF屬性蒋譬,說明如下
# If the resolvconf package is installed, dnsmasq will use its output
# rather than the contents of /etc/resolv.conf to find upstream
# nameservers. Uncommenting this line inhibits this behaviour.
# Note that including a "resolv-file=<filename>" line in
# /etc/dnsmasq.conf is not enough to override resolvconf if it is
# installed: the line below must be uncommented.
# IGNORE_RESOLVCONF=yes
這里必須取消IGNORE_RESOLVCONF=yes前的注釋割岛,才能讓resolv-file=/etc/resolv.dnsmasq.conf生效。
4. 啟動Dnsmasq
大功告成犯助,啟動Dnsmasq。
sudo service dnsmasq start