问题
iOS开发过程中,一般会用到host来和服务器在内网进行接口对接联调,通常而言使用Charles来做代理,配合GasMask来设置host已经可以满足需求了。但是我们来看看下面的两种情况:
- Charles之类软件只针对http/https协议进行代理,并且还局限于那些通过URLSession之类的高层API;所以非http/https协议,或者直接使用socket接口进行的http协议(设置了不使用系统host),都无法使用上述的方案;
- host的域名是动态变化的,如xxxx.example.com,这里的xxxx是日期,所以每天的域名都是不同的(这其实是一个泛解析域名的问题)
常规解决方案
解决问题1倒是挺容易的,想办法让iOS设备的网络流量都走我们可以抓包的设备就行了,比如说使用OS X的网络共享功能,把以太网通过架设的wifi热点共享出来,然后iPhone直接连上这个热点,Mac机上就可以通过WireShark之类的软件抓包了(Charles和HttpScoop之类的抓不到这种包)
一开始我也是这么干的,但是发现我的Mac架设的热点连上去之后,死活不能上网,查找了不少资料,仔细核对过架设热点的过程和设置,都是没有任何问题,同样的操作和设置在另一个同事的Mac机上却很正常。百思不得其解,折腾了一段时间了,最终还是放弃了,打算寻找过另外一个解决方案。
公司另外部门的同事是这么一种方案:找个路由器架个热点,然后配置路由器的host。这个方案本质上还是和用Mac架设热点的方案是一样的,感觉还是太麻烦了点,修改下host还得远程登录路由器,吭哧吭哧去改,然后这个路由器还是好多人共用的,不同的人使用不同的host,经常改来改去,太蛋疼了。
终极解决方案
晚上继续搜了下资料,知道了dnsmasq这么一个架设DNS服务器的软件,立马开始动手,整个过程中间还是有些波折的,这里主要记录下怎么来正确的配置。
安装dnsmasq
使用homebrew来安装dnsmasq
brew install dnsmasq
dnsmasq的设置
拷贝并重命名/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
同时新建/usr/local/etc/resolv.dnsmasq.conf。
resolv.dnsmasq.conf文件是用来指定域名解析服务器地址的,一般形如下面:
nameserver 114.114.114.114
可以把你常用的DNS服务器的地址保存到这里去,然后再dnsmasq.conf里面配置
resolv-file=/usr/local/etc/resolv.dnsmasq.conf
dnsmasq.conf的配置项建议统一在文件的末尾添加,这样方便查阅,文件其他位置的内容都是针对每个配置项的说明,可供参考。
紧接着,就是要设置dns服务的监听地址了,一旦设置好了这个地址,要使用我们的dns服务的其他机器只需要把它们自己的DNS修改为这个地址,就能享受到dns服务了。
listen-address=127.0.0.1,192.168.x.x
listen-address的设置中,有两点需要注意:
- 127.0.0.1这个本机地址是一定要设置的,架设服务的Mac如果也想用这个dns服务,那么就必须在网络设置那里,把DNS修改为127.0.0.1,不然的话是不会自动用到这个服务的,这点一定要注意。
- 192.168.x.x这个是本机的内网IP地址,这个是可选的,如果增加了这个地址的话,内网的其他机器就可以通过把dns设置为这个地址而使用上我们架设的dns服务。
这里还有一个可能用到的设置项,本机host的使用,默认情况下dnsmasq会匹配address的设置,再查找本机host,接着查找缓存下来的域名,最后才是通过配置上游dns服务器来查找。如果不想使用本机host的设置,那么如下设置即可:
no-hosts
重头戏:域名解析的设置
dnsmasq.conf里address这个配置项可以让我们指定某个域名或泛域名固定解析为指定IP地址,如:
address=/example.com/10.11.33.55
则表示*.example.com这样的域名都会被解析成10.11.33.55,这就实现了我们文章开头所说的带日期域名的泛解析功能,不用每天蛋疼的去修改host了。
另外,为了避免不必要的域名泛解析,建议一般的address都是针对全域名来设置。
DNS服务的启用
做完需要的设置之后,我们需要启动dns服务,为了方便使用,一般都建议dnsmasq设置为开机自启动,如下:
sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons
sudo lauchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
运行过程中,如果修改了dnsmasq.conf的设置,那么是需要重新启动dns服务的,重启服务器的方法如下:
sudo launchctl stop homebrew.mxcl.dnsmasq
sudo launchctl start homebrew.mxcl.dnsmasq
因为DNS有缓存策略,所以一般还需要再强制刷新下DNS缓存才行,这里要注意,随着OSX版本的不同,这个命令也是有所不同,这里只针对10.10.4及以后的版本而言:
sudo killall -HUP mDNSResponder
检查DNS是否启用
可以本机设置下DNS为127.0.0.1,然后使用ping/dig/host/nslookup等命令来进行测试是否dns服务正常运行,这里需要注意的一点是:
如果你本机使用了host,那么ping会先查询本机的/etc/hosts文件,然后才查询dns服务器;而其他三个命令则是直接查询dns服务器,无视/etc/hosts的配置。