­

Linux 域名和DNS

  • 2022 年 8 月 15 日
  • 筆記

名字解析的作用:

TCP/IP網絡中,設備之間的通信依賴IP地址來實現,但是IP地址不好記憶,所以就將每一台設備用一個名字來進行標識,但是這個名字計算機不能解析。所以就需要藉助名字解析服務來實現將名字解析為IP地址。

主機名和域名的聯繫

主機名:

主機名:計算機的名字,用於唯一標識一台設備

域名:

域名:domain name,是由一串用點分隔的名字,表示互聯網上的一台或者一組設備。

完全限定域名:FQDN

FQDN:full qualified domain name,完全限定域名。FQDN=主機名+域名

一個域下面就包含了很多主機。比如baidu.com這個域名下面可能就包含了www.baidu.commail.baidu.com等主機名。
例如:如www.baidu.com. 就是一個完全限定域名(注意最後有一個點,默認結尾點可以省略不寫。最末尾的點所有名稱的最上級的根)。

在查看完全限定域名時,主機名通常位於域名之前。

主機名表示用於將用戶傳送到某個地址或位置的網絡或系統。

域名代表用戶正在訪問的站點或項目。

比如www.baidu.com就告訴我們,baidu.com這個域中,有一台名叫www的機器.

常見的www就是主機名,標識的對應主機,還有blogstudy等都是主機名。
#www
www:World Wide Web,萬維網。由www客戶端和www服務端組成。

	#www客戶端指的是設備上的瀏覽器。

	#www服務端指的是服務器(存放資源的主機)。

	#www經常被簡稱作web,所以www客戶端、www服務端又叫web客戶端、web服務端

	#www的作用就是:web客戶端訪問web服務端

#所以www表示訪問指定web服務器上面的資源,故www表示的是一台主機。

範例

#www.baidu.com
			.    #根域
			|
			|
	    gov  edu   com  net org cn  #頂級域:最初只有七個
			|
			|
		360   baidu  google  sougou #二級域
			|
			|
		       www    #主機

域名的分類

  • 根域

  • 頂級域

  • 二級域

  • ….

  • 最多可達到127級域名

#常見的頂級域名

com(商業公司)、

net(互聯網組織)、

edu(教育)、

org(非營利性組織)、

int(internet)、

mil(軍事)、

gov(政府)、

cn(國家地區域名,cn表示中國)

DNS:Domain Name Server

利用名稱分佈式的特性,在每一級域都搭建對應的DNS服務器,每個DNS服務器只負責一部分名稱和ip的解析。

DNS服務器存放的是它的下級域DNS的名稱和IP。如果一個DNS的下級是主機,就存放主機的名稱和ip

DNS查詢的類型

  • 遞歸查詢

  • 迭代查詢

遞歸查詢:一般客戶機和本地DNS服務器之間屬於遞歸查詢,即當客戶機向DNS服務器發出請求後, 若DNS服務器本身不能解析,則會向另外的DNS服務器發出查詢請求,得到最終的肯定或否定的結
果後轉交給客戶機。此查詢的源和目標保持不變,為了查詢結果只需要發起一次查詢

迭代查詢:一般情況下(有例外)本地的DNS服務器向其它DNS服務器的查詢屬於迭代查詢,如:若對
方不能返回權威的結果,則它會向下一個DNS服務器(參考前一個DNS服務器返回的結果)再次發起
進行查詢,直到返回查詢的結果為止。此查詢的源不變,但查詢的目標不斷變化,為查詢結果一般需要發起多次查詢.

DNS名稱請求的流程

1.客戶端需要解析一個名稱會先查詢hosts文件,如無對應內容就下一步

2.查詢本地的緩存(linux默認沒有設置緩存,windows默認設置了緩存)

3.向指定的DNS服務器發起請求,如果這個DNS服務器沒找到就像根查找,然後進行迭代查詢,找到結果以後由這個DNS返回給客戶端

#權威DNS:存放要訪問的域名和ip的對應關係的服務器就叫做權威DNS服務器

image

緩衝和緩存

緩存:Cache,為了提升性能開闢一塊空間,緩存是將反覆使用的數據存儲起來,在有效期之內供系統去調用。

緩衝:Buffer,緩衝的作用是協調上下層應用之間的性能差異。

#比如A-->B,A的流量大速度快,但是B的流量小速度慢,A-->B的時候B接收不了這麼多的數據,所以中間加一個緩衝區,A把數據放在緩衝區,B再到緩衝區去拿數據。解決了兩這性能不一樣的問題。

