域名劫持——网易云信 IM SDK 服务高可用技术方案

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的 IP 地址从而实现用户无法访问目标网站的目的,或者蓄意/恶意要求用户访问指定 IP 地址(网站)的目的。”(以上内容引自「域名劫持」百度百科) 。网易云信 IM SDK 作为一款 ToB 产品,支撑着各种三方业务的开展。面对各种复杂的网络环境,DNS 劫持与 DNS 污染时有发生,那么在我们提供服务的过程中应该如何避免此类事故的发生呢?

作者:郝魁 网易云信资深客户端开发工程师

一、关于域名劫持

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

“域名劫持”虽然带了“劫持”二字,但在此环境中实属中性词汇。例如对于一些非法网站的访问,可以通过 DNS 服务把相应的域名解析到不可访问的 IP 地址,以阻止对于该非法网站的访问并给予警告等。在网易云信即时通信产品运维过程中,曾经发生过服务域名 “netease.im“被别有用心的人或组织恶意劫持的事件,导致接入网易云信 IM SDK 的应用无法正常登录,给客户以及客户的用户造成影响。

为了弄清楚这种事故是怎么发生的,我们来分析一下网易云信 IM SDK 的登录过程:

域名劫持——网易云信 IM SDK 服务高可用技术方案

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

二、如何预防 DNS 劫持

通常对于域名被劫持后,我们可以采用以下几种方式:

域名劫持——网易云信 IM SDK 服务高可用技术方案

上述几种方式,都是在发生劫持后采取的方案,无论是从服务提供侧还是服务使用侧来说都不够灵活,为了解决这些问题,提前预防事故的发生,我们主要采用以下两种方案:

IMG_256

其中接入了 HttpDNS 服务的方案降低了所有场景下域名被劫持的风险。

(一)LocalDNS 域名劫持

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

  • 黑客入侵宽带路由器,篡改终端用户 LocalDNS,并指向伪造 LocalDNS,通过控制 LocalDNS 的逻辑返回错误的 IP 信息进行域名劫持。
  • 监听终端用户域名解析请求,在 LocalDNS 返回正确结果之前将伪造的 DNS 解析响应传递给终端用户,进而控制终端用户的域名访问行为。
  • 缓存污染,LocalDNS 缓存了域名的解析结果,并对部分域名结果进行更改,导致用户访问被指向被更改的地址,示意图如下:

域名劫持——网易云信 IM SDK 服务高可用技术方案 (二)HttpDNS 实现原理

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

Step 2:客户端向获取到的 IP 后就向直接往此 IP 发送业务协议请求。以 HTTP 请求为例,通过在 header 中指定 Host 字段,向 HttpDNS 返回的 IP 发送标准的 HTTP 请求即可,如果是 Https 还要考虑 SNI 的问题。

域名劫持——网易云信 IM SDK 服务高可用技术方案

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

为了提高服务的高可用性,网易云信 SDK 接入了 HttpDNS 服务,高可用方案整体结构如下所示:

域名劫持——网易云信 IM SDK 服务高可用技术方案

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

IMG_262

(一)端侧 HttpDNS SDK 实现

IM SDK 高可用组件采用了跨平台开发方案,主要针对 Native SDK(Windows 、MacOS、iOS、Android)进行了支持,基本结构如下:

域名劫持——网易云信 IM SDK 服务高可用技术方案

高可用组件为了保证高可用性、响应的及时性、结果的正确性,在设计时需要完成以下几个功能:

  • HttpDNS 服务接口的更新及缓存维护
  • 域名查询结果更新及缓存维护
  • HTTP 请求的实现
  1. 阶梯式 HTTP 请求

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

IMG_264
域名劫持——网易云信 IM SDK 服务高可用技术方案

为了提高 HTTP 请求的访问效率,在网易云信高可用组件中引入了多地址阶梯式的 HTTP 请求机制,比如单一链接的 HTTP 请求超时时间指定为 30s,当开始名列前茅个链接访问时开启一个超时时间为 3 秒的定时器 Timer0,如果该请求在 3 秒内返回并且经过业务模块验证为正确应答,此时整个多地址阶梯式请求结束,否则在 Timer0 触发时,启动对下一链接的 HTTP 请求,并启动一个新的超时时间为 3 秒的定时器 Time1,以此类推,直到有正确的响应结果或者所有的链接都已访问完成,流程如下所示:

