12 min read

企业高可用DNS架构部署方案

企业高可用DNS架构部署方案

第1章 背景

域名系统(Domain Name System,DNS)是一种组织成域层次结构的计算机和网络服务命名系统,它主要是用来通过用户亲切而好友的名称替代枯燥而难忘的IP地址以定位相应的计算机和相互服务。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器;域名解析就是将域名映射为IP地址的过程。
鉴于规模比较大的企业架构特点(内部服务依赖内部专线访问)以及企业分规模数量(几十、几百计),为此,需要一个较为合理的DNS系统方案来控制IT投入成本,同时兼备IT服务的稳定运作。

第2章 系统规划

2.1 系统拓扑

dns_topo
从上述的系统拓扑图可以得知,该分公司使用2台服务器(虚拟机)来提供DNS服务,服务器与核心交换机建立iBGP互联,同时2台服务器同时宣告业务IP地址:100.250.0.53、100.250.0.54, 核心交换机从iBGP接收到服务器宣告业务IP地址,每个业务IP地址都存在2条路由路径—以ECMP实现的负载均衡。

2.2 系统需求

内/外网解析分离

保证内部服务可通过专线正常解析,公网可以使用本地最佳公共DNS解析。

减少windows授权

为减少资产投入,在保证AD域控功能的前提下,替换基于Windows平台的RODC服务器。

使用统一服务IP

分公司DNS服务地址保持一致,打破不同分公司DNS地址不一致现象。

负载平衡

使用动态路由(BGP/OSPF)互联实现ECMP,提高DNS服务器节点的平衡性。

维护窗口灵活

结合动态路由拥有更灵活的维护窗口。

故障转移能力

DNS服务器(或宿主机)故障,不影响分公司终端正常解析(浮动路由生效)。

平滑升级扩容

DNS服务可随业务需求随时按需扩/缩容(建议最小节点数量为2台)。

域名缓存加速

域名缓存功能,客户端再次请求直接从缓存中的返回,缩短用户解析等待时间。

解析日志

记录用户域名解析记录,内容涵盖请求时间、客户端地址、域名、解析记录。

错误查询日志

记录失败的解析域名数量。

业务监控展示

展示DNS服务解析总数量、记录类型数量、错误数量等。

过滤恶意域名

可针对恶意域名进行过滤--阻止解析,保护上网终端安全。

第3章 资源需求

3.1 服务器资源

DNS系统服务器所需的资源配置。

序号 资源类型 型号或规格 备注
1 CPU 2核 /
2 内存 4G 视实际环境为准
3 存储 50G /
4 网络 千兆单网卡 /
5 服务器类型 物理机或虚拟机 /

3.2 系统资源

本节点部署所用到的系统或软件。

序号 资源类型 名称及版本号
1 OS CentOS-7
2 DNS软件 Bind-9
3 系统监控软件 node_exporter-1.0.1、Prometheus、Grafana
4 DNS服务监控软件 bind_exporter-0.3.0(Bind)

3.3 IP地址资源

为确保DNS服务IP地址一致性,统一使用以下业务IP。

序号 业务IP地址
1 100.250.0.53
2 100.250.0.54

第4章 部署方案

4.1系统配置

4.1.1配置业务IP

业务IP实际为虚拟IP,直接绑定至DNS服务器的lo网口即可,操作步骤如下:

编辑/etc/sysconfig/network-scripts/ifcfg-lo文件,添加如下内容:

IPADDR1=100.250.0.53
NETMASK1=255.255.255.255
IPADDR2=100.250.0.54
NETMASK2=255.255.255.255

重启网络服务,使上述虚拟IP生效

# systemctl restart network

使用以下命令来检查是否生效

# ip add show lo

正常输出应如下所示:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
  inet 100.250.0.53/32 brd 100.250.0.53 scope host lo  # 新增地址
    valid_lft forever preferred_lft forever
  inet 100.250.0.54/32 brd 100.250.0.54 scope host lo  # 新增地址
    valid_lft forever preferred_lft forever

4.1.2重命名网卡名称

RHEL自升级之后(CentOS7/RHEL7),网卡命名采用“一致性网络设备接口”的命名方法,导致不同设备的不同网卡名称各不相同。为了统一网卡命名,方便配置文件的书写,特此修改网卡命名为ethX方式。

前往/etc/default/grub文件中加入net.ifnames=0 biosdevname=0重新生成grub.cfg重启操作系统生效

