
# 通过Linux BIND实现混合云DNS解析
#### 应用场景
DNS解析依赖于域名服务器（DNS），也称为域名解析服务器，它通过内置数据库将IP地址与相应的域名映射到私有或公共网络中的域名。
在单一环境（如本地环境）中由于解析过程处于同一网络内部，进行DNS解析相对简单。但在混合云环境中，本地与云环境间的域名解析会更复杂 ，这是因为二者完全隔离，导致本地虚拟机（指向自建DNS）访问华为集成DNS管理的云服务终端节点时可能出现连接问题，云环境中ECS实例（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进行进一步解析和响应。
图1解决方案示意图   
![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002374091088.png "点击放大")
1. 用户将充分利用Linux BIND在混合云环境中执行域名解析。 在混合云环境中，两台DNS服务器将分别配置为主DNS（DNS01）、备DNS（DNS02），以实现本地和云环境之间的单一DNS记录备份。
   需要注意的是，两台DNS服务器都配置了冗余功能。备用DNS服务器（DNS02）是一个只读副本，所有区域配置的更新只能在主DNS服务器（DNS01）上进行，并通过序列号的变化自动更新备用DNS服务器（DNS02）。
   
2. 两台DNS服务器（DNS01和DNS02）都应启用条件转发，以解析华为云云服务终端节点。
   - 云上所有ECS实例将指向DNS02作为首选DNS服务器，DNS01作为备用。
   
   - 本地环境中的所有虚拟机将指向DNS01作为首选，DNS02作为备用。
   
   
   如果账号3中的ECS02想要解析账号2中的ECS01的域名，它会向首选DNS（DNS02）发送DNS查询请求。同样的流程模式适用于其他云上ECS和本地虚拟机。
   
3. 本地环境中的虚拟机VM01想要访问华为云云服务（如OBS、SMN、CES等）的终端节点，它会向首选DNS服务器（DNS01）发送DNS查询请求，DNS01检测到请求的域名托管在另一个名称服务器上，会将DNS查询转发到相应的名称服务器（华为集成DNS）进行进一步解析和响应。
4. 云上ECS实例想要访问华为云云服务（如OBS、SMN、CES等）的终端端点，它会向首选DNS服务器（DNS02）发送DNS查询请求，DNS02检测到请求的域名托管在另一个名称服务器上，会将DNS查询转发到相应的名称服务器（华为集成DNS）进行进一步解析和响应。
![](https://support.huaweicloud.com/bestpractice-dns/public_sys-resources/note_3.0-zh-cn.png)
本实践所涵盖的本地网络环境与华为云环境中的IP地址均为示例，仅供参考使用。实际应用中，请根据真实网络规划进行部署。
#### 准备工作
- 您需要熟悉以下华为云基本概念： 虚拟私有云（VPC）、子网、弹性IP、VPC对等连接和虚拟专用网络（VPN）、云解析服务（DNS）
  
- 您需要熟悉以下工具的使用： Linux环境、BIND软件包
  
 
#### 步骤一：使用华为域名服务配置内网区域
1. 进入[内网域名列表页面](https://console.huaweicloud.com/dns/?#/dns/privatezones)。
2. 在页面右上角，单击"创建内网域名"。
   图2创建内网域名   
   ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407730637.png "点击放大") 
3. 在域名记录集列表页，查看并记录当前区域的内网DNS地址、NS和SOA类型记录集的记录值，以便用于创建反向区域文件。
   图3进入域名的记录集列表   
   ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407570773.png "点击放大")
   图4查看并记录信息   
   ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002374091112.png "点击放大") 
 
 #### 步骤二：配置主DNS服务器（DNS01）
1. 远程登录您的主DNS服务器，输入以下命令更新服务器并安装BIND。
   ```
   yum update -y
   yum install bind-utils
   ```
   
2. 备份原来的name.conf文件，开始编辑。
   ```
   mv /etc/named.conf /etc/named.conf.orig
   vim /etc/named.conf
   ```
   
3. 根据环境需求相应调整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;
   };
   ```
   
4. 使用以下命令为内网域名创建实际区域文件。
   ```
   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
   ```
   
5. 使用以下命令为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 hours)
                  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.
   ```
   
