跨region的智能DNS解決方案-01
項目背景:考慮到高可靠等諸多問題,在公有云或私有云上可能有兩地三中心等多種架構模式。
需求在不同地區的實例節點如何通過相同域名解析到本地的A記錄或者雲產品的CNAME,並實現高可靠。
本文通過named服務實現上述功能,此外由於容器以及kubernetes的流行CoreDNS也是很好的選型在此不做贅述。
[TOC]
設計原則
在張家口地區的ECS優先讀本地緩存(利用Dnsmasq)然後讀張家口的dns最後讀杭州的dns,同理在杭州的ECS相反,並且非張家口和杭州的如果需要讀取到自建DNS服務的話。可以提供給張家口或者杭州的DNS 使得他們可以解析到default的view以提供訪問。
所以後續在添加A記錄的邏輯上是如果在張家口region添加一條A記錄則對應只在張家口的dns的default的region上添加一條一樣的A記錄,同理,在杭州則相反。這樣的話2邊的default的區域是不同的A記錄,更有利於其他第三方的客戶端來解析域名。
實驗環境
- 創建私網VPC
從最初設計開始在阿里雲控制檯選擇:
專有網絡 -》 創建專有網絡 -》推薦網段選擇 "10.0.0.0/8"
規劃如下:
張家口可用區A 10.1.0.0/16
張家口可用區B 10.2.0.0/16
杭州可用區H 10.3.0.0/16
杭州可用區F 10.4.0.0/16
- 添加路由條目並創建高速通道
添加路由條目 10.3.0.0/16 10.4.0.0/16 爲目標網段
專有網絡 -》路由表 -》添加路由條目 -》下一跳類型 -》路由器接口(專有網絡接方向)-》專有網絡 -》創建VPC互聯
選擇本端地域(杭州),對端地域(張家口)選擇帶寬值,點擊購買
- DNS服務器規劃
DNS服務器地址:
10.1.0.100
10.2.0.100
10.3.0.100
10.4.0.100
通過IP(網段)來判斷區域來最終實現解析到對應的記錄值。
安裝
本文通過編譯安裝,主要原因如下:
- CentOS7的repo裏面的bind服務版本較低,有個別安全隱患。
- 後續需要通過bind_exporter進行監控的話需要libxml2。
- 目錄結構優化
#!/usr/bin/env bash
yum install libxml2-devel python-ply -y
wget -c ftp://ftp.isc.org/isc/bind9/9.11.9/bind-9.11.9.tar.gz -O bind.tar.gz; tar xf bind.tar.gz
cd bind-9.11.9
./configure --prefix=/opt/soft/named --sbindir=/opt/soft/named/sbin/ --bindir=/opt/soft/named/bin/ CFLAGS="-g -fPIC" --enable-threads --with-openssl=yes --with-libjson=no --with-libxml2=yes
make && make install
# 文件目錄自定義
## 配置文件目錄包括區域配置文件,訪問控制文件,加密通訊文件
mkdir -p /etc/named/{acls,conf,data,keys,managed_keys,logs}
## 數據目錄
mkdir -p /var/named/{acls,data}
## 基礎配置文件目錄
mkdir -p /opt/soft/named/conf
## 啓動命令
/usr/sbin/named -c /etc/named/named.conf -u named
## 請大家自行修改文件以適應現在的目錄結構,本實驗爲了方便把所有文件都放在/etc/named/
/usr/lib/systemd/system/named.service
groupadd named -g 1000
useradd named -g named -u 1000
chown named.named /etc/named -R
chown named.named /var/named -R
chown named.named /opt/soft/named -R
編輯所有配置文件
編輯主配置文件 vim /etc/named/named.conf
// For dns.sre.so
// 整個受控ip地址段
include "/var/named/acls/acl_sre_idc.conf";
// all keyssre
include "/etc/named/keys/transfer.key";
include "/opt/soft/named/etc/rndc.key";
controls {
inet 10.1.0.100 port 953
allow { 10.0.0.0/8; } keys { "rndc-key"; };
};
// 參數配置文件
include "/opt/soft/named/conf/options.conf";
// 引用所有的acl文件
include "/etc/named/conf/all_acls.conf";
// 日誌配置文件
include "/opt/soft/named/etc/dns_logs.conf";
view "view_hangzhou-cloud"{
match-clients {
key key_sreso_hangzhou-cloud;
acl_hangzhou-cloud;
};
include "/etc/named/conf/hangzhou-cloud.conf";
};
view "view_zhangjiakou-cloud"{
match-clients {
key key_sreso_zhangjiakou-cloud;
acl_zhangjiakou-cloud;
};
include "/etc/named/conf/zhangjiakou-cloud.conf";
};
view "view_default"{
match-clients {
key key_sreso_default;
acl_default;
any;
};
include "/etc/named/conf/default.conf";
};
編輯named服務參數文件
cat >> /opt/soft/named/conf/options.conf << EOF
options {
directory "/etc/named";
minimal-responses yes;
allow-recursion { idcnet; };
allow-query { idcnet; };
allow-transfer { 10.0.0.0/8;};
dnssec-enable yes;
dnssec-validation yes;
empty-zones-enable no;
notify yes;
managed-keys-directory "/etc/named/managed_keys";
};
EOF
區域控制文件-張家口
cat >> /etc/named/acls/acl_zhangjiakou-cloud << EOF
acl acl_zhangjiakou-cloud {
10.1.0.0/16;
10.2.0.0/16;
!10.3.0.0/16;
!10.4.0.0/16;
!10.1.0.100/32;
!10.2.0.100/32;
!10.3.0.100/32;
!10.4.0.100/32;
};
EOF
區域控制文件-杭州
cat >> /etc/named/acls/acl_hangzhou-cloud << EOF
acl acl_hangzhou-cloud {
10.3.0.0/16;
10.4.0.0/16;
!10.1.0.0/16;
!10.2.0.0/16;
!10.1.0.100/32;
!10.2.0.100/32;
!10.3.0.100/32;
!10.4.0.100/32;
};
EOF
默認區域控制文件-default,該區域給其他第三方節點如果有請求需要的話,默認連到該DNS-view上面。通過控制第三方的dns下游服務器來選擇是解析給張家口還是杭州。
cat >> /etc/named/acls/acl_default << EOF
acl acl_default {
!10.1.0.100/32;
!10.2.0.100/32;
!10.3.0.100/32;
!10.4.0.100/32;
};
EOF
引用所有ACL配置文件
cat >> /etc/named/conf/all_acls.conf << EOF
include "/etc/named/acls/acl_hangzhou-cloud";
include "/etc/named/acls/acl_zhangjiakou-cloud";
include "/etc/named/acls/acl_default";
EOF
編輯各區域配置文件
- 張家口區域
cat >> /etc/named/conf/zhangjiakou-cloud.conf << EOF
zone "." in {
type hint;
file "/etc/named/data/named.root";
};
zone "sre.so." in {
type master ;
allow-update { key key_sreso_zhangjiakou-cloud; };
file "/var/named/data/zone_sreso_zhangjiakou-cloud";
};
EOF
- 第三方區域
cat >> /etc/named/conf/default.conf << EOF
zone "." in {
type hint;
file "/etc/named/data/named.root";
};
zone "sre.so." in {
type master ;
allow-update { key key_sreso_default; };
file "/var/named/data/zone_sreso_default";
};
EOF
- 杭州區域
cat >> /etc/named/conf/hangzhou-cloud.conf <<EOF
zone "." in {
type hint;
file "/etc/named/data/named.root";
};
zone "sre.so." in {
type master ;
allow-update { key key_sreso_hangzhou-cloud; };
file "/var/named/data/zone_sreso_hangzhou-cloud";
};
EOF
- 配置基礎數據 基礎域名sre.so
cat >> /var/named/data/zone_sre.so << EOF
sre.so. 600 IN SOA sre.so. root.sre.so. 2019012805 28800 14400 3600000 86400
sre.so. 600 IN NS ns1.sre.so.
ns1.sre.so. 600 IN A 10.1.0.100
EOF
cat >> /var/named/data/zone_sre.so_default << EOF
\$INCLUDE /var/named/data/zone_sre.so
EOF
cat >> /var/named/data/zone_sre.so_zhangjiekou-cloud << EOF
\$INCLUDE /var/named/data/zone_sre.so
EOF
cat >> /var/named/data/zone_sre.so_hangzhou-cloud << EOF
\$INCLUDE /var/named/data/zone_sre.so
EOF
定義允許通過named解析的ip範圍
cat >> /var/named/acls/acl_sre_idc.conf << EOF
acl idcnet {
127.0.0.1/32;
10.0.0.0/8;
100.64.0.0/10;
};
EOF
關於named.root
配置根服務器地址以及自定義區域數據文件
named.root爲namd服務定義了一個根域,它是一個非常重要的文件,包含了Internet根服務器的名字和IP地址。當Bind接到客戶端的查詢請求時,如果本地不能解析,也不能在Cache中找到相應的數據,就會通過根服務器進行逐級查詢。由於Internet根服務器的地址經常會發生變化,因此named.root也應該要隨之更新。
根服務器列表可以從named.root下載,文件名也是named.root,它包含了國際互聯網絡信息中心(InterNIC)提供的數據。
wget ftp://ftp.rs.internic.net/domain/named.root -O /etc/named/data/named.root
配置加密文件
mkdir -p /etc/named/keys/keys
cd /etc/named/keys/keys
/opt/soft/named/sbin/dnssec-keygen -a hmac-md5 -b 512 -n HOST sreso_hangzhou-cloud
/opt/soft/named/sbin/dnssec-keygen -a hmac-md5 -b 512 -n HOST sreso_zhangjiakou-cloud
/opt/soft/named/sbin/dnssec-keygen -a hmac-md5 -b 512 -n HOST sreso_default
-rw------- 1 root root 122 Sep 9 12:01 Ksreso_default.+157+30426.key
-rw------- 1 root root 229 Sep 9 12:01 Ksreso_default.+157+30426.private
-rw------- 1 root root 129 Sep 9 12:01 Ksreso_hangzhou-cloud.+157+62698.key
-rw------- 1 root root 229 Sep 9 12:01 Ksreso_hangzhou-cloud.+157+62698.private
-rw------- 1 root root 132 Sep 9 12:01 Ksreso_zhangjiakou-cloud.+157+33044.key
-rw------- 1 root root 229 Sep 9 12:01 Ksreso_zhangjiakou-cloud.+157+33044.private
編輯key配置文件 transfer.key
將生成的 .key文件裏的加密串 添加到transfer.key的secret字段內。
cat *.key|awk '{print $1,$7$8}'
sreso_default. pmQxnGDDZofmZvL99m98XW15XEmo4BXpMxmJ+ofHwR+4tZYTSCki9lSBtocG4WAxSMHdA4+sZQJ9OJK2gZl4lw==
sreso_hangzhou-cloud. bhfhzRSQ7/zm7QfEUCWL/Dz0seOikzO9hEPfkAFExvof3y3NrHgYp3tA9aSBHeubo/6DmrN7JYbCviJLaKzGQQ==
sreso_zhangjiakou-cloud. Hptbq3F+4/QJtXhgh781Wdjw/piAiQco+x6gogkKCRPQCTcizhcEwdJqnU+2J2MzMhNYaGszx1sYxA5WI55/8w==
cat >> /etc/named/keys/transfer.key << EOF
key "key_sreso_zhangjiakou-cloud" {
algorithm hmac-md5;
secret "Hptbq3F+4/QJtXhgh781Wdjw/piAiQco+x6gogkKCRPQCTcizhcEwdJqnU+2J2MzMhNYaGszx1sYxA5WI55/8w==";
};
key "key_sreso_hangzhou-cloud" {
algorithm hmac-md5;
secret "bhfhzRSQ7/zm7QfEUCWL/Dz0seOikzO9hEPfkAFExvof3y3NrHgYp3tA9aSBHeubo/6DmrN7JYbCviJLaKzGQQ==";
};
key "key_sreso_default" {
algorithm hmac-md5;
secret "pmQxnGDDZofmZvL99m98XW15XEmo4BXpMxmJ+ofHwR+4tZYTSCki9lSBtocG4WAxSMHdA4+sZQJ9OJK2gZl4lw==";
};
EOF
編輯rndc配置文件
rndc的作用只在服務器本地,並且服務器系統防火牆必須開放953端口。rndc主要用來重新加載named.conf文件,一般更改主配置文件或者正逆向文件後需要重啓named服務,現在可以使用rndc reload命令來重新加載配置文件,而無需再重啓named服務。
/opt/soft/named/sbin/rndc-confgen > /opt/soft/named/etc/rndc.key
#刪除裏面
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
內容
由named.conf裏面如下配置進行控制
controls {
inet 10.1.0.100 port 953
allow { 10.0.0.0/8; } keys { "rndc-key"; };
};
特別注意該文件必須是640且被進程owner只讀
日誌配置文件詳解可參照 (https://kb.isc.org/docs/aa-01526)
#相關的日誌配置文件
cat >> /opt/soft/named/etc/dns_logs.conf << EOF
logging {
channel "named_log" {
file "/etc/named/logs/named.log"
versions 3 size 30M;
print-category yes;
print-time yes;
severity info;
};
channel "client_log" {
file "/etc/named/logs/client.log"
versions 3 size 20M;
print-category yes;
print-time yes;
severity info;
};
channel "update_log" {
file "/etc/named/logs/update.log"
versions 5 size 1G;
print-category yes;
print-time yes;
severity info;
};
category default {named_log;};
category queries {client_log;};
category client {client_log;};
category update {update_log;};
};
EOF
編輯啓動文件
vim /etc/rc.d/init.d/named
#!/bin/sh
#
# Startup script for the DNS naming server
#
# chkconfig: - 49 50
# description: This script starts your DNS naming server
# processname: named
# Source function library.
. /etc/rc.d/init.d/functions
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
named=/opt/soft/named/sbin/named
[ -f $named ] || exit 0
OPTIONS="-c /etc/named/named.conf -u named"
RETVAL=0
# See how we were called.
case "$1" in
start)
if [ $UID -ne 0 ] ; then
echo "User has insufficient privilege."
exit 4
fi
echo -n "Starting named: "
daemon $named $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ]
;;
stop)
if test "x`pgrep named`" != x; then
echo -n "Shutting down named: "
killproc named
fi
RETVAL=$?
echo
[ $RETVAL -eq 0 ]
;;
status)
/opt/soft/named/sbin/rndc -k /opt/soft/named/etc/rndc.key status
RETVAL=$?
;;
reload)
if test "x`pgrep named`" != x; then
echo -n "Reloading named: "
killproc named -HUP
fi
RETVAL=$?
echo
;;
restart)
$0 stop
$0 start
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 2
esac
exit $RETVAL
EOF
Q&A
如何調試named
/opt/soft/named/sbin/named -c /etc/named/named.conf -g -d 3
如何添加自啓動
chkconfig --add named
chkconfig named on
service named start
systemctl status named
驗證
dig ns1.sre.so @10.1.0.100
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> ns1.sre.so @10.1.0.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 44432
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ns1.sre.so. IN A
;; Query time: 0 msec
;; SERVER: 10.1.0.100#53(10.1.0.100)
;; WHEN: Thu Sep 12 15:15:12 CST 2019
;; MSG SIZE rcvd: 39