跳至内容

DNS 如何与我的 AWS Client VPN 端点配合使用?

4 分钟阅读
0

我计划设置 AWS Client VPN 端点。我需要指定最终用户用来解析域名的 DNS 服务器。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

创建新的 Client VPN 端点时,请指定 DNS 服务器 IP 地址。使用 AWS 管理控制台create-client-vpn-endpoint AWS CLI 命令或 CreateClientVpnEndpoint API 操作在“DNS Server IP address”参数中指定 IP 地址。使用控制台、modify-client-vpn-endpoint 命令或 ModifyClientVpnEndpoint API 操作来更改现有端点。

配置“DNS Server IP address”参数

为实现高可用性,请指定两个 DNS 服务器 IP 地址。如果无法访问主 DNS 服务器,则客户端会尝试将查询重新发送到辅助 DNS 服务器。

**注意:**如果主要 DNS 服务器回复 SERVFAIL,则不会再向辅助 DNS 服务器发送 DNS 请求。

在最终用户连接到 Client VPN 端点后,确认他们能够访问两个指定的 DNS 服务器。如果无法访问 DNS 服务器,则 DNS 请求可能会失败,并导致连接问题。

“DNS Server IP address”参数是可选项。如果未指定 DNS 服务器,则将使用在最终用户的设备上配置的 DNS IP 地址来解析 DNS 查询。

如果您的 Client VPN DNS 服务器为 AmazonProvidedDNS 或 Amazon Route 53 Resolver 入站端点,请注意以下事项:

  • 您可以解析与 Amazon Virtual Private Cloud (Amazon VPC) 关联的 Route 53 私有托管区的资源记录。
  • 如果激活私有 DNS,则可通过 VPN 接口指派访问的 Amazon RDS 公共主机名将解析为私有 IP 地址。对于可从 Amazon VPC 接口端点访问的 AWS 服务端点名称,情况也是如此。
  • 确认为关联的 Amazon VPC 激活DNS 解析和 DNS 主机名。

Client VPN 端点使用源 NAT 连接到关联 Amazon VPC 中的资源。

按隧道类型划分的 DNS 行为

客户端设备建立 Client VPN 隧道后,“DNS Server IP address”参数将应用于全隧道或拆分隧道:

  • **全隧道:**客户端为通过 VPN 隧道的所有流量添加路由。包括 DNS 查询在内的所有流量都通过隧道路由。如果 Amazon VPC 没有指向 DNS 服务器的路由,则查询将失败。
  • **拆分隧道:**客户端仅添加来自 Client VPN 路由表的路由。要通过 VPN 路由 DNS 流量,请在 Client VPN 路由表中添加 DNS 服务器 IP 地址的路由。

以下示例适用于 Windows 和 Linux 环境。在 Linux 上,示例假设客户端使用通用网络管理器。

场景 1: 未指定 DNS 服务器 IP 地址的全隧道

示例 1:

  • 最终用户客户端的 IPv4 CIDR: 192.168.0.0/16
  • Client VPN 端点 VPC 的 CIDR: 10.123.0.0/16
  • 本地 DNS 服务器 IP 地址: 192.168.1.1
  • “DNS Server IP address”参数已关闭且未指定 DNS 服务器 IP 地址

由于“DNS Server IP address”参数未配置,因此最终用户的主机使用本地 DNS 服务器来解析域名。

此 Client VPN 端点配置为使用全隧道模式。要通过 VPN(来自 utun1 的 0/1)发送所有流量,客户端会添加指向虚拟适配器的路由。但是,由于端点不推送 DNS 服务器配置,因此无法通过 VPN 发送 DNS 流量。客户端使用静态路由作为本地 DNS 服务器地址(在 en0 上使用 192.168.1.1/32)。在本地解析域名后,到达已解析的 IP 地址的应用程序流量将通过 VPN 隧道传输。

$ cat /etc/resolv.conf | grep nameservernameserver 192.168.1.1
$ netstat -nr -f inet | grep -E 'utun1|192.168.1.1'0/1                192.168.0.1        UGSc           16        0   utun1
192.168.1.1/32     link#4             UCS             1        0     en0
(...)

