企业高可用DNS架构部署方案
第1章 背景
域名系统(Domain Name System,DNS)是一种组织成域层次结构的计算机和网络服务命名系统,它主要是用来通过用户亲切而好友的名称替代枯燥而难忘的IP地址以定位相应的计算机和相互服务。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器;域名解析就是将域名映射为IP地址的过程。
鉴于规模比较大的企业架构特点(内部服务依赖内部专线访问)以及企业分规模数量(几十、几百计),为此,需要一个较为合理的DNS系统方案来控制IT投入成本,同时兼备IT服务的稳定运作。
第2章 系统规划
2.1 系统拓扑
从上述的系统拓扑图可以得知,该分公司使用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 |
提示:业务IP也可以大胆些,比如:
53.53.53.53/32
第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/24
、10.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配置
cat ospfd.conf
log syslog
!
interface ens192
ip ospf authentication message-digest
ip ospf dead-interval 3
ip ospf hello-interval 1
ip ospf message-digest-key 1 md5 password
ip ospf network point-to-multipoint
!
interface lo
!
router ospf
ospf router-id 本机互联IP
network 本机互联IP/24 area 0.0.0.53
network 100.250.0.53/32 area 0.0.0.53
network 100.250.0.54/32 area 0.0.0.53
交换机侧配置
interface VlanifXX
<省略若干行>
ospf authentication-mode md5 1 cipher password
ospf network-type p2mp
ospf timer hello 1
ospf timer dead 3
ospf 1 router-id 接口IP
default-route-advertise always
bandwidth-reference 10000
area 0.0.0.53
network 接口IP 0.0.0.255
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服务将会影响整个分公司上网,为解决该风险,可以使用浮动路由来规避该问题,具体方案留给读者思考吧。