雲原生學習築基 ~ 組網必備知識點 ~ DNS服務

@

一、爲啥寫這篇文章?

DNS(domain name system)域名管理

說一下爲啥會整理這麼一篇文章,難道工作會用到嘛?不不不,作爲CRUD工程師,日常工作那是一準用不到本文跟大家分享的知識。

但是當你想學雲原生技術棧時,你無論如何都不能跳過這篇文章所分享的DNS等計算機網絡的知識點。所以這其實是一篇築基的文章。

二、DNS的作用

TCP/IP網絡協議要求想要互聯的機器要有唯一的IP地址,因爲TCP/IP協議是基於IP地址通信的。

但是ip地址是一大長串數據,也不好記。所以就衍生出一個叫主機識別碼的東西來。這個主機識別碼ip地址一樣,都是唯一存在的。比如:www.qq.com就是一個主機識別碼

TCP/IP這道坎,主機識別碼就不能獨立存在,我們需要一個機制,可以幫我們將主機識別碼轉換成ip地址DNS系統扮演的就是這個角色。

本專題公衆號首發,感興趣可以考慮關注,不迷路:

點擊閱讀原文,體驗感更好哦......

點擊閱讀原文,體驗感更好......

三、域

域名是分層的

比如齊魯工業大學的域名是:qlu.edu.cn

其實cn後面還有個. 表示根域名服務器,但是都省略了

其中的cn表示中國,edu表示教育,qlu是齊魯工業大學的名字。這樣大家看到這個域名時,即使不知道它具體是哪所高校,但是起碼知道它代表一所學校。

qlu.edu.cn 還可以繼續往下分,如www.qlu.edu.cnpaper.qlu.edu.cnfamily.qlu.edu.cn等等

四、DNS工作原理

一說DNS服務器大家都感覺雲裏霧裏,感覺DNS服務器很高大上的樣子。

它確實是臺服務器,確切的說是專門運行着有域名解析功能的某個軟件的服務器(比如後文中的bind軟件),既然是個軟件,那軟件啓動後肯定得監聽某個端口,這個端口

講一下當我們在瀏覽器輸入:www.baidu.com時,它時如何找到域名對應的ip地址的!

1、首先瀏覽器會緩存域名、ip的對應關係。

2、瀏覽器中沒緩存,就會查找電腦本地的hosts文件,這裏面會配置域名和ip的對應關係。

 ~ % cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

3、如果本地hosts文件中也沒有域名對應的ip地址,我們的主機就會像它的dns服務器發起詢問。在mac系統可以查看:網絡偏好設置 ,找到dns服務器的相關信息。

然後點擊高級,查看當前我的mac的DNS服務器地址

在mac或者linux中都可以通過如下的命令查詢dns服務器的位置

~ % cat /etc/resolv.conf

在mac或者linux中都可以通過如下的命令對域名進行解析

# 會使用resolv.conf記錄的dns服務器,對域名進行解析
~ % nslookup baidu.com
Server:		172.22.1.253
Address:	172.22.1.253#53

Name:	baidu.com
Address: 220.181.38.148
Name:	baidu.com
Address: 220.181.38.251

4、免費的DNS服務器ip

ip 公司
8.8.8.8 谷歌
114.114.114.114 百度

5、DNS服務器接受到域名解析的請求後,就會查詢該域名對應的ip是多少,而且他本身也存在緩存機制,如果它確定自己不能找到域名對應的ip地址的話,就會將這個dns解析請求轉發給根DNS服務器,根域名域名服務器會告訴我們的DNS服務器說:我知道 com. 域名服務器的位置,你去問他吧!

然後我們的DNS服務器找到com.域名服務器說:你知道www.baidu.com 對應的ip地址嗎? 然而com.服務器會說:我知道baidu.com.域名服務器在哪裏,你去問他吧!

然後我們的DNS服務器找到baidu.com.域名服務器說:你知道www.baidu.cn 對應的ip地址嗎? baidu.com.服務器會說:www.com.com 的ip地址是 xxx.xxx.xxx.xxx

五、搭建DNS服務器

5.1、Bind

Bind是一款開源的DNS軟件,全稱:Berkeley Internet Name Domain 由美國加州大學伯克利分享開發、維護。

支持unix、window。BIND現在由互聯網系統協會(Internet Systems Consortium)負責開發和維護。

