关于c++:技术实践|网易云信-IM-SDK-服务高可用技术方案

3次阅读

共计 3178 个字符,预计需要花费 8 分钟才能阅读完成。

导读:“域名劫持是互联网攻打的一种形式,通过攻打域名解析服务器(DNS),或伪造域名解析服务器(DNS)的办法,把指标网站域名解析到谬误的 IP 地址从而实现用户无法访问指标网站的目标,或者蓄意 / 歹意要求用户拜访指定 IP 地址(网站)的目标。”(以上内容引自「域名劫持」百度百科)。网易云信 IM SDK 作为一款 ToB 产品,撑持着各种三方业务的发展。面对各种简单的网络环境,DNS 劫持与 DNS 净化时有发生,那么在咱们提供服务的过程中应该如何防止此类事变的产生呢?

文|郝魁

网易云信资深 C++ 开发工程师

技术是一把双刃剑,在大侠手中定国安邦,在鼠辈手中祸国殃民。

“域名劫持”尽管带了“劫持”二字,但在此环境中实属中性词汇。例如对于一些非法网站的拜访,能够通过 DNS 服务把相应的域名解析到不可拜访的 IP 地址,以阻止对于该非法网站的拜访并给予正告等。在网易云信即时通信产品运维过程中,已经产生过服务域名“netease.im”被居心叵测的人或组织歹意劫持的事件,导致接入网易云信 IM SDK 的利用无奈失常登录,给客户以及客户的用户造成影响。为了弄清楚这种事变是怎么产生的,咱们来剖析一下网易云信 IM SDK 的登录过程:

从流程上来看,在“更新 LBS”的节点上,如果产生 DNS 劫持,在拜访网易云信 LBS 服务时有可能超时或者拿到了谬误的应答,导致 IM SDK 无奈获取失常的 Link 服务器地址及端口,如何防止此类事变的产生呢?本文将围绕网易云信端侧服务高可用技术计划以及高可用组件实现计划进行具体分享。

一、如何预防 DNS 劫持

通常对于域名被劫持后,咱们能够采纳以下几种形式:

上述几种形式,都是在产生劫持后采取的计划,无论是从服务提供侧还是服务应用侧来说都不够灵便,为了解决这些问题,提前预防事变的产生,咱们次要采纳以下两种计划:

其中接入了 HttpDNS 服务的计划升高了所有场景下域名被劫持的危险。

1、LocalDNS 域名劫持

域名劫持始终是困扰许多开发者的问题之一,其体现为域名 A 应该返回的 DNS 解析后果 IP1 被歹意替换为了 IP2,导致 A 的拜访失败或拜访了一个不平安的站点,常见域名劫持形式有以下几种:

黑客入侵宽带路由器,篡改终端用户 LocalDNS,并指向伪造 LocalDNS,通过管制 LocalDNS 的逻辑返回谬误的 IP 信息进行域名劫持。

监听终端用户域名解析申请,在 LocalDNS 返回正确后果之前将伪造的 DNS 解析响应传递给终端用户,进而管制终端用户的域名拜访行为。

缓存净化,LocalDNS 缓存了域名的解析后果,并对局部域名后果进行更改,导致用户拜访被指向被更改的地址,示意图如下:

2、HttpDNS 实现原理

S tep1:客户端间接拜访 HttpDNS 接口,获取业务在域名配置管理系统上配置的“正确的”、“访问速度最优的”IP 列表。

S tep2:客户端向获取到的 IP 后就向间接往此 IP 发送业务协定申请。以 HTTP 申请为例,通过在 header 中指定 Host 字段,向 HttpDNS 返回的 IP 发送规范的 Http 申请即可,如果是 Https 还要思考 SNI 的问题。

二、网易云信服务高可用策略

为了进步服务的高可用性,网易云信 SDK 接入了 HttpDNS 服务,高可用计划整体构造如下所示:

IM SDK 接入 HttpDNS 服务实现服务高可用的个别流程:

1、端侧 HttpDNS SDK 实现

IM SDK 高可用组件采纳了跨平台开发计划,次要针对 Native SDK(Windows、MacOS、iOS、Android)进行了反对,根本构造如下:

高可用组件为了保障高可用性、响应的及时性、后果的正确性,在设计时须要实现以下几个性能:

HttpDNS 服务接口的更新及缓存保护

域名查问后果更新及缓存保护

HTTP 申请的实现

1.1 阶梯式 HTTP 申请

