跨region的智能DNS解決方案-01

跨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記錄,更有利於其他第三方的客戶端來解析域名。

實驗環境

  1. 創建私網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

  1. 添加路由條目並創建高速通道
    添加路由條目 10.3.0.0/16 10.4.0.0/16 爲目標網段

專有網絡 -》路由表 -》添加路由條目 -》下一跳類型 -》路由器接口(專有網絡接方向)-》專有網絡 -》創建VPC互聯
選擇本端地域(杭州),對端地域(張家口)選擇帶寬值,點擊購買

  1. DNS服務器規劃
    DNS服務器地址:

10.1.0.100
10.2.0.100
10.3.0.100
10.4.0.100

通過IP(網段)來判斷區域來最終實現解析到對應的記錄值。

安裝

本文通過編譯安裝,主要原因如下:

  1. CentOS7的repo裏面的bind服務版本較低,有個別安全隱患。
  2. 後續需要通過bind_exporter進行監控的話需要libxml2。
  3. 目錄結構優化
#!/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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章