那下文主要就是記錄如何使用Bind軟件搭建DNS服務以及搭建主從DNS服務。軟件人家已經寫好了,對使用者來說都很友好,只要改一改配置文件然後啓動就OK(重點是理解那些參數都是啥意思)。

DNS域名解析會使用:udp/53

主從DNS服務之間的數據傳輸使用:tcp/53

其實如果你沒有自建dns域名解析服務的需求,看到這裏就可以結束了。如果以後可能會有這個記得收藏。

5.2、系統環境準備

  • 調整yum源
yum install epel-release -y
  • 關閉SELinux、firewalld
# 臨時關閉SELinux
setenforce 0

# 永久關閉SElinux
vi /etc/selinux/config
#SELINUX=enforcing #註釋掉
#SELINUXTYPE=targeted #註釋掉
SELINUX=disabled #增加
# 重啓

# 關閉防火牆,注意一定要關閉防火牆
# 不然後面使用bind9自建dns時其他的服務器無法和自建的dns服務器通信~
# 不然etcd集羣也沒法搭建起來~
systemctl stop firewalld
# 爲了不在重啓後再去手動的關閉防火牆,所以直接將其禁用掉~
systemctl enable firewalld
  • 安裝必要的工具
yum install wget net-tools telnet tree nmap sysstat dos2unix bind-utils -y

5.3、安裝

在hdss7-11上執行命令:

yum install bind -y

檢測bind版本

rpm -qa bind

查看bind都有哪些文件

rpm -ql bind

瞭解配置文件

man 5 xxx.conf

5.4、查看bind的相關文件

通過如下命令可以找到Bind的主配置文件named.conf的位置

# 軟件名叫bind,但是bin文件進程名稱叫named
[root@localhost ~]# rpm -ql bind | grep etc
/etc/logrotate.d/named # 日誌輪轉的配置
/etc/named
/etc/named.conf # 主配置文件
/etc/named.iscdlv.key
/etc/named.rfc1912.zones # zone文件,用於定義域
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/rwtab.d/named

查看程序常用bin文件位置

[root@localhost ~]# rpm -ql bind | grep sbin
/usr/sbin/named # 程序啓動文件
/usr/sbin/named-checkconf # 檢查配置文件語法(named.conf、named.rfc1912.zones)
/usr/sbin/named-checkzone # 檢查區域文件語法的命令

查看服務的日誌文件位置

[root@localhost ~]# rpm -ql bind | grep named.log
/var/log/named.log

其他動態文件的位置

[root@localhost ~]# rpm -ql bind | grep var
/var/log/named.log # 日誌文件
/var/named
/var/named/data
/var/named/dynamic
/var/named/named.ca # 根域名服務器配置(所有DNS服務器都知道根域名服務器在哪裏)
/var/named/named.empty 
/var/named/named.localhost # 正向解析區域文件的模版
/var/named/named.loopback # 反向解析區域文件的模版
/var/named/slaves # 從DNS服務器的下載文件的默認路徑

5.5、查看bind的主配置文件

[root@localhost ~]# cat /etc/named.conf