範例:

#瀏覽器輸入一個域名回車以後背後所作的工作:

名稱解析為ip地址:DNS工作過程

連接到對應的主機:TCP三次握手

數據傳輸:HTTP工作過程

linux DNS服務的實現

提供DNS服務器軟件:bind,powerdns,dnsmasq,unbound,coredns(主要用在k8s環境中)

bind實現DNS服務

1.安裝bind軟件
yum install bind bind-utils
bind-utils是bind的一個管理工具(客戶端)。
BIND的相關程序包:yum list all bind*
BIND包相關文件: rpm -ql bind

bind的配置文件:/etc/named.conf

可以通過rpm -ql bind來查看他的對應文件。

配置文件的格式

由三部分組成:

  • 選項:配置相關功能

  • 日誌:(基本不用改)

  • 區域:本機能夠為哪些zone進行解析(域下面就有很多區域)


/var目錄:var:variable(變量、可變的)。目錄存放的就是可變的數據

/etc/services文件是記錄網絡服務名和它們對應使用的端口號及協議的對應關係(相當於一個手冊,記錄大部分服務使用的默認端口,不用更改)

/etc/services文件:四個字段組成:服務名稱」、「使用端口」、「協議名稱」以及「別名

查看dns是否生效: /etc/reslve文件
/etc/resolv.conf是DNS客戶機的配置文件,用於設置DNS服務器的IP地址及DNS域名

dns服務基礎配置實現互聯網訪問

只需要正確安裝bind這個軟件包,修改配置文件的一下內容即可。
options {
        listen-on port 53 { localhost; }; #需要監聽的指定地址端口,可以直接注釋掉表示所有iplocalhost表示監聽本地所有地址的53端口
		......
        allow-query     { any; };  #允許誰查詢 any:代表所有的ip,所有的ip都可以查(包括遠程的ip) 注釋掉這一行也表示所有ip都能訪問
		}
		
		
#dns配置文件中的:localhost:表示本機配置的所有ip
#hosts中的localhost表示的是127.0.0.1這個地址
#dns務基礎配置實現互聯網訪問:注釋掉allow-query和listen-on 表示默認允許所有

DNS服務的管理工具 rndc

rndc 監聽端口: 953/tcp

#命令格式:
rndc COMMAND
COMMAND:
 status: 查看狀態
 reload: 重載主配置文件和區域解析庫文件
 reload zonename: 重載區域解析庫文件
 retransfer zonename: 手動啟動區域傳送,而不管序列號是否增加
 notify zonename: 重新對區域傳送發通知
 reconfig: 重載主配置文件
 querylog: 開啟或關閉查詢日誌文件/var/log/message
 trace: 遞增debug一個級別
 trace LEVEL: 指定使用的級別
 notrace:將調試級別設置為 0
 flush:清空DNS服務器的所有緩存記錄

DNS解析服務的測試和診斷工具

由bind-utils這個客戶端提供。於測試dns系統,不會查詢hosts文件進行解析

  • dig

  • host

  • nslookup

例如:查詢dns能否正常解析:www.baidu.com
dig www.baidu.com
host www.baidu.com
nslookup www.baidu.com

#查詢指定的DNs服務器能否正常解析:www.baidu.com
dig www.baidu.com @10.10.0.11 #服務器的ip地址

搭建私有DNS實現正向解析dns服務(正向主服務器)

需要實現正向解析:FQDN–>IP ,就需要配置對應的區域。
域是一個概念,比如baidu就是一個域,在這個域之下還有區域

bind區域的配置方法

  1. 在主配置文件中定義區域

  2. 定義區域解析庫文件(區域數據庫),由一條條資源記錄(RR)組成。

搭建DNS正向主服務器,實現web服務器基於FQDN的訪問

環境配置:
關閉SElinux
關閉防火牆
時間同步

設備:
需要三台主機
DNS服務端:10.0.0.8
web服務器:10.0.0.7
DNS客戶端:10.0.0.6