某一域名通过 HttpDNS 的域名查问服务,可能会解析出多个 IP 地址,如果这些地址当中蕴含已下线或者访问速度不现实的节点,会使整个 HTTP 的拜访工夫变长,最坏的状况是所有的地址都进行了拜访,且都超时,如下图所示:


为了进步 HTTP 申请的拜访效率,在网易云信高可用组件中引入了多地址阶梯式的 HTTP 申请机制,比方繁多链接的 HTTP 申请超时工夫指定为 30s,当开始第一个链接拜访时开启一个超时工夫为 3 秒的定时器 Timer0,如果该申请在 3 秒内返回并且通过业务模块验证为正确应答,此时整个多地址阶梯式申请完结,否则在 Timer0 触发时,启动对下一链接的 HTTP 申请,并启动一个新的超时工夫为 3 秒的定时器 Time1,以此类推,直到有正确的响应后果或者所有的链接都已拜访实现,流程如下所示:


1.2 HttpDNS 服务接口的更新及缓存保护

HttpDNS 也是一个 HTTP 服务也存在被劫持的可能,所以除了应用 HttpDNS 域名外,高可用组件还内置了多个固化的 IP,以解决 HttpDNS 域名被劫持后无法访问的问题,应用固化 IP 尽管能够解决域名被劫持的问题,但不肯定是最新、最优的节点,为了解决这个问题,高可用组件在指定工夫内会更新 HttpDNS 服务地址,拿到最新、最优的节点。为了缩小对 HttpDNS 的访问量,引入了服务地址的 TTL(个别是 1 小时)机制,即在服务地址有效期内应用本地缓存,不再向 HttpDNS 申请服务地址。

HttpDNS 服务初始化流程如下:

1.3 域名查问后果更新及缓存保护

高可用组件为了保障域名查问的及时响应,以及缩小对 HttpDNS 的访问量,引入了“查问后果缓存”,对曾经查问过的域名后果进行了本地缓存,为了进步正确性同样也退出了 TTL 机制(个别是 5 分钟),超出指定工夫后,会对后果进行再次更新,同时为了保障响应的及时性,在 TTL 的根底上退出了冗余工夫(个别是 TTL*0.75),所以调用高可用组件查问域名会存在三种后果:

缓存未达到冗余工夫,返回缓存后果。

缓存达到冗余工夫,但尚未过期,返回缓存后果,同时发动更新申请。

缓存已过期,发动更新申请,应答胜利后,更新缓存,响应下层调用,如果应答失败,持续应用缓存数据。

调用高可用组件进行域名查问的流程如下:

1.4 HTTP 拜访流程设计

2、疑似劫持事件上报

当调用高可用组件进行 HTTP 申请时,如果因非网络起因导致的申请失败,而且触发了 HttpDNS 查问域名操作,则断定此次拜访的域名可能存在已被劫持的危险,高可用组件会收集与此域名相干的信息内容上报到网易云信数据大盘,数据大盘后盾依据上报信息来定位是否存在域名劫持的状况,并依据理论状况来决定是否要重新配置 HttpDNS 解析后果还是配合安全部门对相应的 App 进行封禁解决。

3、SNI 解决

为了让多个域名复用一个 IP,在 HTTP 服务器上引入了虚拟主机的概念。多个虚拟主机共享 IP 的 HTTPS 服务器中,在握手建设之前服务器无奈晓得客户端申请的具体 Host,所以无奈将申请交给特定的虚拟主机,从而导致服务器无奈读取虚拟主机中配置的证书信息。SNI 就是用来解决这个问题的,SNI 是 SSL 和 TLS 的一个扩大协定。SNI 要求客户端在与服务器握手时就携带须要拜访的域名的 Host 信息,具体实现办法是在客户端“Client Hello”报文的申请头中,减少了 Server Name 的扩大字段,因而服务器便会晓得须要用哪个虚拟主机的证书与客户端握手并建设 TLS 连贯。

以下是应用 libcurl 发送 HTTP 申请的代码片段:


DNS 净化_百度百科 (baidu.com)

域名劫持_百度百科 (baidu.com)

域名服务器缓存净化 – 维基百科,自在的百科全书 (wikipedia.org)

以上就是网易云信端侧服务高可用技术计划以及高可用组件实现计划的分享,如有趣味,欢送你在公众号留言与我探讨。

作者介绍

郝魁,网易云信资深 C++ 开发工程师,次要负责网易云信 IM SDK 的开发、保护、重构等工作,领有多年 C++ 客户端开发教训,现致力于跨平台 C++ 开发。

正文完
 0