options {
  /*
  	監聽方式,服務監聽指定ip的53號端口
  	服務器可能有多張網卡,any表示所有網卡監聽53端口的DNS解析請求
  	todo 可以個實驗:1、ip指定爲本機ip。2、ip指定爲同網段隨便的ip
  */
	listen-on port 53 { 127.0.0.1; any;}; /**/
	
	/*數據文件目錄*/
	directory 	"/var/named";
	
	/*DNS緩存位置*/
	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";
	
	/*
		允許哪些client來查詢dns服務,默認是localhost。
		any表示所有人都能進行dns查詢
	*/
	allow-query     { localhost;any; };

	/*是否遞歸*/
	recursion yes;

	/*DNS安全擴展機制,默認開啓,直接關閉即可*/
	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";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

/*之所以全部DNS服務器都知道根域名服務器的位置,就是下面的配置在生效*/
zone "." IN {
	type hint;
	file "named.ca";
};

/*子配置文件*/
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

修改完主配置文件後使用如下命令檢驗是否改錯了

[root@localhost ~]# named-checkconf

5.6、查看域配置文件 - named.rfc1912.zones

[root@localhost ~]# cat /etc/named.rfc1912.zones

// 正向模版,從域名=>ip地址
// localhost.localdomain 爲域名
// named.localhost爲該域對應的配置文件,它位於/var/named/
// allow-update表示是否允許slave更新master的區域文件
zone "localhost.localdomain" IN { 
	type master;
	file "named.localhost";
	allow-update { none; }; 
};

// 反向模版,從ip地址=>域名
// 1.0.0.127 看着怪怪的,其實他是ip地址反過來寫了。而且也要求反過來寫
zone "1.0.0.127.in-addr.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};

5.7、查看某個具體的域的配置文件

[root@localhost ~]# ll /var/named/
總用量 16
drwxrwx--- 2 named named    6 4月  29 22:05 data
drwxrwx--- 2 named named    6 4月  29 22:05 dynamic
-rw-r----- 1 root  named 2253 4月   5 2018 named.ca
-rw-r----- 1 root  named  152 12月 15 2009 named.empty
-rw-r----- 1 root  named  152 6月  21 2007 named.localhost
-rw-r----- 1 root  named  168 12月 15 2009 named.loopback
drwxrwx--- 2 named named    6 4月  29 22:05 slaves

看一個正向解析的域的配置文件named.localhost

[root@localhost ~]# cat /var/named/named.localhost
$TTL 1D # 緩存的生命週期,默認1D表示1天
@	IN SOA	@ rname.invalid. ( # ()中是slave相關配置
					0	; serial # 更新序列號,當這個文件有變動時,需要將這個序列號+1,然後slave會向master同步數據
					1D	; refresh # slave從master中同步最新數據的時間間隔
					1H	; retry # slave從master中下載數據失敗之後,隔多久的時間再重試
					1W	; expire # slave中區域文件的過期時間,w是周
					3H )	; minimum # salve上緩存的最小有效時間
	NS	@
	A	127.0.0.1
	AAAA	::1
	
# @:表示當前域,也就是 named.rfc1912.zones 中的zone的名稱
# IN:表示Internet,互聯網
# SOA:表示開始授權
# rname.invalid.  是郵箱地址,因爲@符號有特殊含義,所以這裏的郵箱使用.分隔
# NS: 全稱NameServer 表示DNS服務器
# A:正向的Ipv4解析
# AAAA:IPv6

看一個反向解析的域的配置文件named.loopback

[root@localhost ~]# cat /var/named/named.loopback
$TTL 1D
@	IN SOA	@ rname.invalid. (
					0	; serial 
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	@
	A	127.0.0.1
	AAAA	::1
	PTR	localhost.

# 大部分參數和第一個文件相同
# PTR表示反向解析

5.8、實驗前提前拋出一個問題

可以通過下面的方式配置網卡的dns服務器的地址

[root@localhost named]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.4.7.7
NETMASK=255.255.255.0
GATEWAY=10.4.7.2
DNS1=10.4.7.2

比如網卡配置文件中指定的dns服務器地址是:10.4.7.2

另外系統上還運行着NetworkManager進程,它的作用之一將DHCP中獲取的DNS信息寫入/etc/resolv.conf

[root@localhost named]# ps -elf | grep NetworkManager
4 S root       6172      1  0  80   0 - 137970 poll_s 08:18 ?       00:00:00 /usr/sbin/NetworkManager --no-daemon
0 S root       7237   7080  0  80   0 - 28181 pipe_w 09:00 pts/0    00:00:00 grep --color=auto NetworkManager

也就是將我們設置的dns服務器地址,更新進下面的文件

[root@localhost named]# cat /etc/resolv.conf
nameserver 10.4.7.2

那麼問題來了:

我們本機的ip是10.4.7.7,然後我們在本機自建的dns服務時又需要指定dns服務的ip地址,那既然本機就是dns服務器,那指定的dns服務的地址肯定是本機的ip地址10.4.7.7,那這和NetworkManager更新入/etc/resolv.conf的ip地址是不同的。

而且通過nslookup ${域名} 進行域名解析時,它會去使用/etc/resolv.conf裏面的dns去解析域名,而不是我們自己在本機搭建的dns服務。

如果你非想用nsloopup驗證我們自己的dns服務是否正常,可以使用如下命令

[root@localhost named]# echo nameserver 10.4.7.7 >  /etc/resolv.conf

5.9、實驗:搭建DNS正向解析服務

實驗目的:實現將www.meng.com解析成192.168.1.2

1、修改/etc/named.conf中的監聽方式爲全網監聽、允許所有人訪問dns服務、關閉安全驗證機制

2、修改子配置文件/etc/named.rfc1912.zones添加meng.com域。注意這個meng.com域也會往下分層,比如:www.meng.comwiki.meng.comfamily.meng.com

[root@localhost etc]# vi /etc/named.rfc1912.zones

// 添加如下配置
zone "meng.com" IN {
        type master;
        file "named.meng.zone";
        allow-update { none; };
};

3、創建named.meng.zone配置文件,meng.com域分層的詳細邏輯就在這個named.meng.zone配置文件中定義。

[root@localhost etc]# rpm -ql bind |  grep named.localhost
/usr/share/doc/bind-9.11.4/sample/var/named/named.localhost
/var/named/named.localhost
[root@localhost etc]# cp /var/named/named.localhost /var/named/named.meng.zone

# 注意將named.meng.zone文件的所屬組改成named
# 否則會以爲named無法使用root文件而導致DNS服務不能解析meng.zone域
[root@localhost named]# chown -R root:named named.meng.zone
[root@localhost etc]# vi /var/named/named.meng.zone
# 按需修改配置文件

$TTL 1D
@       IN SOA meng.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
# 下面這兩行指定了dns服務器的nameServer是meng.com、ip地址是10.4.7.7(它自己)
# dns1是自定義的dns服務的名稱,叫啥都行
@       NS      dns1.meng.com.
dns1    A       10.4.7.7
# 在meng.com域中添加一個www主機,A記錄表示是一個正向解析。解析結果爲192.168.1.2
www			A				192.168.1.2 

4、檢查配置文件

[root@localhost etc]# rpm -ql bind | grep sbin/named
/usr/sbin/named
/usr/sbin/named-checkconf
/usr/sbin/named-checkzone
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint

[root@localhost etc]# named-checkconf named.conf
[root@localhost etc]# named-checkconf named.rfc1912.zones
[root@localhost named]# named-checkzone named.meng.zone named.meng.zone
zone named.meng.zone/IN: loaded serial 0
OK

5、開啓服務

[root@localhost named]# rpm -ql bind | grep named
/etc/logrotate.d/named
/etc/named
...
/usr/sbin/named
/usr/sbin/named-checkconf
[root@localhost sbin]# systemctl start named
[root@localhost sbin]# systemctl enable named
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.

[root@localhost sbin]# netstat -luntp | grep 53
tcp        0      0 10.4.7.7:53             0.0.0.0:*               LISTEN      25833/named
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      25833/named
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      25833/named
tcp6       0      0 ::1:953                 :::*                    LISTEN      25833/named
udp        0      0 10.4.7.7:53             0.0.0.0:*                           25833/named
udp        0      0 127.0.0.1:53            0.0.0.0:*                           25833/named

6、查看或修改本機的dns服務器地址+驗證實驗效果

[root@localhost named]# echo nameserver 10.4.7.7 >  /etc/resolv.conf
[root@localhost named]# nslookup www.meng.com
Server:		10.4.7.7
Address:	10.4.7.7#53

Name:	www.meng.com
Address: 192.168.1.2

通過dig命令驗證

[root@localhost named]# dig @10.4.7.7 www.meng.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> @10.4.7.7 www.meng.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65534
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

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

;; ANSWER SECTION:
www.meng.com.		86400	IN	A	192.168.1.2

;; AUTHORITY SECTION:
meng.com.		86400	IN	NS	dns1.meng.com.

;; ADDITIONAL SECTION:
dns1.meng.com.		86400	IN	A	10.4.7.7

;; Query time: 0 msec
;; SERVER: 10.4.7.7#53(10.4.7.7)
;; WHEN: 四 8月 19 08:32:16 CST 2021
;; MSG SIZE  rcvd: 92

通過host命令查看

[root@localhost named]# host www.meng.com
www.meng.com has address 192.168.1.2

5.10、實驗:搭建DNS反向解析服務

1、修改/etc/named.conf中的監聽方式爲全網監聽、允許所有人訪問dns服務、關閉安全驗證機制

2、修改子配置文件/etc/named.rfc1912.zones添加meng.com域反向解析

[root@localhost named]# vi /etc/named.rfc1912.zones
zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "named.meng.loopback";
        allow-update { none; };
};

3、創建、編輯子配置文件named.meng.loopback

[root@localhost named]# cp -p named.loopback named.meng.loopback
[root@localhost named]# vi named.meng.loopback
$TTL 1D
@       IN SOA  meng.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
# 下面這兩行也可以簡寫成一行:@       NS      dns1.meng.com.
# 之所以能簡寫是因爲dns1在正向解析配置中已經定義好了
@       NS      dns2.meng.com.
dns2    A       10.4.7.7
2       PTR     www.meng.com. # 2是1.168.192網段的最後一位,(192.168.1.2)

4、重啓服務

[root@localhost named]# systemctl  restart named

5、驗收

[root@localhost named]# dig -x 192.168.1.2 @10.4.7.7

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> -x 192.168.1.2 @10.4.7.7
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4572
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;2.1.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
2.1.168.192.in-addr.arpa. 86400	IN	PTR	www.meng.com.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa.	86400	IN	NS	dns2.meng.com.

;; Query time: 0 msec
;; SERVER: 10.4.7.7#53(10.4.7.7)
;; WHEN: 四 8月 19 08:57:51 CST 2021
;; MSG SIZE  rcvd: 98

或者

[root@localhost named]# nslookup 192.168.1.2
2.1.168.192.in-addr.arpa	name = www.meng.com.

[root@localhost named]# host 192.168.1.2
2.1.168.192.in-addr.arpa domain name pointer www.meng.com.

六、搭建主從DNS服務

主從DNS服務其實就是在多臺相同環境機器上,都安裝好Bind軟件,再按照一定的規則修改主從的配置文件。

要求主從DNS服務器的時間要相同,關於時間如何同步,可以參考下面的ntp

6.1、搭建時間同步服務器-ntp

10.4.7.9上安裝時間同步服務器

 ~]# yum install -y ntp

