基於騰訊雲自建高可用DNS方案實踐

語言: CN / TW / HK

導語 |  本文推選自騰訊雲開發者社區-【技思廣益 · 騰訊技術人原創集】專欄。該專欄是騰訊雲開發者社區為騰訊技術人與廣泛開發者打造的分享交流窗口。欄目邀約騰訊技術人分享原創的技術積澱,與廣泛開發者互啟迪共成長。本文作者是騰訊雲開發者社區的作者羅俊。

本文主要介紹如何在騰訊雲平台下自建高可用DNS環境,來滿足企業在雲上的內外網域名解析的需求。這裏主要介紹兩種方案的實現方式,方案一: 基於Centos 系統自帶的Bind軟件構建智能解析方案;方案二:基於CoreDNS與ETCD來構建CoreDNS高可用方案,在闡述兩個方案實現的前,咱們一起回顧下DNS的基礎概念及原理。

DNS基礎概念

(一)DNS概述

DNS是一個層次化的分佈式數據庫,其全稱為域名系統(Domain Name System),它存儲用於互聯網主機名與IP地址相互映射的信息,及其它互聯網所用到的數據。DNS系統是由柏克大學發展的BIND軟件(Berkeley Internet Name Domain)所提供。現目前的BIND的為9.x,現網上大多數都簡稱叫BIND9 ;BIND9 軟件分發包括了一個名字服務器,named,和量和解析庫,liblwres和libbind。如果想了解更多或下載更高的版本,可到此站點去查詢與下載: http://www.isc.org/software/bind

BIND與DNS區別:DNS是一種因特網的通信協議名稱,BIND這是提供這個DNS服務的軟件;在TCP/IP網絡中有非常重要的地位,能夠提供域名與IP地址的解析服務。

(二)DNS工作原理

域名系統DNS是類似於一個樹狀數據結構,樹中的每個節點實質都是負責某個特定區域的一台服務器,通過這些節點,對整個域名空間進行劃分,成為一個層次結構,這種結構類似與UNIX文件系統的層次結構,根的名字“.”來表示,並稱之為根域名(root domain)根域的下一級是頂級域名,頂級域名又分為兩種劃分方法,地理域和通用域,地理域則是為了世界上每個國家或地區等設置的,如中國是cn,日本jp,美國us,台灣tw。等等。通用域則是通過不同的機構類別設置的頂級域名,如org、edu 等等。如下圖:

(三)常見的頂級域名列表

隨着網絡快速增長,後來就出現了,以國家或地區區分的Domain name。

(四)域名服務的解析原理和過程

  • Step-1:用户提出域名請求,並將請求發送給本地域名服務器。

  • Step-2:當本地域名服務器收到請求後,先查詢本地的緩存,如果有該記錄信息,則本地的域名服務器就直接把查詢的結果返回給用户端。

  • Step-3:如果本地的緩存中沒有該記錄,則本地域名服務器就直接把請求發給根域名服務器,然後讓根域名服務器返回給本地域名服務器一個所查詢域(根的子域,如cn)的主域名服務器的地址。

  • Step-4:本地服務器再向上一步驟中所返回的域名服務器發送請求,然後收到該請求的域名服務器查詢其緩存,返回與此請求所對應的記錄或相關的夏季的域名股武器的地址,本地域名服務器將返回的結果保存到緩存。

  • Step-5:重複第4步,直到找到正確的記錄。

  • Step-6:本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時還將結果返回客户端。

