亚马逊AWS官方博客

在Virtual Private Cloud中自建基于BIND的DNS服务器

Amazon Virtual Private Cloud (Amazon VPC) 是 AWS 提供的虚拟私有网络服务,允许您在 AWS 云中预配置出一个采用逻辑隔离的部分,让您在自己定义的虚拟网络中启动 AWS 资源。您可以完全掌控您的虚拟联网环境,包括选择自有的 IP 地址范围、创建子网,以及配置路由表和网关。

除了提供IP资源及网络连接,Amazon VPC还提供DNS及DHCP等基础设施服务。当您将实例启动到默认 VPC 中时,我们为实例提供与其公有 IPv4 和私有 IPv4 地址对应的公有和私有 DNS 主机名。当您在非默认 VPC 中启动实例时,我们会为实例提供私有 DNS 主机名,并根据您为 VPC 和实例指定的设置来决定是否提供公有 DNS 主机名。

对于 us-east-1 区域,公有 (外部) DNS 主机名采用 ec2-<public-ipv4-address>.compute-1.amazonaws.com 形式,对于其他区域,则采用 ec2-<public-ipv4-address>.region.amazonaws.com 形式。例如,公有IP为54.222.212.110的EC2实例,其公有DNS名为ec2-54-222-212-110.cn-north-1.compute.amazonaws.com.rproxy.goskope.com.cn。我们将公有 DNS 主机名解析为该实例在所在网络外的公有 IPv4 地址及其在所在网络内的私有 IPv4 地址。

私有 (内部) DNS 主机名解析为实例的私有 IPv4 地址,并对 us-east-1 区域采用 ip-<private-ipv4-address>.ec2.internal 形式,对其他区域采用 ip-<private-ipv4-address>.region.compute.internal 形式 (其中 private.ipv4.address 是反向查找 IP 地址)。例如,私有IP地址为10.206.2.239的EC2实例,其私有DNS名为ip-10-206-2-239.cn-north-1.compute.internal。您可以使用私有 DNS 主机名在同一网络中实现实例之间的通信,但我们无法解析实例所在网络之外的 DNS 主机名。要解析实例所在网络之外的主机名,可自建DNS服务器来为VPC及外部网络提供DNS服务。

常见的应用场景是在混合IT架构下,客户数据中心通过VPN或是Direct Connect专线连接到AWS上的VPC,在VPC中配置1台DNS服务器,在客户数据中心也配置1台DNS服务器,服务器的主从角色客户可自行定义。通过多台DNS服务器为不同位置的客户端提供DNS服务,即能保证服务的高可用,又能就近提供服务,减少DNS查询延迟。

接下来,我将基于上述架构图一步一步说明如何使用BIND搭建DNS服务器。本文不会涉及BIND的高级配置,如需了解BIND的高级配置,可参考BIND官方网站

安装配置DNS主服务器

首选需要准备一台EC2实例用于安装BIND软件,如何创建EC2实例可参考Amazon EC2入门指南。本次示例选用Amazon Linux操作系统的AMI来创建实例,实例类型选用了通用型实例类型: m4.large。BIND对服务器硬件资源要求不高,在不启用DNSSEC的情况下(不在本文讨论范围),普通配置的服务器即可承载DNS服务。m4.large配置有2颗vCPU和8G内存,运行DNS服务能够支持中等规模的DNS请求,当请求增加时,也可方便的调整实例类型到更大的配置。

创建EC2实例时需要指定安全组来开放服务端口,DNS服务通过UDP 53端口提供DNS查询相应,通过TCP 53端口提供区域传送。因此,安全组队VPC网段开放UDP 53端口,对客户数据中心的DNS服务器开放TCP 53端口,如下图所示:

DNS服务器作为基础设施服务的重要性无须多言,Amazon EC2持续监控EC2实例的状态以及底层硬件的状态,分别称为实例状态检查和系统状态检查。我们可创建状态检查报告,当任一状态检查失败时,执行重启操作,并将警报发送至指定邮箱。

创建好警报之后,通过SSH登陆至EC2实例,并yum命令安装bind软件:

yum install bind-utils bind

安装好之后,我们接下来将创建一个示例的DNS域:aws.local,我们首先需要编辑/etc/named.conf文件,修改以下内容:

listen-on 缺省配置为127.0.0.1,DNS服务只会绑定到系统的环回接口,其他客户端无法访问,需要添加EC2实例的私有IP地址,才能提供外部访问

allow-query缺省配置为localhost,即只允许DNS服务器所在的EC2实例对自己进行DNS查询,添加VPC的网段可允许来自VPC内部的主机进行DNS查询。注:也可将此参数设置为0.0.0.0/0,因为前面安全组设置里只允许了VPC内的IP访问UDP 53端口。

此外,还需要增加对aws.local这个域的定义,在/etc/named.conf中增加以下内容,allow-transfer指定了只允许从DNS服务器进行区域传送,限定允许区域传送的范围颗可提高DNS服务的安全性:

上述配置说明aws.local域的具体解析配置在文件/var/named/aws.local.db 里,其内容如下,在这个示例配置中,定义了两条A记录,分别是dns.aws.local对应10.206.0.212和www.aws.local对应10.206.0.213

配置Amazon VPC使用自建DNS服务器

Amazon VPC通过DHCP服务为VPC中的EC2及其他连网组件动态分配IP地址,动态主机配置协议 (DHCP) 提供了将配置信息传递到 TCP/IP 网络中主机的标准。DHCP 消息中的options字段包含配置参数。这些参数包括域名、域名服务器以及“netbios-node-type”。接下来我们将创建一个新的DHCP选项集,并在选项集中将域名服务器指向刚才创建的DNS服务器。

在AWS控制台中选择VPC服务,并在左边的菜单中选择“DHCP选项集”,点击“创建DHCP选项集”按钮,输入以下信息,域名服务器可指定多个DNS服务器,按照顺序第一个为VPC内的DNS服务器,第二个为客户数据中心的DNS服务器:

创建好DHCP选项集之后选择左边菜单中“您的VPC”选项,选中要修改的VPC,从“操作”下拉菜单中选择“编辑DHCP选项集”

选择刚才创建的DHCP选项集并保存:

在您将新的 DHCP 选项集与 VPC 关联之后,任何现有实例以及您在 VPC 内启动的所有新增实例都将使用这些选项。 无需重新开始或重新启动实例。根据实例更新 DHCP 租赁权的频率,它们会在几个小时内自动拾取更改。如果您愿意,您也可以使用实例上的操作系统,直接更新租赁权。

安装配置DNS从服务器

在客户数据中心安装配置DNS服务器的步骤与在Aamazon EC2中安装配置DNS服务器的步骤相同,除了/etc/named.conf的配置稍有差别:

从服务器的type类型为slave,file参数对应的域配置文件会自动根据从主DNS服务器接收到的更新来进行创建和更新,masters指定aws.local域的主域名服务器,最后一个参数allow-transfer禁用了区域传送。

配置好从DNS服务器之后,可将客户数据中心内的连网设备设置为从DNS服务器,第二DNS服务器设置为AWS上的主DNS服务器。

总结

Amazon VPC提供DHCP服务和DNS服务,为VPC中的EC2实例提供IP地址分配和域名解析服务,为每个EC2实例创建特定格式的DNS域名。如果用户希望使用自定义域名,或者希望使用一套域名统一管理云上和云下的资源,可自行搭建DNS服务器来提供DNS解析服务,Amazon VPC能够支持客户。

作者简介

刘旭东,AWS解决方案架构师 。负责基于AWS的云计算方案的咨询和架构设计,具有超过十年以上企业客户服务经验,同时致力于AWS云服务在国内和全球的应用和推广。在大数据解决方案、企业级解决方案,混合云架构,基础设施运维管理,以及Serverless无服务器架构及IoT等领域有着广泛的设计与实践经验。在加入AWS之前曾任职HPE技术顾问,有超过十年的虚拟化/云计算架构设计经验, 始终推动技术实现商业价值。