修改配置文件ntp.conf

~]# rpm -ql ntp | grep conf
/etc/ntp.conf
/etc/sysconfig/ntpd
/usr/share/man/man5/ntp.conf.5.gz
~]# vi /etc/ntp.conf

啓動

[root@ntp-server ~]# rpm -ql ntp | grep bin
/usr/bin/ntpstat
/usr/sbin/ntp-keygen
/usr/sbin/ntpd
/usr/sbin/ntpdc
/usr/sbin/ntpq
/usr/sbin/ntptime
/usr/sbin/tickadj
[root@ntp-server ~]# systemctl start ntpd
[root@ntp-server ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

在客戶端驗證時間同步服務器是否正常啓動

# 登陸10.4.7.0所在的其他網段的機器,驗證如下
~]# ntpdate 10.4.7.9
20 Aug 08:37:47 ntpdate[8399]: adjust time server 10.4.7.9 offset -0.017571 sec

在主從機器上添加crontab定時任務同步時間

參考之前的筆記:https://www.cnblogs.com/ZhuChangwu/p/11519940.html

~]# crontab -e
*/2 * * * * ntpdate 10.4.7.9 &> /dev/null

[root@localhost ~]# crontab -l
*/2 * * * * ntpdate 10.4.7.9 &> /dev/null