修改住配置文件,定義需要解析得區域:
zone "redhat.org" IN {  #redhat.org:表示需要管理的域的域名
   type master; #DNS的類型  master slave frawalld
   file  "magedu.org.zone"; #指定定義區域數據庫的文件


#區域數據庫配置
$TTL 1D 	#表示有效時間 1D:表示1D內有效
			@       IN SOA  @ admin.redhat.org. (
			0       ; serial 
			1D      ; refresh
			1H      ; retry
			1W      ; expire
			3H )    ; minimum
			NS      master
master		 A      192.168.26.129  #需要解析的區域
www    		A		192.168.26.130  #需要解析的區域
資源記錄的格式及類型
資源記錄的格式:name [TTL] IN rr_type value
資源記錄的類型:
  • SOA:說明當前這個區域解析庫為哪一個區域所用,由誰負責

  • A:作用是把FQDN解析成為IPV4的IP地址

  • NS:name server 專用於標識當前區域的DNS服務器

  • MX:Mail eXchanger,郵件交換器

  • CNAME: Canonical Name,別名記錄

  • PTR:作用是把IP解析成為FQDN,反向解析

#SOA  name [ttl] in rr_type value 1)name:表示的是當前這個區域解析庫的域名。用@可表示當前區域的名字

(2)TTL:表示緩存過期的時間

(3)IN:代表internet,沒有實際意義,可以當做固定格式

(4)SOA:表示資源記錄的類型為SOA

(5value: 當前這個域的DNS服務器是誰,可以直接寫區域名字,會自動把域名補齊。
#使用value指定當前域的DNS服務器以後,還要使用A這種類型來指定這個DNS服務器的IP地址。
#SOA記錄與其它記錄不同的是就是value部分,SOA的value部分由很多的字段組成


value:由以下三部分組成:
1.負責當前這個域的主(master)DNS服務器是誰。  可以是FQDN,也可以是當前 域 的名字(用@可表示當前 域的名字),這個名字隨便起,但是需要配置A來指定它的ip地址。

2.當前區域管理員的郵箱地址,但是地址不能有@符號,一般用.來代替,例如15069028007.163.com

3.(主從服務器協調屬性的定義以及否定的答案的統一的TTL)
#例如:
10235.com   86400  IN SOA  ns1.abc.com.  root.ns1.abc.com. (
                                2007061402 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                1209600      ; expire (2 weeks)
                                3600         ; minimum (1 hour)
                                )

10235.com:代表當前區域的域名,可以用@代替(因為在配置文件中定義區域的時候就定義了域名)

86400:代表86400秒後緩存過期

ns1.abc.com.:指定當前域的主DNS SERVER  #主DNS:master,這個名字可以隨便起,下面還需要使用A這種類型的資源記錄來指定主DNS的ip地址 d

root.ns1.abc.com.:管理員郵箱(@使用.代替),等同於root@ns1.abc.com.

Serial :數值Serial代表這個Zone的序列號。供Slave DNS判斷是否從Master DNS獲取新數據。每次Zone文件更新,都需要修改Serial數值

refresh:數值Refresh設置Slave DNS多長時間與Master Server進行Serial核對。目前Bind的notify參數可設置每次Master DNS更新都會主動通知Slave DNS更新

retry:數值Retry設置當Slave DNS試圖獲取Master DNS Serial時,如果Master DNS未響應,多長時間重新進行檢查

expire:數值Expire將決定Slave DNS在沒有Master DNS的情況下權威地提供域名解析服務的時間長短

minimum:否定答案的TTL,當服務器沒有解析到域名時,設置客戶端緩存時間

配置文件檢查

  • named-checkconf

  • named-checkzone

#檢查配置文件
named-checkconf  #檢查的是named.conf這個配置文件

named-checkzone xxx.org /var/named/redhat.org.zone # 域名 域名對應的區域數據庫文件

資源記錄的類型詳解

NS記錄定義規則
  • name: 當前域名(通過定義區域規則的時候指定的域名)。用來標識當前的域名中那些是DNS

  • value: 當前區域的某DNS服務器的名字,例如: ns.redhat.org.

#value的名字是隨便起的。只需要添加A這種資源記錄的時候,對應上指定的ip地址就可以了。

1. 相鄰的兩個資源記錄的name相同時,後續的可省略。#會自動繼承上一條記錄的一些信息

2. 對NS記錄而言,任何一個ns記錄後面的服務器名字,都應該在後續有一個A記錄 
#表示當前區域中誰是DNS服務器,因為可能存在多個dns服務器,soa只標識了主dns服務器

3. 一個域可以有多個NS記錄(一個域名可以有多個dns服務器)

範例:
redhat.org. IN NS ns1.redhat.org. #前面的FQDN可以只寫主機名,域名會自動補全
               NS ns2.redhat.org. #完整:redhat.org. IN NS ns2.redhat.org.會自動繼承上面的內容
A記錄定義規則
  • name: 某主機的FQDN,例如:www.redhat.org.

  • value: 主機名對應主機的IP地址

www.redhat.org. IN A 1.1.1.1

www.redhat.org. IN A 2.2.2.2

mx1.redhat.org. IN   A 3.3.3.3

mx2.redhat.org. IN   A 4.4.4.4

$GENERATE 1-254 HOST$   IN A 1.2.3.$

*.redhat.org. IN A 5.5.5.5  #表示輸入任何的子域名都可以解析。例如 wwwwwwwww.redhat.com

redhat.org. IN   A 6.6.6.6 #直接輸入域名便可解析

#注意:如果有和DNS的IP相同的多個同名的A記錄,優先返回DNS的本機IP

#避免用戶寫錯名稱時給錯誤答案,可通過泛域名解析進行解析至某特定地址
CNAME別名記錄
  • name: 別名的FQDN

  • value: 真正名字的FQDN

例如:www.magedu.org. IN CNAME   websrv.magedu.org.
PTR記錄
name: IP,有特定格式,把IP地址反過來寫,1.2.3.4,要寫作4.3.2.1;
而有特定後綴:in-addr.arpa.,所以完整寫法為:4.3.2.1.in-addr.arpa.
value: FQDN

例如:
4.3.2.1.in-addr.arpa. IN PTR www.magedu.org.
#如1.2.3為網絡地址,可簡寫成:
4 IN PTR www.magedu.org.

#注意:網絡地址及後綴可省略;主機地址依然需要反着寫

反向解析的實現

反向區域:即將IP反向解析為FQDN
區域名稱:網絡地址反寫.in-addr.arpa.

www.baidu.com. 從上到下對應的為:.--com--baidu--www

172.16.100.10 --> 10.100.16.172.in-addr.arpa.

#域名:172.16.100. --> 100.16.172.in-addr.arpa.
定義區域
zone "ZONE_NAME" IN {
 type {master|slave|forward};
 file "網絡地址.zone"
};
zone "26.168.192.in-addr.arpa." IN {
        type master;
        file "192.168.26.zone";

};
定義解析庫:
[root@CentOS8 named]# cat 192.168.26.zone 
$TTL 1D
@	IN SOA	master rname.invalid. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	master
master  IN	A     	10.0.0.10
10	PTR	www.redhad.com
20	PTR     www.tom.com
30	PTR 	www.bob.com

啟用DNS客戶端緩存功能

客戶端啟用DNS緩存功能,可以大幅減輕DNS服務器的壓力,同時也能提高DNS客戶端名稱解析速度。

nscd
CentOS 默認沒有啟用DNS客戶端緩存,安裝nscd(Name Service Cache Daemon,名稱服務緩存守護進
程)包可以支持DNS緩存功能

ubuntu 默認會啟用DNS客戶端緩存
[root@ubuntu1804 ~]#systemctl status systemd-resolved.service

#清空緩存
[root@ubuntu1804 ~]#systemd-resolve --flush-caches
[root@centos7 ~]#yum -y install nscd

[root@centos7 ~]#systemctl enable --now nscd

#查看緩存統計信息
[root@centos7 ~]#nscd -g

#清除DNS客戶端緩存
[root@centos7 ~]#nscd -i hosts

從服務器的實現

DNS的類型:

  • 主服務器

  • 從服務器

  • 轉發服務器

從服務器:
(1)時間和主服務器要同步(ntp)

(2)主服務器的區域解析庫文件有一條NS資源記錄指向從服務器

(3)從服務器只需要定義區域,而無須提供解析庫文件(放置於/var/named/slaves/目錄)

(4)主服務器需要允許從服務器作區域傳送
從服務器區域的定義
zone "ZONE_NAME" IN {
 type slave; #定義服務器類型
 masters { MASTER_IP; }; #定義使用的主服務器
 file "slaves/ZONE_NAME.zone"; #定義區域文件
};
範例:搭建從服務器實現冗餘功能

主服務器配置:

配置文件:
//#只允許從服務器進行區域傳輸,如果不寫默認所有的服務器都能進行傳輸
allow-transfer { 10.0.0.12;};

區域數據庫:
$TTL 1D
@       IN SOA  master rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      master
        NS      slave
master  IN  A 10.0.0.10
slave   IN  A 10.0.0.12 #指定slave服務器的ip地址

www   IN A 10.0.0.11
blog  IN A 10.0.0.110
mail  IN A 10.0.0.111

從服務器配置:

//#不允許其它主機進行區域傳輸,不寫就默認所有的主機都可以
allow-transfer { none;};
#指定區域
zone "redhad.com" IN {            #域名和主服務器的一樣
        type slave;               #DNS的類型
        masters {10.0.0.10;};     #指定主服務器
        file "slaves/redhad.com"; #指定同步過來的資源記錄存放位置
};

驗證:

查看slaves/redhad.com中是否存在數據(亂碼)

停止掉主服務器,指定從服務器為測試及其的DNS,測試能否正常訪問www.redhad.com等。

DNS實現子域

子域委派授權

子域委派授權:將子域委派給其它主機管理,實現分佈式DNS數據庫。

父域DNS配置:

#父域中指定子域的DNS服務器和IP地址。然後再子域的DNS服務器上面定義對應的解析規則就行了。
這樣通過父域的DNS地址也能找到子域的對應解析。

$TTL 1D
@       IN SOA  master  rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
         IN     NS      master 

shanghai IN     NS      shanghais #指定子域的區域使用的DNS服務器名字

master    IN    A       10.0.0.10
shanghais IN    A       10.0.0.11 #子域DNS對應的IP地址
www IN A 10.0.0.11

子域DNS配置:

zone "shanghai.heyongshen.com" IN {
        type master;
        file "shanghai.heyongshen.zone";
};
#在子域中定義相應的解析規則
$TTL 1D
@       IN SOA  master  rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@        IN     NS      master
master   IN     A       10.0.0.11


www      IN     A       10.0.0.10

測試:

[root@CentOS8 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE=Ethernet
BOOTPROTO=none
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=10.0.0.12
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.10  #指定DNS服務器

[root@CentOS8 ~]# ping www.heyongshen.com
[root@CentOS8 ~]# ping www.shanghai.heyongshen.com

DNS轉發(forward)(緩存)服務器

將用戶的DNS請求,轉發至指定的DNS服務,而非默認的根DNS服務器,並將指定
服務器查詢的返回結果進行緩存,提高效率

#建議關閉加密驗證
dnssec-enable no; 
dnssec-validation no;

全局轉發:對非本機所負責解析區域的請求,全轉發給指定的服務器

Options {
 forward first|only;
 forwarders { ip;};
};

特定區域轉發:僅轉發對特定的區域的請求,比全局轉發優先級高

zone "ZONE_NAME" IN {
 type forward;
 forward first|only;
 forwarders { ip;};
};
兩種轉發類型:
  • first:先轉發至指定DNS服務器,如果無法解析查詢請求,則本服務器再去根服務器查詢

  • only: 先轉發至指定DNS服務器,如果無法解析查詢請求,則本服務器將不再去根服務器查詢

範例:實現DNs服務器的轉發功能

// listen-on port 53 { 127.0.0.1; };  
// allow-query     { localhost; }; 允許查詢的主機

緩存服務器主要配置:

#關閉加密驗證:
dnssec-enable no;
dnssec-validation no;

#配置轉發規則
forward  first; #轉發規則
forwarders {10.0.0.10; }; #主服務器

主服務器主要配置:

#關閉加密驗證:
dnssec-enable no;
dnssec-validation no;

#定義區域
zone "heyongshen.com" IN {
        type master;
        file "heyongshen.zone";
};


#配置規則
$TTL 1D
@       IN SOA master rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      master
master  A       10.0.0.10

www     IN A 10.0.0.2

智能DNS的實現

GSLB:
  • GSLB:Global Server Load Balance 全局負載均衡

  • GSLB是用戶發起請求後判斷由哪個地點的服務器來提供服務

  • GSLB主要的目的:是在整個網絡範圍內將用戶的請求定向到最近的節點(或者區域)

CND服務

CDN: (Content Delivery Network)內容分髮網絡

工作原理
1. 用戶向瀏覽器輸入www.a.com這個域名,瀏覽器第一次發現本地沒有dns緩存,則向網站的DNS服務器請求

2. 網站的DNS域名解析器設置了CNAME,指向了www.a.tbcdn.com,請求指向了CDN網絡中的智能DNS負載均衡系統

3. 智能DNS負載均衡系統解析域名,把對用戶響應速度最快的IP節點返回給用戶;

4. 用戶向該IP節點(CDN服務器)發出請求

5. 由於是第一次訪問,CDN服務器會通過Cache內部專用DNS解析得到此域名的原web站點IP,向原站點服務器發起請求,並在CDN服務器上緩存內容

6. 請求結果發給用戶
CDN服務商
  • 服務商:阿里,騰訊,藍汛,網宿,帝聯等

  • 智能DNS: dnspod dns.la