IMG_265

域名劫持——网易云信 IM SDK 服务高可用技术方案 2. HttpDNS 服务接口的更新及缓存维护

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

HttpDNS 服务初始化流程如下:

IMG_266
  1. 域名查询结果更新及缓存维护

高可用组件为了保证域名查询的及时响应,以及减少对 HttpDNS 的访问量,引入了“查询结果缓存”,对已经查询过的域名结果进行了本地缓存,为了提高正确性同样也加入了 TTL 机制(一般是 5 分钟),超出指定时间后,会对结果进行再次更新,同时为了保证响应的及时性,在 TTL 的基础上加入了冗余时间(一般是 TTL*0.75),所以调用高可用组件查询域名会存在三种结果:

  • 缓存未到达冗余时间,返回缓存结果。
  • 缓存达到冗余时间,但尚未过期,返回缓存结果,同时发起更新请求。
  • 缓存已过期,发起更新请求,应答成功后,更新缓存,响应上层调用,如果应答失败,继续使用缓存数据。

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

IMG_267
  1. HTTP 访问流程设计
域名劫持——网易云信 IM SDK 服务高可用技术方案

(二) 疑似劫持事件上报

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

域名劫持——网易云信 IM SDK 服务高可用技术方案

(三)SNI 处理

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

以下是使用 libcurl 发送 HTTP 请求的代码片段:

域名劫持——网易云信 IM SDK 服务高可用技术方案

参考资料

  • DNS污染_百度百科 (baidu.com)
  • 域名劫持_百度百科 (baidu.com)
  • 域名服务器缓存污染 – 维基百科,自由的百科全书 (wikipedia.org)

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

作者介绍

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

关于网易云信

网易云信:网易智企旗下融合通信云服务专家、通信与视频 PaaS 平台。集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务,并联合网易易盾推出一站式安全通信方案「安全通」。目前,网易云信已经成功发送 1.6 万亿条消息,覆盖智能终端 SDK 数累计超过 186 亿,我们期待每个智能终端都有云信的融合通信能力。

文章标题:域名劫持——网易云信 IM SDK 服务高可用技术方案,发布者:网易智企,转载请注明出处:https://worktile.com/kb/p/5975

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企的头像网易智企
上一篇 2022年3月17日 上午12:30
下一篇 2022年3月17日 上午12:42

相关推荐

  • 项目管理使用哪个项目管理软件好?主流工具全面对比

    盘点不同行业、项目类型的下的12款主流的项目管理软件:PingCode、Worktile、Teambition、TAPD、广联达、Asana、Basecamp、Jira、Microsoft Project、ClickUp、Redmine、Trello。 在这个项目管理工具层出不穷的时代,选择一个合适…

    2024年7月9日
    300
  • tapd项目管理免费吗

    TAPD从2022年左右开始面由一个完全免费的工具向付费工具转变。从最新政策看,TAPD 针对不同规模和需求的团队,TAPD提供了多种版本,其中包括“卓越版”和“企业版”。免费版本人数规模由原来的100人不断缩小,2024年仅支持30人以内免费,还限制了项目数量。 近年来,随着免费政策的调整,许多潜…

    2024年7月9日
    100
  • 团队提效必备:2024年值得关注的10款优质软件需求管理工具

    本文将分享2024年10款高效需求管理工具:PingCode、Worktile、Tapd、禅道、Teambition、ClickUp、Tower、Asana、Jira 和 monday.com。 在快速变化的软件开发环境中,选择合适的需求管理工具变得至关重要。项目失败往往源于需求不明确或管理不善,这…

    2024年7月9日
    800
  • 待办事项app有哪些

    这篇文章,我们从团队、个人等多角度出发,列举出了 21 种值得当作时间管理系统中的收集箱、行动清单的待办事项管理软件。这些工具应该要能肩负几个重要任务: 当然,工具必须搭配方法,这篇文章只谈工具。另外跟之前这篇文章一样,下面我会依据各种需求情境和工具特色做分析,写下我的推荐原因与评论。 一、适合团队…

    2024年7月5日
    1000
  • Tapd 项目管理有什么优缺点?2024全新解析及对比

    对比Tapd,在某些领域更有优势的8大项目管理工具:PingCode、Worktile、Redmine、Teambition、广联达、Jira、禅道、飞书。

    2024年7月4日
    1100

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部