DNS解析示例:

  • Step-1:客户端請求解析 www.sina.com.cn 的報文。

  • Step-2:本地的域名服務器收到請求後,查看本地緩存是否有該 www.sina.com.cn 的解析記 錄,若有則反饋給客户端,若沒有,就像上圖一樣,從根域名服務器進行查詢。

  • Step-3: “.”根域名服務器收到請求後,判斷此域名屬於.cn域,查詢到NS記錄及相應的A記錄吿。

  • Step-4:本地DNS服務器收到相關信息後,先緩存起來,再向其.cn的域名之一的DNS服務 器發送請求解析域名 www.sina.com.cn 的報文。

  • Step-5:.cn域名服務器收到請求後,判斷該域名屬於.com.cn域,開始查詢本地的記錄,找到6條NS記錄及相應的A記錄後,將其結果反饋給本地DNS服務器。

  • Step-6:本地DNS服務器收到反饋信息後,先緩存起來,再向其.com.cn域名服務器進行查 詢,請求解析域名 www.sina.com.cn 的報文。

  • Step-7:.com.cn域名服務器收到請求後,判斷該域屬於.sina.com.cn域,開始查詢本地的記錄找到NS記錄及對應的A記錄,然後將查詢的結果返回給本地DNS服務器。

  • Step-8:本地DNS服務器收到請求後,先緩存以上查詢結果,再次向.sina.com.cn域名服務器進行查詢,請求解析域名 www.sina.com.cn 的報文。

  • Step-9:域名服務器ns1.sina.com.cn收到請求後,開始查詢本地緩存,同時其解析的結果反饋給本地DNS服務器。

  • Step-10:本地DNS服務器收到 www.sina.com.cn 的解析後,先本地緩存一份,同時將其結果返回給客户機,這樣就完成一次域名解析過程。

(五)DNS服務的相關記錄説明

  • NS:域名服務器記錄成為NS記錄。

  • A :地址記錄用於設置主機名對應ip地址關係。

  • CNAME:別名記錄。

  • MX記錄:設置當前域中提供郵件服務器名稱。

DNS高可用智能解析方案

本DNS高可用方案基於基於CVM雲服務器,在VPC內網的進行DNS服務器的構建,可實現內網域名解析的需求。同時本方案設計結合了騰訊雲CLB產品提供了負載均衡能力,也可通過多個CLB實現對接多台RS接節點,分擔前端解析壓力,同時支持多可用區部署。

(一)方案特點

  • 同地域,多可用區 進行DNS高可用構建。

  • 全部部署在內網環境,無 公網IP 暴露。

  • 內網、外網域名請求分離,減小故障影響。

  • 內網LB對接多台RS節點,承載前端解析訪問請求。

(二)方案實現功能

  • 支持騰訊雲平台內網保留域名解析 如:*.tencentyun.com。

  • 支持用户定義自己業務域名內網解析 如: www.rocky.com。

  • 支持訪問外網域名解析 如:www.baidu.com。

  • 支持分域名轉發到不同的DNS服務器。

(三)解析流程路徑

1)客户端訪問企業內部域名

  • Client => CLB => 自建DNS1 /自建DNS2

2)客户端訪問騰訊雲內網域名

  • Client => CLB => 自建DNS1 =>轉發至183 DNS => UnbondDNS

3)客户端訪問外網域名

  • Client => CLB=>自建DNS1 =>轉發至183 DNS => Private DNS =>公網遞歸DNS

注意

  • 若客户在騰訊雲的UIN賬號是非帶寬上移用户(傳統用户),則CLB不支持跨可用區掛在RS節點。

  • 按照相關規定,沒有相關資質是不允許開啟53端口的。若內部使用,需限制訪問來源。

詳情參考騰訊雲官網文檔《關於安全組53端口配置的公吿》

http://cloud.tencent.com/document/product/213/35533

DNS高可用智能解析方案實現

本次方案採用了兩台節點進行此方案的實踐。若在雲上的生成環境需結合客户業務的詳細需求進行節點數量,CLB數量,不同的地域調整即可。

(一)設置主機名

[[email protected] ~] hostnamectl set-hostname node4.rocky.com
[[email protected] ~] hostnamectl set-hostname node5.rocky.com

(二)配置/etc/hosts

[[email protected] ~]# cat /etc/hosts
127.0.0.1 VM-6-15-centos VM-6-15-centos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
10.0.6.15 node4 node4.rocky.com
10.0.6.16 node5 node5.rocky.com

(三)安裝DNS軟件

