亚马逊AWS官方博客

DNS over HTTPS 与 Anycast IP:增强域名解析的安全性和隐私性

传统的 DNS 查询过程存在一些隐私和安全问题,例如,你的 DNS 查询会被网络运营商或其他第三方监视,从而了解你访问了哪些网站;有些不安全的 DNS 服务器也可能被黑客攻击,将你的设备重定向到钓鱼网站或者恶意网站(域名劫持或域名污染)。而 DNS over HTTPS(DoH)是一种安全协议,它允许客户端使用 HTTPS 协议通过加密的通道向 DNS 服务器查询域名解析信息。DoH 旨在提高互联网用户的隐私和安全,通过加密 DNS 查询来防止第三方(如 ISP 或黑客)窥探用户的网络活动。

DNS over HTTPS(DoH)具有如下一些特点:

加密 DNS 查询:DoH 通过 HTTPS 加密 DNS 查询,这意味着用户设备和 DoH 服务器之间的 DNS 流量是加密的,从而防止了第三方的窃听和篡改。

保护用户隐私:由于 DNS 查询包含了用户想要访问的域名信息,这可能暴露用户的上网行为。DoH 通过加密这些查询,保护了用户的隐私,使得第三方无法轻易地通过 DNS 查询来跟踪用户的行为。

防止 DNS 劫持:传统的 DNS 协议在传输过程中不加密,容易被中间人攻击者劫持,导致用户被重定向到恶意网站。DoH 通过 HTTPS 进行传输,减少了这种风险。

使用 HTTPS 端口:DoH 利用 HTTPS 的 443 端口进行通信,这个端口通常用于加密的 Web 流量,因此不易被网络监控或过滤软件所识别或阻止。

Amazon Route 53 Resolver(以下简称 Route 53 Resolver)目前已经支持 DNS over HTTPS 协议,并遵循 RFC 8484 标准。Route 53 Resolver 以递归方式响应来自公共记录 AWS 资源、Amazon VPC 特定的 DNS 名称和 Amazon Route 53 私有托管区域的 DNS 查询,并且在所有 VPC 中都可用。但在 AWS Region 之外的 Internet 上使用 Route 53 Resolver 需要进行一些改造。

使用 DNS over HTTPS(DoH)进行域名解析时,客户端需要通过域名访问支持 DoH 的 DNS 服务器。然而,这个 DNS 服务器的域名本身也可能被劫持或污染。为了彻底解决域名劫持和污染问题,我们可以像传统 DNS 查询一样,使用 IP 地址直接访问DNS服务器。在这种情况下,我们可以利用 AWS Global Accelerator 实现全球加速。

AWS Global Accelerator 在全球 50 多个国家/地区的近百个城市部署了 100 多个边缘节点,可以让客户端的流量从最近的边缘节点接入。同时,AWS Global Accelerator 提供了静态 IP 地址,作为固定的入口点。这些 IP 地址来自 AWS 边缘站点,是任播 IP 地址,因此它们会同时从多个 AWS 边缘站点播出。这样,进入 AWS 全球网络的流量就能尽可能靠近用户。

通过结合 AWS Global Accelerator 和 Amazon Route 53 Resolver,我们就可以部署一个覆盖全球的支持 DNS over HTTPS 的域名解析系统。

方案架构图

客户端通过 DNS over HTTPS 协议向 AWS Global Accelerator 的任播 IP(Anycast IP)发送请求。

AWS Global Accelerator 将流量路由到最近的 AWS 边缘位置(PoP)。

然后,流量进入 AWS Region 内的虚拟私有云(VPC)。在 VPC 内部,Network Load Balancer 将流量分发到多个 Route 53 Resolver 端点。这些端点是 Route 53 Resolver 在 VPC 内的私网 IP 地址。

Route 53 Resolver 接收到 DNS over HTTPS 的 DNS 请求后,即可查询配置在 Route 53 Zone 里的信息或者递归查询 Internet 上的域名信息。

Route 53 Resolver 获得域名查询的结果后,再使用 DNS over HTTPS 协议将结果通过 AWS Global Accelerator 返还给客户端。

从 AWS Global Accelerator 分布在全球的 PoP 点到 Route 53 Resolver 的整段链路都使用 AWS 骨干网,不会暴露到 Internet。

从客户端到 Route 53 Resolver 端到端均为 HTTPS 加密数据,防止被窃取和伪造。

下面我们一步一步进行配置。

配置 Route 53 Resolver

为了让 Route 53 Resolver 能被 VPC 及外部访问,我们需要配置一个 Route 53 Resolver Inbound Endpoint:

在 Configure inbound endpoint 的配置中,填入 Endpoint 名字,选择要部署 Route 53 Resolver 的 VPC,安全组和 IP 地址簇(IPv4、IPv6 或双栈),其中安全组需要允许访问 443 端口。协议类型默认是 Do53,即使用 53 端口的传统 DNS 协议。我们需要在这里勾选上 DoH 协议:

为了高可用,Endpoint 的 IP 需要选择至少两个 AZ,每个 AZ 各配置一个。建议将 Endpoint 部署到私有子网内。

完成配置点击提交后,等待几分钟,我们就可以看到这个 Inbound Endpoint 的状态:

状态是 Operational,这个 endpoint 就可以正常使用了。我们点击 ID,进入到这个 endpoint 的详情页面,在这里我们需要记录该 endpoint 使用的具体 IP 信息:

Route 53 Resolver 默认会有一条递归到 Internet 解析的规则,我们可以根据需要保留这条规则。

接下来我们需要在 EC2 控制台配置 Network Load Balancer 和 AWS Global Accelerator。

配置 Network Load Balancer 和 AWS Global Accelerator

在 EC2 控制台中,我们首先配置 Target Group,我们需要创建一个新的 Target Group:

Target type 选择 IP addresses 类型,协议和端口使用 TCP 443,VPC 选择我们 Route 53 Resolver Inbound Endpoint 所在的 VPC。

在具体的 Target 配置页面,我们填入前面记录的 Route 53 Resolver Inbound Endpoint 的 IP 地址:

点击“Create target group”后,Target Group 就成功创建了。

接下来我们配置 Network Load Balancer。

我们先创建一个类型为 Network Load Balancer(NLB)。该 NLB 的类型为“Internet-facing ”;选择 VPC 为 Route 53 Resolver Inbound Endpoint 所在的 VPC,子网所在的 AZ 需要是 Route 53 Resolver Inbound Endpoint 所在的 AZ;安全组需要允许外部访问 443 端口;侦听协议和端口为 TCP 443;target group 为刚才创建的,target 为 Route 53 Resolver Inbound Endpoint IP 地址的 target group;在 AWS Global Accelerator 下勾选“创建一个 accelerator,这样可以为该 NLB 同步配置好一个 AWS Global Accelerator。点击“Create load balancer”后,等待 Network Load Balancer 和 AWS Global Accelerator 完成创建。

待创建的 Network Load Balancer 的状态变为“Active”后,点击该 NLB name 进入详情页:

在 NLB 详情页下方的“Integrations”中,展开 AWS Global Accelerator 即可看到 AWS Global Accelerator 提供的全球任播 IP(Anycast IP),通过这两个固定的 IP 地址,我们就可以使用 DNS over HTTPS 协议访问 Route 53 Resolver 进行 DNS 解析:

请记录下这两个 AWS Global Accelerator 提供的 IP 地址,后续测试时,客户端将访问这两个 IP 地址。

客户端测试

DNS over HTTPS 协议需要客户端也支持,这里我们使用 node.js 作为客户端进行模拟。node.js 的第三方库“dohjs”支持 DNS over HTTPS 协议。我们先安装这个第三方库:

npm install dohjs

这个库的详细信息请参考:https://github.com/byu-imaal/dohjs

假设我们 AWS Global Accelerator 提供的其中一个静态 IP 是“3.33.239.100”,需要解析的域名是“www.amazonaws.com”,我们可以使用如下的 javascript 代码进行测试:

// Javascript

const doh = require("dohjs");

const dnsServer = "3.33.239.100";
const domainName = "www.amazonaws.com";

const headers = {
  Host: "route53resolver.amazonaws.com",
  accept: "application/dns-message",
};

const resolver = new doh.DohResolver("https://" + dnsServer + "/dns-query");

resolver
  .query(domainName, "A", "GET", headers)
  .then((response) => {
    response.answers.forEach((ans) => console.log(ans.data));
  })
  .catch((err) => console.error(err));

这段 Javascript 代码中,dnsServer 为 AWS Global Accelerator 提供的静态 IP 地址,domainName 为需要解析的域名。

由于 HTTPS 协议使用证书进行鉴权,Route 53 Resolver 使用的证书所支持的域名为“route53resolver.amazonaws.com”,因此需要在 HTTPS 请求中把 Host 改为“route53resolver.amazonaws.com”。

DNS over HTTPS 协议需要在请求的 HTTP header 中 accept 的类型为 dns-message,因此我们还需要增加一个 HTTP header:accept: “application/dns-message”。

根据 DNS over HTTPS 协议,请求的 DNS 服务器域名和 uri 为:https://dnsServer/dns-query

最后,我们调用 query 函数,使用 HTTP GET 方法解析待查询域名的 A 记录。DNS over HTTPS 也支持使用 POST 方法。

假设该代码的文件名为 doh.js,在终端中允许 node doh.js 命令运行这段代码:

$ node doh.js
rewrite.amazon.com
72.21.210.29

可以看到成功获得了该域名的 A 记录信息,得到了该域名的 IP 地址。

总结

本文探讨了使用 DNS over HTTPS(DoH)协议通过 Anycast IP 提高域名解析的安全性和隐私性,DoH 通过 HTTPS 加密查询过程,保护用户隐私并防止 DNS 劫持。Amazon Route 53 Resolver 支持 DoH 并遵循 RFC 8484 标准,能够在 AWS 环境中安全响应 DNS 查询。为了在全球范围内使用 Route 53 Resolver,我们结合了 AWS Global Accelerator,提供全球任播 IP 地址(Anycast IP)以加速流量并作为固定访问点。

本篇作者

陆毅

亚马逊云科技高级解决方案架构师,拥有 20 年传统 IT 和公有云行业经验。擅长云上基础设施的架构设计、运维等。