【计算机网络】域名劫持无处遁形:基于HTTPDNS打造可靠且安全的域名解析体系
域名劫持无处遁形:基于HTTPDNS打造可靠且安全的域名解析体系。本文将深入探讨HTTPDNS如何强化嵌入式开发领域的网络安全,以及它是如何成为嵌入式设备网络栈中不可或缺的一环。我们将讨论如何在嵌入式系统中实现和部署HTTPDNS,以及这一技术是如何提升整体系统的健壮性,确保嵌入式设备能在一个越来越互联的世界中安全可靠地运行。
🧑 作者简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk)
💬 博主粉丝群介绍:① 群内高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
🗄️ 专栏介绍:本文归属于专栏《嵌入式解决方案》,专注嵌入式开发中的常用工具,持续更新中,欢迎大家免费订阅关注。
域名劫持无处遁形:基于HTTPDNS打造可靠且安全的域名解析体系
- 1. 概述
- 2. 原理介绍
- 3. 阿里云HTTPDNS平台配置
- 3.1 服务开通
- 3.2 创建项目
- 3.3 添加域名
- 3.4 自定义解析域名(可选)
- 3.5 快速验证
- 4. 阿里云HTTPDNS集成接入
- 4.1 SDK接入
- 4.2 HTTP(S) API非鉴权直接接入(不推荐)
- 4.2.1 请求API
- 4.2.2 服务IP
- 4.2.3 API响应说明
- 4.3 HTTP(S) API鉴权机制接入(推荐)
- 4.3.1 请求API
- 4.3.2 鉴权方案
- 4.3.3 鉴权响应
- 4.3.4 特别说明
- 4.4 IP调度(可选)
- 4.4.1 功能说明
- 4.4.2 调度API
- 4.4.3 接入方式
- 5. 总结
1. 概述
在嵌入式系统的广阔天地中,网络安全常常是设计和部署考量中的重中之重。这些系统,无论是在智能家居、工业控制还是现代汽车中,都扮演着日益重要的角色。随着嵌入式设备越来越多地连接到互联网,它们暴露在诸多网络威胁之下,其中,域名劫持尤其令人担忧。这种攻击不仅威胁到数据的安全性和隐私,而且可能对设备的功能性和稳定性造成破坏。在这样的背景下,采用HTTPDNS就显得尤为重要。
传统的DNS查询存在诸多弱点,这使得嵌入式设备容易受到中间人攻击和缓存污染。而HTTPDNS,通过利用HTTPS的加密协议,提供了更为安全的域名解析服务。这不仅增强了嵌入式设备的安全性,还提高了解析速度和准确性,这在资源受限且对实时性要求极高的嵌入式应用中尤为重要。
本文将深入探讨HTTPDNS如何强化嵌入式开发领域的网络安全,以及它是如何成为嵌入式设备网络栈中不可或缺的一环。我们将讨论如何在嵌入式系统中实现和部署HTTPDNS,以及这一技术是如何提升整体系统的健壮性,确保嵌入式设备能在一个越来越互联的世界中安全可靠地运行。
随着嵌入式设备越发普及,保护这些设备免受网络攻击的需求日益迫切。HTTPDNS代表了一种创新的解决方案,它预示着在保障关键系统安全这一永恒议题上的一大步进。让我们一起走进HTTPDNS的世界,探索它如何为嵌入式开发领域带来变革。
2. 原理介绍
HTTPDNS是面向多端应用(智能设备、移动端APP,PC客户端应用)的域名解析服务,解析请求基于HTTP(S)协议,有效解决了传统域名解析容易被劫持、解析不准确、更新不及时、服务不稳定等问题。
从原理上来讲,HTTPDNS 只是将域名解析的协议由 DNS 协议换成了 HTTP 协议,并不复杂。但是这一微小的转换,却带来了巨大的收益。
对于大多数开发者来说,可以尝试自己实现 HTTPDNS ,比如在公网服务器搭建一个HTTPS服务,专门用于提供DNS解析服务,这种方案适用于小规模,对性能和成功率要求不高的场景。但是如果想快速稳定持续更新迭代,现在各大云服务也有提供 HTTPDNS 服务,如 HTTPDNS - 阿里云、HttpDNS - 腾讯云、移动域名解析服务 - 百度云 等等。每家供应商都有各自的免费额度,比如百度云提供300万次/月免费解析,阿里云提供300万次/月免费解析,腾讯云提供600万次/月免费解析。
下面,我们以阿里云HTTPDNS服务为例,讲解其调用流程。其它厂商的接口调用方法参考各自的文档即可。
3. 阿里云HTTPDNS平台配置
接入方式如下图所示:
3.1 服务开通
- 登录阿里云控制台。
- 鼠标悬停在左上角的(橙底三白色横杠)图标上,然后在产品与服务中,打开产品和服务列表。
- 在产品列表中,选择企业云服务 > 移动研发平台,进入产品介绍页。
4. 在产品介绍页,勾选服务协议后,单击立即开通。
3.2 创建项目
-
产品开通后即可进入EMAS移动研发平台的管理控制台。
-
在控制台首页,单击添加项目,打开创建项目右侧栏。
-
在创作项目右侧栏,填写项目基本信息。
选项 说明 项目名称 必填,用于设置项目的名称
【取值范围】1~30字符
【字符类型】中文/英文大小写/数字/下划线项目描述 项目描述,选填,简要介绍项目用途 -
单击创建并进入,保存项目,并打开概览页面。
3.3 添加域名
-
点击进入平台服务功能页,然后展开左侧的HTTPDNS菜单,点击概览进入HTTPDNS产品首页。可以看到Account ID以及免费解析量等信息。
-
点击左侧的域名列表,然后点击添加域名按钮,填写合法的具体域名或泛域名后,点击确定按钮即可保存。
示例:添加
*.aliyun.com
,aliyun能匹配所有以aliyun.com
结尾的域名,比如aliyun.com
、www.aliyun.com
、emas.console.aliyun.com
。
3.4 自定义解析域名(可选)
在HTTPDNS的基础上,引入自定义解析功能,可以实现:
- 客户端自定义参数输入。
- 服务端结合自定义函数处理能力,支持实现复杂的自定义解析功能。
- 返回自定义解析结果。
使用自定义域名解析使用频次较低,不再赘述,方法请参见概述。
3.5 快速验证
到这里,就可以对设置好的域名进行快速验证了,以确认我们配置的域名是生效的。
方法:浏览器访问测试URL:https://203.107.1.33/Account ID/d?host=待解析域名
需要将**Account ID替换为HTTPDNS产品首页看到的Account ID,将待解析域名**替换为控制台添加的域名。
预期返回类似下面的结果,就表示验证成功了:
4. 阿里云HTTPDNS集成接入
HTTPDNS提供了简洁的HTTP(S) API接口供用户访问,接入代码较为简单;同时HTTPDNS也为Android和iOS移动端用户提供了SDK进行集成。
4.1 SDK接入
SDK下载请参考下面截图,选择对应平台和SDK包后下载即可。
SDK服务接入请参考各自平台的参考文档进行,不再赘述:
-
Android SDK接入
-
iOS SDK接入
4.2 HTTP(S) API非鉴权直接接入(不推荐)
HTTP(S) API早期无需鉴权,拿到Account ID之后即可直接使用,非常方便(所以注意保密Account ID)。但为了避免可能存在的盗刷问题,后面又支持了鉴权机制接入,大大提高了安全性,保护了数字资产。
阿里云HTTPDNS支持单域名解析和多域名解析,本文只演示单域名解析的使用方法,多域名解析请自行参考官方文档。
4.2.1 请求API
HTTPDNS通过HTTP接口对外提供域名解析服务,服务接入直接使用IP地址(不使用域名访问就避免了使用传统DNS解析阿里云HTTPDNS域名带来的劫持问题),服务IP有多个(请提工单或加入钉钉群35248489获取),这里以203.107.1.33
这个服务IP为例,说明HTTPDNS服务的访问方式。
请求方式:HTTP GET
或HTTPS GET
。
HTTP服务URL:http://203.107.XXX.XXX/{account_id}/d
HTTPS服务URL:https://203.107.XXX.XXX/{account_id}/d
其中的{account_id}
需要替换为用户的HTTPDNS服务的Account ID,在HTTPDNS控制台上可以获得这个ID。
URL参数说明:
名称 | 是否必须 | 描述 |
---|---|---|
host | 必须 | 要解析的域名 |
ip | 可选 | 用户的来源IP,如果没指定这个参数,默认使用请求连接的源IP。 |
query | 可选 | 指定解析结果IP的类型,可以选择6(IPv6)或4(IPv4)。默认值为4。 |
访问HTTPDNS服务时,一次请求只能解析一个域名。
请求示例(假设Account ID为100000):
-
示例1(默认来源IP):http://203.107.1.33/100000/d?host=www.aliyun.com
-
示例2(指定来源IP):http://203.107.1.33/100000/d?host=www.aliyun.com&ip=42.120.XX.XXX
-
示例3(指定解析类型):http://203.107.1.33/100000/d?host=www.aliyun.com&ip=219.242.XXX.XXX&query=4,6
-
示例4 (支持IPv6):http://[2401:b180:2000:XXXX:XXXX]/100000/d?host=www.aliyun.com&ip=219.242.XXX.XXX&query=4,6
4.2.2 服务IP
考虑到服务IP防攻击之类的安全风险,为保障服务可用性,HTTPDNS同时提供多个服务IP,当某个服务 IP在异常情况下不可用时,可以使用其他服务IP进行重试。上述文档中使用的203.107.1.33
是其中一个服务IP。
如果使用场景特殊(比如嵌入式设备开发),无法使用SDK,需要直接访问HTTP API接口,请提工单联系官方获取服务IP列表。
4.2.3 API响应说明
-
请求成功
请求成功时,HTTP响应的状态码为200,响应结果用JSON格式表示,示例如下:
{ "host":"www.aliyun.com", "ips":[ "192.168.XX.234" ], "ipsv6":[ "2400:3200:1300:0:0:0:XX:XX" ], "ttl":57, "origin_ttl":120 }
返回字段说明:
名称 | 描述 |
---|---|
host | 请求解析的域名 |
ips | 该域名的IPv4解析结果,是一个列表,可能包括0个、1个或多个IP地址;仅当query=4时返回这个字段。 |
ipsv6 | 该域名的IPv6解析结果,是一个列表,可能包括0个、1个或多个IP地址;仅当query=6时返回这个字段。 |
ttl | 该域名解析结果的TTL缓存时间。 |
origin_ttl | 域名原始TTL,即权威NS上配置的域名TTL值。 重要:因服务后端对不同域名的解析方式不同,可能没法获得域名的这个TTL值,此时不返回这个字段。 |
请求成功时,返回结果中的ips
字段可能是空列表,即没有获得该域名的IP地址,这里主要有两个原因:
- 该域名没有在HTTPDNS控制台中添加,请前往控制台添加。
- 该域名不存在对应IP,域名未注册,或者没有配置IP地址。
ips
字段为空的返回结果示例:{ "host":"www.aliyun.com", "ips":[], "ttl":300 }
返回结果中包含TTL缓存时间,为避免频繁进行域名解析,用户应该按这个TTL时间,对域名解析结果进行缓存。在TTL过期之前,直接使用缓存的IP;TTL过期后,再去请求HTTPDNS服务,获得最新的解析结果。
- 请求失败
请求失败时,HTTP响应的状态码为4xx/5xx,同时也返回具体的错误码,响应结果用JSON格式表示。
请求失败的响应示例:
{
"code":"MissingArgument"
}
错误码列表如下:
错误码 | HTTP状态码 | 描述 |
---|---|---|
MissingArgument | 400 | 缺少必要参数。 |
InvalidHost | 400 | 域名格式不合法。 |
TooManyHosts | 400 | 单域名解析接口传递了多个待解析域名。 |
SdnsNotSupported | 400 | 海外暂不支持SDNS服务。 |
InvalidAccount | 403 | 无效账户或账户不存在。 |
MethodNotAllowed | 405 | 不支持的HTTP方法。 |
InternalError | 500 | 服务端内部错误。 |
-
错误处理说明
用户业务使用HTTPDNS时,应做好异常情况下的出错兼容逻辑,主要包括异步请求、重试和降级。
-
异步请求
访问HTTPDNS服务时,应该使用异步请求的策略,避免解析延迟太大而对业务造成影响,特别是在网络环境异常或HTTPDNS服务IP异常不可用时,如果用同步访问,需要等待网络超时后才会返回解析失败,这个超时时间较大,可能对业务的使用体验造成很大影响。异步请求策略:解析域名时,如果当前缓存中有TTL未过期的IP,可直接使用;如果没有,则立刻让此次请求降级走原生LocalDNS解析,同时另起线程异步地发起HTTPDNS请求进行解析,更新缓存,这样后续解析域名时就能命中缓存。
-
重试
访问HTTPDNS服务解析域名时,如果请求HTTPDNS服务端失败,即HTTP请求没有返回,可以进行重试。大部分情况下,这种访问失败是由于网络原因引起的,重试可以解决。
-
降级
当通过HTTPDNS服务无法获得域名对应的IP时,都必须降级:使用标准的DNS解析,通过Local DNS去解析域名。请求HTTPDNS但没有返回IP时,主要是因为“域名没有在控制台添加”或“域名本身不存在”,无论什么原因,如果通过HTTPDNS没有解析出IP,为保证业务请求正常,必须降级使用标准的DNS,作为兜底方案。
-
4.3 HTTP(S) API鉴权机制接入(推荐)
在非鉴权直接接入的基础上,为了避免可能存在的盗刷问题,后面又支持了鉴权机制接入,大大提高了安全性,保护了数字资产。
4.3.1 请求API
-
签名生成算法及示例
新鉴权接口
http://203.107.1.33/{account_id}/sign_d
http://203.107.1.33/{account_id}/sign_resolve
其中,
- {account_id} 需要替换为用户的HTTPDNS Account ID,在HTTPDNS控制台上可以获得这个ID。
- 鉴权接口可以添加IP参数,是否添加该参数及参数内容不影响签名的计算。
- 服务IP列表请提工单或加入钉钉群35248489获取。
4.3.2 鉴权方案
**签名算法**
`sign = md5sum( host-secret-timestamp )`
**鉴权字段说明**
字段 |描述
---|---
host|需要被解析的host,与URL中的host参数取同样的值。
secret|由服务器负责生成,查看方式:`控制台 > 鉴权配置 > 鉴权secret key`。
timestamp|签名失效时间,1970年1月1日以来的秒数(整型正数,固定长度10)。
**说明**
* 签名最长有效时间不超过24小时。
**签名示例**
- 示例1(普通解析API接口):
- 原请求:`http://203.107.1.33/{account_id}/d?host=www.aliyun.com`
- 假设密钥为:`IAmASecret`,希望在北京时间2018-08-15 15:00:00失效(时间戳`1534316400`)
- sign = `md5sum(“www.aliyun.com-IAmASecret-1534316400”) = 60c71e98b6d7fcbb366243e224eab457`
- 鉴权请求:`http://203.107.1.33/{account_id}/sign_d?host=www.aliyun.com&t=1534316400&s=60c71e98b6d7fcbb366243e224eab457`
- 示例2(批量解析API接口):
- 原请求:`http://203.107.1.33/{account_id}/resolve?host=www.aliyun.com,www.taobao.com`
- 假设密钥为:`IAmASecret`,希望在北京时间2018-08-15 15:00:00失效(时间戳`1534316400`)
- sign = `md5sum(“www.aliyun.com,www.taobao.com-IAmASecret-1534316400”) = 12a3f6b1b14a46ca813ca6439beb59a4`
- 鉴权请求:`http://203.107.1.33/{account_id}/sign_resolve?host=www.aliyun.com,www.taobao.com&t=1534316400&s=12a3f6b1b14a46ca813ca6439beb59a4`
**此方案优缺点**
- **缺点**
- 客户端时间不同。
- 密钥放在客户端丢失有风险。
- **优点**
- 无需去服务器拉取。
4.3.3 鉴权响应
-
鉴权成功时,HTTP响应的状态码为200,响应结果同原HTTPDNS响应,各字段含义不再赘述,请参考第三章。
{ "code": "OK", "host":"www.aliyun.com", "ips":[ "192.168.XX.234" ], "ipsv6":[ "2400:3200:1300:0:0:0:XX:XX" ], "ttl":57, "origin_ttl":120 }
-
鉴权失败时,HTTP响应的状态码为403或400,响应结果同时也返回具体的错误码,响应结果用JSON格式表示。
{ "code": "InvalidSignature" }
3.3 状态码说明
HTTP状态码 | 错误码 | 描述 |
---|---|---|
403 | SignatureExpired | 时间戳已过期 |
403 | InvalidSignature | 签名不正确 |
400 | InvalidDuration | 签名有效期过长(最长86400秒) |
400 | InvalidSignature | 签名格式不正确 |
400 | InvalidTimestamp | 时间戳格式不正确 |
400 | AccountNotExists | 账户不存在或被禁用 |
4.3.4 特别说明
非鉴权接口默认是开启的,对于默认使用鉴权机制接入的产品来说,可以关闭非鉴权接口,以避免产生安全和费用问题,如下图所示。
4.4 IP调度(可选)
4.4.1 功能说明
ip调度接口根据请求IP,再次返回最优和最新的服务调度信息,并同时提供更多的容灾能力。包括以下能力:
- 获取服务IP列表,允许客户端动态获取服务节点IP。
- 列出当前所有已启用的域名列表,允许客户端避免无效解析请求。
- 当某服务节点异常后,允许动态获取最新的服务接入点列表。
4.4.2 调度API
URL:https://{当前的启动IP_或_服务IP}/{account_id}/ss
其中,{account_id}是您HTTPDNS服务的专属ID,您可以在HTTPDNS控制台上获取。
请求方式:GET
。
非高频使用功能,请求参数和响应不再赘述,详情请参考官方文档。
4.4.3 接入方式
接入流程如下图所示:
5. 总结
随着嵌入式系统在我们日常生活中的植根深化,从智能家居到工业自动化,再到互联车辆,确保其网络通信的安全和可靠性变得至关重要。HTTPDNS作为一种创新的域名解析方法,已经证明了它在防止域名劫持和提升嵌入式系统网络安全性方面的显著优势。通过采用HTTPDNS,开发者不仅能够保障设备在互联网上的数据传输更安全、更隐私,同时也显著提升了响应速度和系统的整体可靠性。
通过在嵌入式系统中采用HTTPDNS,我们能够更好地为这些不断增长的网络安全挑战做好准备,确保我们的技术能够抵御最新的威胁,提供给用户最可靠、最安全的体验。