通过Linux BIND实现混合云DNS解析
应用场景
DNS解析依赖于域名服务器(DNS),也称为域名解析服务器,它通过内置数据库将IP地址与相应的域名映射到私有或公共网络中的域名。
在单一环境中(如本地环境)进行DNS解析相对简单,因为解析过程发生在同一网络内部。而在混合云环境中,当需要在本地环境与云环境之间进行域名解析时,情况会变得复杂。这是因为云环境与本地环境完全隔离,因此需要进行高级配置来实现域名解析。这种复杂性源于以下问题:当本地环境中的虚拟机(指向自行部署的DNS服务器)尝试访问由华为集成DNS管理的华为云云服务的终端节点时,可能会出现连接问题。同样在云环境中,如果ECS实例的DNS服务器指向本地自行部署的DNS服务器,那么在尝试访问云服务的终端节点时,也会遇到无法解析域名的问题。
本实践的解决方案是通过在使用Linux BIND部署的DNS服务器上启用条件转发,将华为云云服务的终端节点接收到的DNS查询转发到华为集成DNS进行进一步解析和响应,从而实现以下目标:
- 通过VPC对等连接和VPN连接允许多账号环境中的资源通信。
- 使用Linux BIND在多账号环境中部署主DNS服务器和备DNS服务器以进行DNS解析。
- 在自建DNS服务器上配置转发,将华为云服务域名的解析请求转发到华为云集成DNS解析。
解决方案
为了演示使用Linux BIND在混合云环境中进行DNS解析,使用了马来西亚和新加坡地区的云环境。
- 在马来西亚和新加坡地区之间建立了VPN连接,以允许资源进行跨区域通信。
- 新加坡地区的子账户通过VPC对等连接互相连接,实现同一区域内的跨账号通信,同时配置了路由以达到相同的目的。
- 使用Linux BIND在马来西亚地区设置主DNS服务器,而备DNS服务器将在新加坡地区的一个账号中设置。新加坡地区的备DNS服务器是一个只读副本,是马来西亚地区主DNS服务器的复制品集。区域文件中的任何更新都需要在主DNS服务器上进行配置,并且会通过区域文件中序列号的递增自动更新到备DNS服务器。
通过上述配置,我们可以实现使用Linux BIND在混合云环境中进行DNS解析的目的。本地环境(马来西亚地区)中的虚拟机将指向主DNS服务器作为首选DNS,备DNS服务器作为备用DNS;而云环境(新加坡地区)中的ECS将指向备DNS服务器作为首选DNS,主DNS服务器作为备用DNS。主DNS服务器和备DNS服务器都应配置为将请求转发到华为集成DNS,以便当虚拟机或ECS需要访问华为云云服务(如OBS、SMN等)时,能够解析这些服务的终端节点。例如,如果ECS01需要访问OBS服务,他将向DNS02发送DNS查询。DNS02将识别请求的域名由另一个名称服务器托管,并将请求转发到华为集成DNS进行进一步解析和响应。

- 用户将充分利用Linux BIND在混合云环境中执行域名解析。
在混合云环境中,两台DNS服务器将分别配置为主DNS(DNS01)、备DNS(DNS02),以实现本地和云环境之间的单一DNS记录备份。
需要注意的是,两台DNS服务器都配置了冗余功能。备用DNS服务器(DNS02)是一个只读副本,所有区域配置的更新只能在主DNS服务器(DNS01)上进行,并通过序列号的变化自动更新备用DNS服务器(DNS02)。
- 两台DNS服务器(DNS01和DNS02)都应启用条件转发,以解析华为云云服务终端节点。
- 云上所有ECS实例将指向DNS02作为首选DNS服务器,DNS01作为备用。
- 本地环境中的所有虚拟机将指向DNS01作为首选,DNS02作为备用。
如果账号3中的ECS02想要解析账号2中的ECS01的域名,它会向首选DNS(DNS02)发送DNS查询请求。同样的流程模式适用于其他云上ECS和本地虚拟机。
- 本地环境中的虚拟机VM01想要访问华为云云服务(如OBS、SMN、CES等)的终端节点,它会向首选DNS服务器(DNS01)发送DNS查询请求,DNS01检测到请求的域名托管在另一个名称服务器上,会将DNS查询转发到相应的名称服务器(华为集成DNS)进行进一步解析和响应。
- 云上ECS实例想要访问华为云云服务(如OBS、SMN、CES等)的终端端点,它会向首选DNS服务器(DNS02)发送DNS查询请求,DNS02检测到请求的域名托管在另一个名称服务器上,会将DNS查询转发到相应的名称服务器(华为集成DNS)进行进一步解析和响应。

