防污染dns


作者简介:陈宜龙,iOS开发工程师,现任职于LeanCloud,热爱开源与分享,GitHub获得的Star数过万,其中《iOS9适配系列教程》一度成为该领域最有影响力的教程。StackOverFlow威望值高达。同时也是多个开源项目的维护者:CYLTabBarController、LeanCloud-iOS-SDK、ChatKit、iOSInterviewQuestions、ParseSourceCodeStudy等。

DNS出问题的概率其实比大家感觉的要大,首先是DNS被劫持或者失效,年初业内比较知名的就有Apple内部DNS问题导致AppStore、iTunesConnect账户无法登录;京东因为CDN域名付费问题导致服务停摆。

另一个常见问题就是DNS解析慢或者失败,例如国内中国运营商网络的DNS就很慢,一次DNS查询的耗时甚至都能赶上一次连接的耗时,尤其2G网络情况下,DNS解析失败是很常见的。因此如果直接使用DNS,对于首次网络服务请求耗时和整体服务成功率都有非常大的影响。

DNS系统中有两种服务角色:递归DNS和授权DNS。本质上来说,授权DNS控制网站的解析;递归DNS只起缓存的作用。所以跟广大站长关系比较大的是授权DNS,也就是在域名注册商处填写的DNS地址。而网民使用的则是递归DNS。见:/Kb/showarticle/tsid/186/

DNS解析时间过长像iOS系统一般是24小时之后会过期,还有进入飞行模式再切回来,开关机,重置网络设置等也会导致DNScache的清除。所以一般情况下用户在第二天打开你的app都会经历一次完整的DNS解析请求,网络情况差的时候会明显增加应用请求的总耗时。

DNS在设计之初是基于UDP的,显然这样的设计不能满足当今社会的准确性的需求,于是涌现了如DNSPod这样的基于HTTP的DNS解析服务。但是当时为什么这样设计,实际也很好理解,UDP效率高,一来一回网络上传输的只有两个包,而HTTP则需要三次握手三个包,再一拆包,就需要四个包。这是受限于当时整个社会的带宽水平较低,而现在没人会感激UDP所节省的流量,所有人都在诟病DNS污染问题。

首先:所有防DNS方案都是基于IP直连的方案,那么就要首先介绍IP直连这个方案的可行性。

从年6月1日起,iOS应用必须支持IPv6,否则审核将被拒。IPv6规则出来后,网上有一种言论称:IP直连不可行。

如果你拿一个IPv4的IP或域名进行请求,有两个机制可以保证最终到达Server的是一个IPv6地址。

第一个机制是绿色部分,指的是iOS系统级别的IPv4兼容方案,只要你使用了NSURLSession或CFNetwork,那么iOS系统会将帮你把它转为IPv6地址。

NSURLSessionandCFNetworkautomaticallysynthesizeIPv6addressesfromIPv4literalslocallyondevicesoperatingonDNS64/works.(如果当前网络是IPv6网络,那么会在iOS系统层面转换成IPv6.)

第二个机制是DNS服务的兼容方案,可以是运营商提供的服务,也可以是第三方DNS解析机构比如DNSPod。如果DNS解析出来的域名是IPv4地址,也会转为IPv6地址。

通过IP直接访问网站,可以解决DNS劫持问题。如果是HTTP请求,使用ip地址直接访问接口,配合header中Host字段带上原来的域名信息即可;

默认的DNS是基于UDP,改用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到指定的第三方DNS解析服务器,从而绕过运营商的LocalDNS,能够避免LocalDNS造成的域名劫持问题和调度不精准问题。

那如果这些第三方解析商服务也挂掉了呢?这里有一个折中的方案,你可以两个服务都使用,其中一个作为失败重试的备选项,首选和备选的优先级可以调整。

最后,双方根据以上交互的信息生成sessionticket,用作该连接后续数据传输的加密密钥。

上述过程中,和我们的方案有关的是第3步,客户端需要验证服务端下发的证书,验证过程有以下两个要点:

如果上述两点都校验通过,就证明当前的服务端是可信任的,否则就是不可信任,应当中断当前连接。

当客户端使用基于HTTP的第三方解析服务解析域名时,请求URL中的host会被替换成解析出来的IP,所以在证书验证的第2步,会出现domain不匹配的情况,导致SSL/TLS握手不成功。

https请求,需要OverridingTLSChainValidationCorrectly;

如果使用第三方网络库:curl,中有一个-resolve方法可以实现使用指定ip访问https网站,iOS中集成curl库,参考curl文档;它也是支持IPv6环境的,只需要你在build时添加上--enable-ipv6即可。

如果使用AFN,则需要重写AFN里的一些方法,具体步骤是:hook住SSL握手方法,也就是上图中的第2步,对应于下面的方法:

了解最新移动开发、VR/AR相关信息和技术,请关注mobilehub公众微信号(ID:mobilehub)。

暴躁刘亦菲:据ACM介绍,Hennessy和Patterson获奖的主要原因是他们在计算机体系结构的设计和评估工作中开创了系统化、定量化方法,对微处理器行业产生了深远影响。



1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。