問(wèn)題
iOS開(kāi)發(fā)過(guò)程中,一般會(huì)用到host來(lái)和服務(wù)器在內(nèi)網(wǎng)進(jìn)行接口對(duì)接聯(lián)調(diào),通常而言使用Charles來(lái)做代理,配合GasMask來(lái)設(shè)置host已經(jīng)可以滿足需求了。但是我們來(lái)看看下面的兩種情況:
- Charles之類(lèi)軟件只針對(duì)http/https協(xié)議進(jìn)行代理,并且還局限于那些通過(guò)URLSession之類(lèi)的高層API;所以非http/https協(xié)議,或者直接使用socket接口進(jìn)行的http協(xié)議(設(shè)置了不使用系統(tǒng)host),都無(wú)法使用上述的方案;
- host的域名是動(dòng)態(tài)變化的,如xxxx.example.com,這里的xxxx是日期,所以每天的域名都是不同的(這其實(shí)是一個(gè)泛解析域名的問(wèn)題)
常規(guī)解決方案
解決問(wèn)題1倒是挺容易的,想辦法讓iOS設(shè)備的網(wǎng)絡(luò)流量都走我們可以抓包的設(shè)備就行了,比如說(shuō)使用OS X的網(wǎng)絡(luò)共享功能,把以太網(wǎng)通過(guò)架設(shè)的wifi熱點(diǎn)共享出來(lái),然后iPhone直接連上這個(gè)熱點(diǎn),Mac機(jī)上就可以通過(guò)WireShark之類(lèi)的軟件抓包了(Charles和HttpScoop之類(lèi)的抓不到這種包)
一開(kāi)始我也是這么干的,但是發(fā)現(xiàn)我的Mac架設(shè)的熱點(diǎn)連上去之后,死活不能上網(wǎng),查找了不少資料,仔細(xì)核對(duì)過(guò)架設(shè)熱點(diǎn)的過(guò)程和設(shè)置,都是沒(méi)有任何問(wèn)題,同樣的操作和設(shè)置在另一個(gè)同事的Mac機(jī)上卻很正常。百思不得其解,折騰了一段時(shí)間了,最終還是放棄了,打算尋找過(guò)另外一個(gè)解決方案。
公司另外部門(mén)的同事是這么一種方案:找個(gè)路由器架個(gè)熱點(diǎn),然后配置路由器的host。這個(gè)方案本質(zhì)上還是和用Mac架設(shè)熱點(diǎn)的方案是一樣的,感覺(jué)還是太麻煩了點(diǎn),修改下host還得遠(yuǎn)程登錄路由器,吭哧吭哧去改,然后這個(gè)路由器還是好多人共用的,不同的人使用不同的host,經(jīng)常改來(lái)改去,太蛋疼了。
終極解決方案
晚上繼續(xù)搜了下資料,知道了dnsmasq這么一個(gè)架設(shè)DNS服務(wù)器的軟件,立馬開(kāi)始動(dòng)手,整個(gè)過(guò)程中間還是有些波折的,這里主要記錄下怎么來(lái)正確的配置。
安裝dnsmasq
使用homebrew來(lái)安裝dnsmasq
brew install dnsmasq
dnsmasq的設(shè)置
拷貝并重命名/usr/local/opt/dnsmasq/dnsmasq.conf.example -> /usr/local/etc/dnsmasq.conf。
cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
同時(shí)新建/usr/local/etc/resolv.dnsmasq.conf。
resolv.dnsmasq.conf文件是用來(lái)指定域名解析服務(wù)器地址的,一般形如下面:
nameserver 114.114.114.114
可以把你常用的DNS服務(wù)器的地址保存到這里去,然后再dnsmasq.conf里面配置
resolv-file=/usr/local/etc/resolv.dnsmasq.conf
dnsmasq.conf的配置項(xiàng)建議統(tǒng)一在文件的末尾添加,這樣方便查閱,文件其他位置的內(nèi)容都是針對(duì)每個(gè)配置項(xiàng)的說(shuō)明,可供參考。
緊接著,就是要設(shè)置dns服務(wù)的監(jiān)聽(tīng)地址了,一旦設(shè)置好了這個(gè)地址,要使用我們的dns服務(wù)的其他機(jī)器只需要把它們自己的DNS修改為這個(gè)地址,就能享受到dns服務(wù)了。
listen-address=127.0.0.1,192.168.x.x
listen-address的設(shè)置中,有兩點(diǎn)需要注意:
- 127.0.0.1這個(gè)本機(jī)地址是一定要設(shè)置的,架設(shè)服務(wù)的Mac如果也想用這個(gè)dns服務(wù),那么就必須在網(wǎng)絡(luò)設(shè)置那里,把DNS修改為127.0.0.1,不然的話是不會(huì)自動(dòng)用到這個(gè)服務(wù)的,這點(diǎn)一定要注意。
- 192.168.x.x這個(gè)是本機(jī)的內(nèi)網(wǎng)IP地址,這個(gè)是可選的,如果增加了這個(gè)地址的話,內(nèi)網(wǎng)的其他機(jī)器就可以通過(guò)把dns設(shè)置為這個(gè)地址而使用上我們架設(shè)的dns服務(wù)。
這里還有一個(gè)可能用到的設(shè)置項(xiàng),本機(jī)host的使用,默認(rèn)情況下dnsmasq會(huì)匹配address的設(shè)置,再查找本機(jī)host,接著查找緩存下來(lái)的域名,最后才是通過(guò)配置上游dns服務(wù)器來(lái)查找。如果不想使用本機(jī)host的設(shè)置,那么如下設(shè)置即可:
no-hosts
重頭戲:域名解析的設(shè)置
dnsmasq.conf里address這個(gè)配置項(xiàng)可以讓我們指定某個(gè)域名或泛域名固定解析為指定IP地址,如:
address=/example.com/10.11.33.55
則表示*.example.com這樣的域名都會(huì)被解析成10.11.33.55,這就實(shí)現(xiàn)了我們文章開(kāi)頭所說(shuō)的帶日期域名的泛解析功能,不用每天蛋疼的去修改host了。
另外,為了避免不必要的域名泛解析,建議一般的address都是針對(duì)全域名來(lái)設(shè)置。
DNS服務(wù)的啟用
做完需要的設(shè)置之后,我們需要啟動(dòng)dns服務(wù),為了方便使用,一般都建議dnsmasq設(shè)置為開(kāi)機(jī)自啟動(dòng),如下:
sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons
sudo lauchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
運(yùn)行過(guò)程中,如果修改了dnsmasq.conf的設(shè)置,那么是需要重新啟動(dòng)dns服務(wù)的,重啟服務(wù)器的方法如下:
sudo launchctl stop homebrew.mxcl.dnsmasq
sudo launchctl start homebrew.mxcl.dnsmasq
因?yàn)镈NS有緩存策略,所以一般還需要再?gòu)?qiáng)制刷新下DNS緩存才行,這里要注意,隨著OSX版本的不同,這個(gè)命令也是有所不同,這里只針對(duì)10.10.4及以后的版本而言:
sudo killall -HUP mDNSResponder
檢查DNS是否啟用
可以本機(jī)設(shè)置下DNS為127.0.0.1,然后使用ping/dig/host/nslookup等命令來(lái)進(jìn)行測(cè)試是否dns服務(wù)正常運(yùn)行,這里需要注意的一點(diǎn)是:
如果你本機(jī)使用了host,那么ping會(huì)先查詢本機(jī)的/etc/hosts文件,然后才查詢dns服務(wù)器;而其他三個(gè)命令則是直接查詢dns服務(wù)器,無(wú)視/etc/hosts的配置。