本实践所涵盖的本地网络环境与华为云环境中的IP地址均为示例,仅供参考使用。实际应用中,请根据真实网络规划进行部署。
准备工作
步骤一:使用华为域名服务配置内网区域
- 进入内网域名列表页面。
- 在页面右上角,单击“创建内网域名”。
图2 创建内网域名
- 在域名记录集列表页,查看并记录当前区域的内网DNS地址、NS和SOA类型记录集的记录值,以便用于创建反向区域文件。
图3 进入域名的记录集列表图4 查看并记录信息
步骤二:配置主DNS服务器(DNS01)
- 远程登录您的主DNS服务器,输入以下命令更新服务器并安装BIND。
yum update -y yum install bind-utils
- 备份原来的name.conf文件,开始编辑。
mv /etc/named.conf /etc/named.conf.orig vim /etc/named.conf
- 根据环境需求相应调整named.conf文件中的设置,需要更改的主要字段如下所示并以加粗形式标出。
为了能够解析华为服务端点(如 OBS、CES、SMN 等),需要通过在本named.conf文件中配置转发器来启用BIND的条件转发功能,具体配置如下所示并以加粗字体标出。
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html acl "trusted-recursion" { localhost; localnets; 10.1.0.0/24; 10.2.0.0/24; 10.3.0.0/24; 10.4.0.0/24; }; options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; allow-recursion { trusted-recursion; }; allow-query-cache { trusted-recursion; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become large-scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ /* recursion yes; */ dnssec-enable yes; dnssec-validation no; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; # Setup Huawei Integrated DNS as forwarders forwarders { 100.125.xx.xx; 100.125.xx.xx; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; zone "example.com" { type master; file "dynamic/example.com"; # zone file path allow-transfer { 10.2.0.50; }; notify yes; }; zone "10.in-addr.arpa" in { type master; file "dynamic/10.in-addr.arpa.zone"; allow-transfer { 10.2.0.50; }; notify yes; }; zone "125.100.in-addr.arpa" in { type master; file "dynamic/125.100.in-addr.arpa.zone"; allow-transfer { 10.2.0.50; }; notify yes; };
- 使用以下命令为内网域名创建实际区域文件。
vim /var/named/dynamic/db.example.com
根据您的环境需求调整设置。
$TTL 300 ; 5 minutes @ IN SOA dns01.example.com. admin.example.com. ( 1 ; Serial 3600 ; Refresh 300 ; Retry 1814400 ; Expire 300 ) ; Negative Cache TTL ; name servers - NS records IN NS dns01.example.com. IN NS dns02.example.com. ; name servers - A records dns01.example.com. IN A 10.1.0.50 dns02.example.com. IN A 10.2.0.50 ; All other A records example.com. IN A 10.1.0.200 www.example.com. IN A 10.1.0.200 ecs01.example.com. IN A 10.3.0.105 ecs02.example.com. IN A 10.4.0.105 vm01.example.com. IN A 10.1.0.105
- 使用以下命令为10.in-adr.arpa.zone创建反向区域文件。
vim /var/named/dynamic/10.in-addr.arpa.zone
根据您的环境需求调整设置。
$TTL 86400 ; 1 day @ IN SOA dns01.example.com. admin.example.com. ( 1 ; Serial 7200 ; refresh (2 hous) 7200 ; retry (2 hours) 2419200 ; expire (5 weeks 6 days 16 hours) 86400 ) ; minimum (1 day) @ IN NS dns01.example.com. @ IN NS dns02.example.com. @ IN PTR example.com. dns01 IN A 10.1.0.50 dns01 IN A 10.2.0.50 ecs01 IN A 10.3.0.105 ecs02 IN A 10.4.0.105 vm01 IN A 10.1.0.105 www IN A 10.1.0.200 200.0.1 IN PTR www.example.com. 50.0.1 IN PTR dns01.example.com. 50.0.2 IN PTR dns02.example.com. 105.0.3 IN PTR ecs01.example.com. 105.0.4 IN PTR ecs02.example.com. 105.0.1 IN PTR vm01.example.com.
- 使用以下命令为华为集成DNS 125.100.in-addr.arpa.zone创建反向区域文件。
vim /var/named/dynamic/125.100.in-addr.arpa.zone
根据您的环境需要调整设置,其中SOA、NS、PTR信息填写步骤3中记录的信息。
$TTL 86400 ; 1 day @ IN SOA ns1.system.hwclouds-dns.com. yiam\.kar\.kar.huawei.com. ( 1 ; Serial 7200 ; refresh (2 hours) 7200 ; retry (2 hours) 2419200 ; expire (5 weeks 6 days 16 hours) 86400 ) ; minimum (1 day) @ IN NS ns2.system.hwclouds-dns.com. @ IN NS ns1.system.hwclouds-dns.com. ns1 IN A 100.125.xx.xx ns2 IN A 100.125.xx.xx 250.1 IN PTR ns2.system.hwclouds-dns.com. 250.128 IN PTR ns1.system.hwclouds-dns.com.
- 使用以下命令检查/etc/name.conf文件的语法。
named-checkconf
如果配置文件不返回任何内容,则该配置文件有效。
- 使用以下命令检查区域文件的语法。
named-checkzone example.com /var/named/dynamic/db.example.com named-checkzone example.com /var/named/dynamic/10.in-addr.arpa.zone named-checkzone example.com /var/named/dynamic/125.100.in-addr.arpa.zone
示例如图5所示。
- 使用以下命令启用并启动BIND服务。
systemctl enable named systemctl start named
- 使用以下命令备份并更新/etc/resolv.conf文件中的nameserver。
mv /etc/resolv.conf /etc/resolv.conf.orig vim /etc/resolv.conf
根据您的环境需求调整nameserver设置。
domain example.com search example.com nameserver 10.1.0.50 nameserver 10.2.0.50
步骤三:配置备用DNS服务器(DNS02)
- 远程登录您的备用DNS服务器,并输入以下命令更新服务器并安装BIND。
yum update -y yum install bind bind-utils
- 备份原来的name.conf文件,开始编辑。
mv /etc/named.conf /etc/named.conf.orig vim /etc/named.conf
- 调整name.conf文件中的设置,以满足您的环境需求。
需要更改的主要字段如下所示并以加粗字体显示,还需要配置的转发器用以解析备用服务器中的华为云云服务终端节点。
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html acl "trusted-recursion" { localhost; localnets; 10.1.0.0/24; 10.2.0.0/24; 10.3.0.0/24; 10.4.0.0/24; }; options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; allow-recursion { trusted-recursion; }; allow-query-cache { trusted-recursion; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become large-scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ /* recursion yes; */ dnssec-enable yes; dnssec-validation no; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; # Setup Huawei Integrated DNS as forwarders forwarders { 100.125.xx.xx; 100.125.xx.xx; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; zone "example.com" { type slave; file "slaves/db.example.com"; masters { 10.1.0.50; }; }; zone "1.168.192.in-addr.arpa" in { type slave; file "slaves/10.in-addr.arpa.zone"; masters { 10.1.0.50 }; zone "125.100.in-addr.arpa" in { type slave; file "slaves/125.100.in-addr.arpa.zone"; masters { 10.1.0.50 }; };
- 使用以下命令检查/etc/name.conf文件的语法。
named-checkconf
如果配置文件不返回任何内容,则该配置文件有效。
- 使用以下命令启用并启动BIND服务。
systemctl enable named systemctl start named
- 使用以下命令备份并更新/etc/resolv.conf文件中的nameserver。
mv /etc/resolv.conf /etc/resolv.conf.orig vim /etc/resolv.conf
根据您的环境需求调整nameserver设置。
domain example.com search example.com nameserver 10.1.0.50 nameserver 10.2.0.50
步骤四:配置客户端DNS服务器
- 远程登录VM01、ECS01、ECS02,输入以下命令更新服务器,安装BIND。
yum update -y yum install bind bind-utils
- 设置并配置名称服务器,使其指向步骤二:配置主DNS服务器(DNS01)和步骤三:配置备用DNS服务器(DNS02)中部署的DNS服务器IP地址。
vim /etc/resolv.conf
- VM01的nameserver配置如下:
图6 nameserver配置示例
- ECS01和ECS02的nameserver配置如下:
图7 nameserver配置示例
- VM01的nameserver配置如下:
配置验证
在本节中,我们将使用配置在多账户结构中的IP地址和域名来测试网络连接,该结构通过VPN连接、VPC对等连接以及配置的路由进行连接。我们还将使用nslookup命令来测试访问华为云云服务(如OBS、SMN和CES)的终端节点连接情况。
- 使用ping命令验证VM01到ECS01和ECS02的连通性。
- 使用IP地址进行ping
图8 在VM01上ping ECS01和ECS02的IP地址
- 使用域名进行ping。
图9 在VM01上ping ECS01和ECS02的域名
- 验证VM01到华为云云服务的连通性。
图10 通过VM01访问华为云云服务的终端节点
- 使用IP地址进行ping
- 使用ping命令验证ECS01到VM01和ECS02的连通性。
- 使用IP地址进行ping。
图11 在ECS01上ping VM01和ECS02的IP地址
- 使用域名进行ping。
图12 在ECS01 Ping VM01和ECS02的域名
- 验证ECS01到华为云云服务的连通性。
图13 通过ECS01访问华为云云服务的终端节点
- 使用IP地址进行ping。
- 使用ping命令验证ECS02到VM01和ECS01的连通性。
- 使用IP地址进行ping。
图14 在ECS02上ping VM01和ECS01的IP地址
- 使用域名进行ping。
图15 在ECS02 Ping VM01和ECS01的域名
- 验证ECS02到华为云云服务的连通性。
图16 通过ECS02访问华为云云服务的终端节点
- 使用IP地址进行ping。
总结
在本实践中,我们学习了如何在多账户环境中使用Linux BIND部署主备DNS服务器进行DNS解析。在本文中,我们学习了如何在多账户环境中部署DNS服务器,使用集成AD的DNS服务器进行DNS解析。同时,我们还配置了DNS服务器作为华为集成DNS的转发器,以解析SMN、OBS、CES等华为云云服务的终端节点,方便访问任何环境中使用的资源。