$ dig amazon.com;; ANSWER SECTION:
amazon.com.        32    IN    A    176.32.98.166
;; SERVER: 192.168.1.1#53(192.168.1.1)
(...)

示例 2:

  • 最终用户客户端的 IPv4 CIDR: 192.168.0.0/16
  • Client VPN 端点 VPC 的 CIDR: 10.123.0.0/16
  • 本地 DNS 服务器配置为公共 IP (8.8.8.8)
  • “DNS Server IP address”参数已关闭且未指定 DNS 服务器 IP 地址

在此示例中,客户端使用 8.8.8.8 的公共 DNS 服务器。由于 8.8.8.8 没有通过 en0 的静态路由,因此 DNS 请求通过 VPN 隧道传输。如果 Client VPN 端点无法访问互联网,则无法访问 DNS 服务器,并且查询超时。

$ cat /etc/resolv.conf | grep nameservernameserver 8.8.8.8
$ netstat -nr -f inet | grep -E 'utun1|8.8.8.8'0/1                192.168.0.1      UGSc            5        0   utun1

$ dig amazon.com(...)
;; connection timed out; no servers could be reached

场景 2: 启用“DNS Server IP address”参数的拆分隧道

示例

  • 客户端的 IPv4 CIDR: 192.168.0.0/16
  • Client VPN 端点的 Amazon VPC CIDR: 10.123.0.0/16
  • “DNS Server IP address”参数已开启并设置为 10.10.1.228 和 10.10.0.43(Route 53 Resolver 的入站端点)
  • Resolver 端点位于通过中转网关连接的 Amazon VPC (10.10.0.0/16) 中
  • Amazon VPC 具有 Route 53 私有托管区 (example.local)
  • DNS 解析和 DNS 主机名处于活动状态

此 Client VPN 配置为使用拆分隧道模式。Client VPN 路由表包含:

$ netstat -nr -f inet | grep utun1(...)10.10/16           192.168.0.1        UGSc            2        0   utun1 # Route 53 Resolver inbound endpoints VPC CIDR
10.123/16          192.168.0.1        UGSc            0        0   utun1 # Client VPN VPC CIDR
(...)

在本示例中,“DNS Server IP address”参数已启用。10.10.1.22810.10.0.43 被配置为 DNS 服务器。当客户端建立 VPN 隧道时,会将这些 DNS 服务器参数推送到最终用户的主机。

$ cat /etc/resolv.conf | grep nameservernameserver 10.10.1.228 # Primary DNS server nameserver 10.10.0.43 # Secondary DNS server

客户端计算机发出的 DNS 查询会通过此 VPN 隧道发送到 Client VPN VPC。然后,DNS 请求会通过中转网关转发到 Route 53 Resolver 入站端点。将域名解析为 IP 地址后,应用程序流量也会通过 VPN 隧道传输。只要解析的目标 IP 地址与 Client VPN 端点路由表中的路由相匹配,此流程就会继续。

通过此配置,最终用户可以解析使用标准 DNS 解析的外部域名。同时还能解析与包含 Route 53 Resolver 入站端点的 Amazon VPC 关联的私有托管区中的记录。

$ dig amazon.com;; ANSWER SECTION:amazon.com.        8    IN    A    176.32.103.205
;; SERVER: 10.10.1.228#53(10.10.1.228)
(...)

$ dig test.example.local # Route 53 private hosted zone record ;; ANSWER SECTION:
test.example.local. 10 IN A 10.123.2.1
;; SERVER: 10.10.1.228#53(10.10.1.228)
(...)

$ dig ec2.ap-southeast-2.amazonaws.com # VPC interface endpoint to EC2 service in Route 53 Resolver VPC;; ANSWER SECTION:
ec2.ap-southeast-2.amazonaws.com. 60 IN    A    10.10.0.33
;; SERVER: 10.10.1.228#53(10.10.1.228)
(...)

$ dig ec2-13-211-254-134.ap-southeast-2.compute.amazonaws.com # EC2 instance public DNS hostname running in Route 53 Resolver VPC;; ANSWER SECTION:
ec2-13-211-254-134.ap-southeast-2.compute.amazonaws.com. 20 IN A 10.10.1.11
;; SERVER: 10.10.1.228#53(10.10.1.228)
(...)