# vim /etc/default/grub
GRUB_CMDLINE_LINUX="... net.ifnames=0 biosdevname=0"

重新生成启动文件

grub2-mkconfig -o /boot/grub2/grub.cfg

重启操作系统

systemctl reboot

重启操作系统后,重新配置网络互联地址。

4.2 与交换机建立动态路由

本方案所指的动态路由分别为iBGP与OSPF两种路由协议。

4.2.1 iBGP

对应规范名称,接实际参考。

  • BGP AS号: 65353

  • BGP 组名:DNS-Server internal

  • BGP 路由接收路由地址:

    • 100.250.0.53
    • 100.250.0.54
  • 路由策略名称:permitToBGP

配置案例

交换机侧配置

举例:企业分部核心交换机品牌型号为华为S5720S-EI,服务器网段为10.26.38.0/24,DNS服务器互联IP分别为 10.26.38.2/2410.26.38.3/24,网关配置在本设备的vlanif 1000 接口,地址为10.26.38.254/24

bgp 65353
router-id 10.26.38.254                                   # 建议以DNS服务器网关地址
group To-DNS-Server internal                             # 定义BGP组名以及类型
maximum load-balancing ibgp 2                            # 负载均衡数量,固定值为2 
peer To-DNS-Server description To-DNS-Server-BGP-Group   # BGP描述名称
peer To-DNS-Server connect-interface vlanif 1000         # DNS服务器地址VLAN接口
peer 10.26.38.2 group To-DNS-Server                      # 第1台DNS服务器地址
peer 10.26.38.3 group To-DNS-Server                      # 第2台DNS服务器地址
#
ipv4-family unicast
undo synchronization
preference 6 6 6                                         # 定义BGP路由管理距离
peer To-DNS-Server enable
peer To-DNS-Server route-policy permitToBGP import       # 引用路由策略

route-policy permitToBGP permit node 10
if-match ip-prefix permitToBGP                           # 引用路由前缀表
apply community no-export additive                       # 为BGP添加属性

ip ip-prefix permitToBGP index 10 permit 100.250.0.53 32 # 路由前缀表定义DNS地址
ip ip-prefix permitToBGP index 15 permit 100.250.0.54 32 # 路由前缀表定义DNS地址

DNS服务端配置

Quagga 是常用的动态路由(BGP、OSPF、ISIS、RIP等)软件包,它可以将一台普通的X86服务器配置成路由器。

使用yum 工具安装quagga软件包

# yum -y install quagga

创建/etc/quagga/bgpd.conf文件,内容如下:

router bgp 65353                                    # BGP AS号
bgp router-id 10.26.38.2                            # 路由ID号,互联IP(按实际修改)
bgp log-neighbor-changes                           # 启用日志功能
maximum load-balancing ibgp 2                      # ECMP条目数量,与DNS节点相等
neighbor 10.26.38.254 remote-as 65353                # BGP邻居AS号
neighbor 10.26.38.254 description "to Default Gateway"   # BGP邻居描述信息
network 100.250.0.53/32                           # DNS业务IP地址
network 100.250.0.54/32                           # DNS业务IP地址

启动bgp并加到开机自启动

systemctl start zebra bgpd
systemctl enable zebra bgpd

4.2.2 OSPF

Quagga配置
ospf

交换机侧配置略

4.2 Bind

4.2.1 Bind简介

BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现,包括域名服务器 (named)、DNS解析库函数、DNS服务器运行调试所用的工具,是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护。

Bind为老牌DNS软件,功能全面、稳定可靠、文档丰富、应用场景广泛等特点。作为目前世界上使用最为广泛的DNS服务器软件,支持各种unix平台和windows平台,值得信赖。

4.2.2 Bind 安装

直接使用软件安装包工具安装,如RHEL/CentOS 使用yum

# yum -y install bind bind-utils

4.2.3 Bind 核心配置

编辑/etc/named.conf文件,内容如下:

options {
  listen-on port 53 { any; };
  listen-on-v6 port 53 { none; };
  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";
  recursing-file "/var/named/data/named.recursing";
  secroots-file   "/var/named/data/named.secroots";
  allow-query     { any; };

  forward only;
  forwarders { 8.8.8.8; 8.8.4.4; };                     #上游转发公共DNS地址,按实际修改 

  recursion yes;

version "not currently available";                   #隐藏版本号
  auth-nxdomain no;
  dnssec-enable no;
  dnssec-validation no;

  /* Path to ISC DLV key */
  bindkeys-file "/etc/named.root.key";

  managed-keys-directory "/var/named/dynamic";

  pid-file "/run/named/named.pid";
  session-keyfile "/run/named/session.key";
};