6. 使用以下命令为华为集成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.
   ```
   
7. 使用以下命令检查/etc/name.conf文件的语法。
   ```
   named-checkconf
   ```
   如果配置文件不返回任何内容，则该配置文件有效。
   
8. 使用以下命令检查区域文件的语法。
   ```
   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]所示。
   图5使用named-checkzone进行语法检查的输出示例   
   ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002373931216.png "点击放大") 
9. 使用以下命令启用并启动BIND服务。
   ```
   systemctl enable named
   systemctl start named
   ```
   
10. 使用以下命令备份并更新/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）
1. 远程登录您的备用DNS服务器，并输入以下命令更新服务器并安装BIND。
   ```
   yum update -y
   yum install bind bind-utils
   ```
   
2. 备份原来的name.conf文件，开始编辑。
   ```
   mv /etc/named.conf /etc/named.conf.orig
   vim /etc/named.conf
   ```
   
3. 调整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 };
   };
   ```
   
4. 使用以下命令检查/etc/name.conf文件的语法。
   ```
   named-checkconf
   ```
   如果配置文件不返回任何内容，则该配置文件有效。
   
5. 使用以下命令启用并启动BIND服务。
   ```
   systemctl enable named
   systemctl start named
   ```
   
6. 使用以下命令备份并更新/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服务器
1. 远程登录VM01、ECS01、ECS02，输入以下命令更新服务器，安装BIND。
   ```
   yum update -y
   yum install bind bind-utils
   ```
   
2. 设置并配置名称服务器，使其指向[步骤二：配置主DNS服务器（DNS01）]和[步骤三：配置备用DNS服务器（DNS02）]中部署的DNS服务器IP地址。
   ```
   vim /etc/resolv.conf
   ```
   - VM01的nameserver配置如下：
     图6nameserver配置示例   
     ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407730653.png) 
   
   - ECS01和ECS02的nameserver配置如下：
     图7nameserver配置示例   
     ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407570777.png) 
    
 
#### 配置验证
在本节中，我们将使用配置在多账户结构中的IP地址和域名来测试网络连接，该结构通过VPN连接、VPC对等连接以及配置的路由进行连接。我们还将使用nslookup命令来测试访问华为云云服务（如OBS、SMN和CES）的终端节点连接情况。
1. 使用ping命令验证VM01到ECS01和ECS02的连通性。
   1. 使用IP地址进行ping
      图8在VM01上ping ECS01和ECS02的IP地址   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002373931220.png "点击放大") 
   
   2. 使用域名进行ping。
      图9在VM01上ping ECS01和ECS02的域名   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407730657.png "点击放大") 
   
   3. 验证VM01到华为云云服务的连通性。
      图10通过VM01访问华为云云服务的终端节点   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407570781.png "点击放大") 
    
2. 使用ping命令验证ECS01到VM01和ECS02的连通性。
   1. 使用IP地址进行ping。
      图11在ECS01上ping VM01和ECS02的IP地址   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002374091120.png "点击放大") 
   
   2. 使用域名进行ping。
      图12在ECS01 ping VM01和ECS02的域名   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002373931224.png "点击放大") 
   
   3. 验证ECS01到华为云云服务的连通性。
      图13通过ECS01访问华为云云服务的终端节点   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407730661.png "点击放大") 
    
3. 使用ping命令验证ECS02到VM01和ECS01的连通性。
   1. 使用IP地址进行ping。
      图14在ECS02上ping VM01和ECS01的IP地址   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002407570785.png "点击放大") 
   
   2. 使用域名进行ping。
      图15在ECS02 ping VM01和ECS01的域名   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002374091124.png "点击放大") 
   
   3. 验证ECS02到华为云云服务的连通性。
      图16通过ECS02访问华为云云服务的终端节点   
      ![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002373931228.png "点击放大") 
    
 
#### 总结
在本实践中，我们学习了如何在多账户环境中使用Linux BIND部署主备DNS服务器进行DNS解析。在本文中，我们学习了如何在多账户环境中部署DNS服务器，使用集成AD的DNS服务器进行DNS解析。同时，我们还配置了DNS服务器作为华为集成DNS的转发器，以解析SMN、OBS、CES等华为云云服务的终端节点，方便访问任何环境中使用的资源。