6.2、開始搭建

dns-master:10.4.7.7

dns-slave: 10.4.7.8

6.2.1、在master上的操作

1、設置允許哪些slave向自己同步數據

# 之前的配置如下
zone "meng.com" IN {
        type master;
        file "named.meng.zone";
        allow-update { none; };
};

# 可以將allow-update { none; };刪掉
# 也可以改寫成: allow-update { 10.4.7.8; };

2、重啓

6.2.2、在slave上的設置

1、使用crontab像時間同步服務器同步時間

2、修改/etc/named.conf配置文件(同master)

3、修改/etc/named.rfc1912.zones

# master的named.rfc1912.zones自定義正向zone配置如下

zone "meng.com" IN {
        type master;
        file "named.meng.zone";
        allow-update { none; };
};

# 響應的slave的追加配置如下
~]# vi /etc/named.rfc1912.zones

zone "meng.com" IN {
        type slave;
        # 因爲slave的zone文件是從master中拉取過來的
        # 所以slaves其實是個相對路徑
        # 全路徑是:/var/named/slaves/named.meng.zone , /var/named在named.conf中有定義
        file "slaves/named.meng.zone"; 
        # 指定master位置
        masters {10.4.7.7;};
};

4、重啓

6.2.3、客戶端的設置

爲客戶端設置兩個dns服務。

echo nameserver 10.4.7.7 > /etc/resolv.conf
echo nameserver 10.4.7.8 > /etc/resolv.conf

這樣,當需要進行域名解析時,優先使用master。當master掛了後,客戶端會使用備用的dns服務解析域名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章