[[email protected] ~]# yum -y install bind
[[email protected] ~]# yum -y install bind

(四)DNS主配置文件

[[email protected] ~]# cat /etc/named.conf
//
// named.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" { # 設置acl
localhost;
10.0.0.0/16;
};
options {
listen-on port 53 { any; }; #設置監聽端口,也可寫具體的網段
listen-on-v6 port 53 { any; };
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; }; #開放查詢
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 part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable no;
dnssec-validation no; # 關閉dnssec安全驗證
/* 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";
forwarders {
183.60.83.19; # 騰訊雲VPCGW DNS地址
183.60.82.98; # 騰訊雲VPCGW DNS地址
};
};
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 "rocky.com" { # 域名
type master; #主DNS
file "dynamic/rocky.com.zone"; # zone file path #正向區域文件
notify yes;
};
zone "6.0.10.in-addr.arpa" in {
type master;
file "dynamic/6.0.10.in-addr.arpa.zone"; #反向區域文件
notify yes;
};

(五)DNS區域文件配置

  • 正向區域配置文件

  • 反向區域配置文件

  • 區域配置文件參數説明

  • 啟動DNS服務

分別在node4和node5進行服務啟動及檢查服務狀態是否正常。

  • DNS服務解析驗證

#客户端訪問企業內部域名
[[email protected] ~]# nslookup www.rocky.com
Server: 10.0.6.15
Address: 10.0.6.15#53
Name: www.rocky.com
Address: 10.0.6.100


[[email protected] ~]# nslookup 10.0.6.100
100.6.0.10.in-addr.arpa name = www.rocky.com.


#客户端訪問外網域名
[[email protected] ~]# nslookup www.baidu.com
Server: 10.0.6.15
Address: 10.0.6.15#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.68.3
Name: www.a.shifen.com
Address: 110.242.68.4
#客户端訪問騰訊雲內網服務域名
[[email protected] ~]# nslookup mirrors.tencent.com
Server: 10.0.6.15
Address: 10.0.6.15#53
Non-authoritative answer:
mirrors.tencent.com canonical name = mirrors.cloud.tencent.com.
mirrors.cloud.tencent.com canonical name = mirrors.cloud.tencent.com.cdn.dnsv1.com.
mirrors.cloud.tencent.com.cdn.dnsv1.com canonical name = 14io0gsu.sched.dma.tdnsv5.com.
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.235
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.180
[[email protected] ~]#

服務驗證通過,符合預期,node5分別也進行相關解析驗證。

(七)LB配置

  • 新建內網LB

新建內網LB,配置監聽端口為UDP:53,加權輪詢。

  • 配置LB

選擇板綁定的RS節點,確認即可

(八)客户端驗證

[[email protected] ~]# cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
#nameserver 183.60.83.19
#nameserver 183.60.82.98
nameserver 10.0.2.2 #內網LB地址
#解析業務域名
[[email protected] ~]# nslookup www.rocky.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Name: www.rocky.com
Address: 10.0.6.100
#解析騰訊內網域名
[[email protected] ~]# nslookup mirrors.tencent.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Non-authoritative answer:
mirrors.tencent.com canonical name = mirrors.cloud.tencent.com.
mirrors.cloud.tencent.com canonical name = mirrors.cloud.tencent.com.cdn.dnsv1.com.
mirrors.cloud.tencent.com.cdn.dnsv1.com canonical name = 14io0gsu.sched.dma.tdnsv5.com.
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.180
Name: 14io0gsu.sched.dma.tdnsv5.com
Address: 113.240.69.235
[[email protected] ~]# nslookup myqcloud.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Non-authoritative answer:
Name: myqcloud.com
Address: 0.0.0.1
#解析外網域名
[[email protected] ~]# nslookup www.jd.com
Server: 10.0.2.2
Address: 10.0.2.2#53
Non-authoritative answer:
www.jd.com canonical name = www.jd.com.gslb.qianxun.com.
www.jd.com.gslb.qianxun.com canonical name = jd-abroad.cdn20.com.
Name: jd-abroad.cdn20.com
Address: 121.57.82.89
Name: jd-abroad.cdn20.com
Address: 36.111.141.54
Name: jd-abroad.cdn20.com
Address: 121.57.82.88
Name: jd-abroad.cdn20.com
Address: 121.57.82.17
Name: jd-abroad.cdn20.com
Address: 42.81.145.189
Name: jd-abroad.cdn20.com
Address: 113.24.194.72
Name: jd-abroad.cdn20.com
Address: 240e:918:1a00:201::33
Name: jd-abroad.cdn20.com
Address: 240e:928:101::1e
Name: jd-abroad.cdn20.com
Address: 240e:918:1a00:201::15
Name: jd-abroad.cdn20.com
Address: 240e:925:2:101::6

驗證通過, 符合預期。

(九)DNS高可用智能解析方案總結

本方案採用Linux系統自帶的DNS軟件進行DNS高可用環境的構建,結合了內網CLB使其解析調度RS更加靈活。同時實現了客户端對企業內網域名,騰訊雲內外網域名的解析需求。另外這裏務必注意RS在內網進行構建,安全組限制53端口的來源IP。

CoreDNS高可用方案

本篇主要介紹通過自建CoreDNS集羣來提供DNS內外域名解析,及騰訊內網DNS功能,這裏採用CoreDNS+ETCD集羣方式來實現。方案特點:

  • 多台自建的CoreDNS節點,規避了單台無法使用的情況,提升可用性。

  • 多可用區部署,具備高可用性,避免單可用區故障現象(雖説概率較小)

  • 全部部署在內網環境,無公網IP暴露。

  • 內網、外網域名請求分離,減少故障爆炸半徑。

(一)CoreDNS

CoreDNS基於用Go編寫的是一個DNS服務器,鏈接插件,每個插件執行一個(DNS)功能。相對於其他DNS如:BIND、Knot、PowerDNS和Unbound不同之處,在於它非常靈活,幾乎所有功能都外包到插件中 ,插件也可以是獨立的,也能協同工作。可以利用插件對你的DNS數據做你想做的事情。如果有些功能不是現成的,你可以通過編寫插件來添加,和Caddy Server具有相同的模型:鏈接插件。

  • CoreDNS特點

插件化(Plugins):基於Caddy服務器框架,CoreDNS實現了一個插件鏈的架構,將大量應用端的邏輯抽象成插件形式暴露給使用者。CoreDNS以預配置的方式將不同的插件串成一條鏈,按序執行插件鏈上的邏輯。

配置簡單:引入表達力更強的DSL,即Corefile形式的配置文件。

  • CoreDNS架構

  • CoreDNS解析方式

注意這裏有兩個不同的端口:5300和53。在內部,每個端口都會生成一個dnsserver.Server。即使有四個服務器塊,我們也只能得到兩個實際的服務器。CoreDNS會將所有與同一端口相關的服務器塊收集起來,並將它們合併到相同的dnsserver.Server中。服務器將在端口上多重查詢,根據區域將它們傳遞到不同的插件鏈。它為區域選擇最特定的匹配服務器塊。如果沒有匹配的服務器塊,則返回SERVFAIL。

coredns.io:5300 {
file /etc/coredns/zones/coredns.io.db
}
example.io:53 {
errors
log
file /etc/coredns/zones/example.io.db
}
example.net:53 {
file /etc/coredns/zones/example.net.db
}
.:53 {
errors
log
health
rewrite name foo.example.com foo.default.svc.cluster.local
}

(二)ETCD

ETCD是一種高度一致的分佈式鍵值存儲,它提供了一種可靠的方式來存儲需要由分佈式系統或機器集羣訪問的數據。它在網絡分區期間優雅地處理領導選舉,並能夠容忍機器故障。

  • 簡單:安裝配置簡單,支持HTTP API進行交互。

  • 安全:支持 SSL證書 驗證。

  • 快速:根據官方提供的benchmark數據,單實例支持每秒2k+讀操作。

  • 可靠:採用raft算法,實現分佈式系統數據的可用性和一致性。

從上面架構圖中我們可以看到,ETCD主要分為四個部分。

HTTP Server:用於處理用户發送的API請求以及其它etcd節點的同步與心跳信息請求。

Store:用於處理etcd支持的各類功能的事務,包括數據索引、節點狀態變更、監控與反饋、事件處理與執行等等,是etcd對用户提供的大多數API功能的具體實現。

Raft:Raft強一致性算法的具體實現,是etcd的核心。

WAL:Write Ahead Log(預寫式日誌)是etcd的數據存儲方式。除了在內存中存有所有數據的狀態以及節點的索引外,etcd就通過WAL進行持久化存儲。在WAL中所有的數據提交前都會事先記錄日誌,Snapshot是為了防止數據過多而進行的狀態快照,Entry表示存儲的具體日誌內容。

(三)配置ETCD集羣

這裏採用三台雲服務器作為CoreDNS節點的後端數據庫,ETCD架構邏輯具備選舉master機制,分別為node1~node3。

  • 安裝ETCD及開機啟動

[[email protected]~]# yum -y install etcd
[[email protected] ~]# systemctl enable etcd; systemctl start etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
  • node1 etcd配置

[[email protected] etcd]# egrep ^[A-Z] etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/node1.etcd"
ETCD_LISTEN_PEER_URLS="http://10.0.2.4:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.2.4:2379,http://127.0.0.1:2379"
ETCD_NAME="node1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.2.4:2380"
ETCD_ADVERTISE_CLIENT_URLS="node1=http://10.0.2.4:2379"
ETCD_INITIAL_CLUSTER="node1=http://10.0.2.4:2379,node2=http://10.0.2.8:2379,node3=http://10.0.2.15:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
  • node2 etcd配置

[[email protected] ~]# egrep ^[A-Z] /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/node2.etcd"
ETCD_LISTEN_PEER_URLS="http://10.0.2.8:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.2.8:2379,http://127.0.0.1:2379"
ETCD_NAME="node2"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.2.8:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.2.8:2379"
ETCD_INITIAL_CLUSTER="node1=http://10.0.2.4:2380,node2=http://10.0.2.8:2380,node3=http://10.0.2.15:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[[email protected] ~]#
  • node3 etcd配置

[[email protected] ~]# egrep ^[A-Z] /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/node3.etcd"
ETCD_LISTEN_PEER_URLS="http://10.0.2.15:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.2.15:2379,http://127.0.0.1:2379"
ETCD_NAME="node3"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.2.15:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.2.15:2379"
ETCD_INITIAL_CLUSTER="node1=http://10.0.2.4:2380,node2=http://10.0.2.8:2380,node3=http://10.0.2.15:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

啟動與驗證etcd服務

[[email protected] ~]# systemctl start etcd.service
[[email protected] ~]# systemctl status etcd.service
etcd.service - Etcd Server
Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-02-15 13:50:16 CST; 10h ago
Main PID: 10451 (etcd)
CGroup: /system.slice/etcd.service
└─10451 /usr/bin/etcd --name=node1 --data-dir=/var/lib/etcd/node1.etcd --listen-client-urls=http://10.0.2.4:2379,http://127.0.0.1:2379
  • etcd集羣健康

[[email protected] ~]# etcdctl member list
5432b0f7395992d2: name=node1 peerURLs=http://10.0.2.4:2380 clientURLs=http://10.0.2.4:2379 isLeader=true
589358f881fe72a1: name=node2 peerURLs=http://10.0.2.8:2380 clientURLs=http://10.0.2.8:2379 isLeader=false
bb72602d9eb35069: name=node3 peerURLs=http://10.0.2.15:2380 clientURLs=http://10.0.2.15:2379 isLeader=false


[[email protected] ~]# etcdctl cluster-health
member 5432b0f7395992d2 is healthy: got healthy result from http://10.0.2.4:2379
member 589358f881fe72a1 is healthy: got healthy result from http://10.0.2.8:2379
member bb72602d9eb35069 is healthy: got healthy result from http://10.0.2.15:2379
cluster is healthy

(四)多節點CoreDNS部署

  • 安裝c oredns 

這裏面可結合客户業務需要進行CoreDNS服務器的環境構建,這裏採用的coredns1.6.4 版本,官網最新1.9.x

[[email protected] ~]# tar zxvf coredns_1.6.4_linux_amd64.tgz
[[email protected] ~]# mv coredns /usr/bin/
[[email protected] ~]# mkdir /etc/coredns
  • coredns核心配置文件

[[email protected] ~]# cat /etc/coredns/Corefile
. { # 監聽tcp和udp的53端口
etcd node1.rocky.com node2.rocky.com node3.rocky.com 10.in-addr.arpa { # 配置啟用etcd插件,後面可以指定域名
stubzones # 啟用存根區域功能
path /skydns # etcd裏面的路徑 默認為/skydns,以後所有的dns記錄就是存儲在該存根路徑底下
endpoint http://10.0.2.4:2379 http://10.0.2.8:2379 http://10.0.2.15:2379 # etcd訪問地址,多個空格分開
upstream 183.60.83.19:53 183.60.82.98:53 # 設置要使用的上游解析程序解決指向外部域名的在etcd(認為CNAME)中找到的外部域名。
}
cache 600 # 緩存600秒
loadbalance # 負載均衡,開啟DNS記錄輪詢策略
forward . 183.60.82.98:53 183.60.83.19:53 # 上面etcd未查詢到的請求轉發給設置的DNS服務器解析
}


myqcloud.com {
cache 600 myqcloud.com
loadbalance
forward . 119.29.29.29:53
}


tencent-cloud.com {
hosts {
10.210.104.113 cls-i0fxloot.ccs.tencent-cloud.com
10.210.49.4 cls-88b89rhb.ccs.tencent-cloud.com
10.210.104.35 cls-o4rn1235.ccs.tencent-cloud.com
fallthrough
}
}
  • 配置systemd管理coredns服務

[[email protected] ~]# cat /usr/lib/systemd/system/coredns.service
[Unit]
Description=CoreDNS DNS server
Documentation=http://coredns.io
After=network.target


[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=~
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure


[Install]
WantedBy=multi-user.target
[[email protected] ~]#
  • 啟動coredns

[[email protected] ~]# systemctl status coredns
coredns.service - CoreDNS DNS server
Loaded: loaded (/usr/lib/systemd/system/coredns.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2022-02-15 16:13:43 CST; 4s ago
Docs: http://coredns.io
Main PID: 30288 (coredns)
CGroup: /system.slice/coredns.service
└─30288 /usr/bin/coredns -conf=/etc/coredns/Corefile


Feb 15 16:13:43 node1.rocky.com systemd[1]: Started CoreDNS DNS server.
Feb 15 16:13:43 node1.rocky.com coredns[30288]: .:53
Feb 15 16:13:43 node1.rocky.com coredns[30288]: myqcloud.com.:53
Feb 15 16:13:43 node1.rocky.com coredns[30288]: tencent-cloud.com.:53
Feb 15 16:13:43 node1.rocky.com coredns[30288]: ______ ____ _ _______
Feb 15 16:13:43 node1.rocky.com coredns[30288]: / ____/___ ________ / __ \/ | / / ___/ ~ CoreDNS-1.6.4
Feb 15 16:13:43 node1.rocky.com coredns[30288]: / / / __ \/ ___/ _ \/ / / / |/ /\__ \ ~ linux/amd64, ...dirty
Feb 15 16:13:43 node1.rocky.com coredns[30288]: / /___/ /_/ / / / __/ /_/ / /| /___/ /
Feb 15 16:13:43 node1.rocky.com coredns[30288]: \____/\____/_/ \___/_____/_/ |_//____/
Hint: Some lines were ellipsized, use -l to show in full.
[[email protected] ~]# ^C
[[email protected] ~]# systemctl enable coredns
Created symlink from /etc/systemd/system/multi-user.target.wants/coredns.service to /usr/lib/systemd/system/coredns.service.
  • coredns配置解析記錄

[email protected] ~]# etcdctl put /skydns/com/rocky/node1 '{"host":"10.0.2.4","ttl":10}'
No help topic for 'put'
[[email protected] ~]# export ETCDCTL_API=3
[[email protected] ~]# etcdctl put /skydns/com/rocky/node1 '{"host":"10.0.2.4","ttl":10}'
OK
[[email protected] ~]# vim .bashrc
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]# etcdctl put /skydns/com/rocky/node2 '{"host":"10.0.2.8","ttl":10}'
OK
[[email protected] ~]# etcdctl put /skydns/com/rocky/node3 '{"host":"10.0.2.15","ttl":10}'
OK
[[email protected] ~]# etcdctl put /skydns/com/rocky/node1 '{"host":"www.tam3.com","ttl":10}'
OK
[[email protected] ~]#

由於這裏採用的測試環境, 需要結合具體業務進行相關設置。

(五)coredns驗證

[[email protected] ~]# dig @node1 www.tam3.com


; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> @node1 www.tam3.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1734
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1


;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.tam3.com. IN A


;; ANSWER SECTION:
www.tam3.com. 160 IN CNAME tam3.com.
tam3.com. 160 IN A 3.33.152.147
tam3.com. 160 IN A 15.197.142.173


;; Query time: 622 msec
;; SERVER: 10.0.2.4#53(10.0.2.4)
;; WHEN: Tue Feb 15 16:25:24 CST 2022
;; MSG SIZE rcvd: 123

驗證符合預期。

總結

本篇通過兩種不同的形式在雲上實現自建高可用DNS環境來解決企業在雲上的內外網域名解析的需求。以上兩個方案僅供參考,生產環境採用,需結合業務具體需求進行相關配置的調整。同時這裏優先推薦採用騰訊雲的DNS託管服務,有特殊業務需求可參考以上兩個方案結合託管的DNS服務協同來處理。

附錄

(一)DNS常用工具

  • dig用法

dig域名信息探索者(domain information groper,dig)是查詢工具中最多功能的。常使用的dig的簡單形式如:

  • nslookup用法

nslookup有兩種模式:交互是和非交互式;交互模式允許使用者向名字服務器發出對各種主機和域名信息的查詢請求,或者打印出一個域下面的主機列表.非交互模式只能用於打印所查詢的某個主機或域的名字和請求信息, 如文章上述測試方法。

  • whois工具

  • http://www.internic.net/whois.html

  • http://whois.cloud.tencent.com/

  • 撥測工具

  • 17ce.com

  • mdig.com

(二)其他參考資料

1.http://www.isc.org/bind/

2.http://coredns.io/

3.http://etcd.io/

4.http://coredns.io/plugins/

5.http://coredns.io/2017/06/08/how-queries-are-processed-in-coredns/

6. http://github.com/coredns/depl oyment/blob/master/systemd/coredns.service

7.http://cloud.tencent.com/document/product/1338

8.http://cloud.tencent.com/developer/article/1748028

9.http://cloud.tencent.com/developer/article/1945211

作者簡介

羅俊

騰訊雲開發者社區【技思廣益·騰訊技術人原創集】作者

騰訊雲TAM,騰訊雲大客户技術客户經理,目前負責騰訊雲大客户雲上架構設計,架構優化,穩定性治理、高可用,容災等相關諮詢與支持服務。對雲原生、開源技術有較深入的研究與熱情。 

推薦閲讀

Kubernetes原理與架構初探

10分鐘搞定!Golang分佈式ID集合

C++異步:asio的coroutine實現!

Go組件:context學習筆記!

:point_down: 點擊 「閲讀原文」 註冊成為社 區創作者,認識大咖,打造你的技術影響力!