zone "demo.com.cn." {
  type forward;
  forwarders { xx.xx.xx.xx; }; #内部域名demo.com.cn DNS服务器
};

zone "0.0.10.in-addr.arpa" {
  type forward;
  forwarders { xx.xx.xx.xx; }; #内部域名demo.com.cn DNS服务器
};
zone "0.250.100.in-addr.arpa" {
  type forward;
  forwarders { xx.xx.xx.xx; };
};
statistics-channels {
inet 127.0.0.1 port 8053 allow { 127.0.0.1; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

国外公共DNS(如:Google Public DNS)建议开启DNSSec

使用named-check命令检测语法

# named-checkconf

4.2.4 Bind日志配置

创建 /etc/named/logging.conf 配置文件,定义日志输出格式。

# tee -a /etc/named/logging.conf<<EOF
logging {
  channel "misc" {
      file "/var/log/named/misc.log" versions 4 size 20m;
      print-time yes;
      print-severity yes;
      print-category yes;
      severity info;
  };

  channel queries_log {
      file "/var/log/named/query.log" versions 50 size 20m;
      print-time yes;
      print-severity no;
      print-category no;
      severity info;
  };

  channel query-errors_log {
      file "/var/log/named/query-errors.log" versions 5 size 20m;
      print-time yes;
      print-severity yes;
      print-category yes;
      severity dynamic;
  };

  category default { "misc"; };
  category queries { queries_log; };
  category query-errors {query-errors_log; };
};
EOF

在主配置文件中引用该文件,前往 /etc/named.conf文件追加如下内容:

include "/etc/named/logging.conf ";

创建目录

# mkdir -p /var/log/named/

赋予权限

# chown named.named /var/log/named/

确认当前查询日志状态

rndc status | grep "query logging"

若状态为 OFF,使用rndc querylog 开启。

启动bind服务并加到开机自启动

systemctl start named
systemctl enable named

4.2.5系统DNS转发配置

将操作系统DNS请求转发转到Bind服务器上。

cat >/etc/resolv.conf<<EOF
# IT IS NOT RECOMMENDED TO CHANGE THE CONTENTS OF THIS FILE.
# 127.0.0.1 is the bind9 server.
# run "cat /etc/named/named.conf" to see details about the actual nameservers.

nameserver 127.0.0.1
options timeout:2 attempts:3 rotate single-request-reopen
EOF

4.2.6 bind_exporter部署配置

前往https://github.com/prometheus-community/bind_exporter/releases/latest下载bind_exporter,存放至/usr/local/bin目录下

# ls -l /usr/local/bin/bind_exporter 
-rwxr-xr-x 1 3434 3434 14598143 Jan 10  2020 /usr/local/bin/bind_exporter

创建/usr/lib/systemd/system/bind_exporter.service配置文件,并使用systemd来管理该服务

# cat >/usr/lib/systemd/system/bind_exporter.service<<EOF
[Unit]
Description=bind_exporter
After=network.target

[Service]
Type=simple
#User=prometheus
ExecStart=/usr/local/bin/bind_exporter -bind.pid-file /var/run/named/named.pid -bind.stats-groups "server,view,tasks"
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

启动服务并配置成开机自启动

systemctl daemon-reload
systemctl restart bind_exporter
systemctl enable bind_exporter

Grafana 仪表板ID: 10024

4.2.7系统防火墙配置

停用firewalld ,并改用iptables。

# systemctl stop firewalld
# systemctl disable firewalld
# yum -y install iptables-services iptables-utils

编辑/etc/sysconfig/iptables, 内容如下:

# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m comment --comment "Premit-OpenSSH" -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -m comment --comment "Premit-DNS" -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -m comment --comment "Premit-DNS" -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9119 -m comment --comment "Premit-node_exporter" -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9100 -m comment --comment "Premit-bind_exporter" -j ACCEPT
-A INPUT -s 网关 -p tcp -m state --state NEW -m tcp --dport 179 -m comment --comment "Premit-BGP" -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

启动防火墙

# systemctl start iptables

允许开机自启动

# systemctl enable iptables

其它

分公司若发生停电或者服务机不可用时,DNS服务将会影响整个分公司上网,为解决该风险,可以使用路由来规避问题,具体方案留给读者思考吧。