DNS與服務器搭建-Linux每日一練(10)

今天的文章有點長,因爲DNS三兩句話說不完,容我慢慢道來。

DNS(Domain Name System)域名系統,也就是把某個網址解析成 ip 的服務,對於私有云的方案,有可能會自建 DNS 服務器,這樣可以讓所有的配置文件都以域名的形式存在,自動化部署的時候就不需要因爲 ip 不同而改動太多的環境變量,是不是很方便?

當然了,這種方式如果你在替換了別人的首選DNS服務器,把一些網站流量轉發過來,自己做一個假網站來騙別人的密碼什麼的,是不是很爽?

PS: 本節內容如有名詞聽不懂可以拉到最後看名詞解釋

DNS 基本概念

本節概念,如果已知可以直接跳到 搭建 DNS 服務器

其實不管是開發還是運維,多少都接觸過DNS,一個域名長這樣,一個點一個域,最多四個域,用域名也就是一個字符串來標記一個網址的方式,是爲了讓人更好記,計算機纔不在乎是ip還是用域名呢!

頂級域又可以分爲三類:

  1. 通用頂級域(.com 商業機構,.org 非營利性組織,.net 網絡服務機構等)
  2. 國家頂級域(.cn 中國,.uk 英國,.us 美國,.jp 日本)
  3. 反向域(基礎建設頂級域,.arpa)

我們如果自己註冊一個域名,完全不用在乎用哪個頂級域名,只是一個潛規則,給別人知道大概你的網站可能有什麼用,我們通常在ICP那裏申請的域名是二級域名,申請下來以後就可以隨意自己加三級、四級域名,因爲很多人頂級域名是一樣的,申請的是二級域名,然後所有的三級四級域名你都可以自己加,都屬於你,按這種邏輯來看域名系統就像一顆樹

我們任何人都可以申請域名,只要花幾十塊錢就可以用他來搭網站,比如我在騰訊雲上申請的域名 coding3min.com 就是 60 塊一年的。

域名解析的過程

域名解析有多種類型,www@*mail二級域名手機網站對應不同的用法。

可以在騰訊雲上看到提示,通常www爲前綴的是主域名,但是輸入麻煩,我把他重定向到了coding3min.com上,也就是@方式,各個的作用看上圖。

記錄類型又分爲下面這幾種

常用的是A類型,直接指向一個服務器的 ip,CNAME類型是指向另一個域名,比如我們用github給我們提供的表態網站服務就可以搭建起來一個免費的博客會提供一個域名用來中轉,我們也可以藉助自己的域名來解析到MX類型,搭建自己後綴的郵件服務器。

下面是一個詳細的域名解析過程,劃重點!這裏考試要考

如上圖,

  1. 在瀏覽器中輸入 www.baidu.com域名,操作系統會先檢查自己本地的 hosts文件是否有這個網址映射關係,如果有,就先調用這個 IP 地址映射,完成域名解析。
  2. 如果 hosts裏沒有這個域名的映射,則查找本地 DNS解析器緩存,是否有這個網址映射關係,如果有,直接返回,完成域名解析。
  3. 如果 hosts與本地 DNS解析器緩存都沒有相應的網址映射關係,首先會找 TCP/IP參數中設置的首選 DNS服務器,在此我們叫它本地 DNS 服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。
  4. 如果要查詢的域名,不由本地 DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個 IP地址映射,完成域名解析,此解析不具有權威性。
  5. 如果本地 DNS服務器本地區域文件與緩存解析都失效,則根據本地 DNS 服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地 DNS就把請求發至 “根 DNS服務器”,“根 DNS服務器”收到請求後會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名服務器的一個 IP。本地 DNS服務器收到 IP信息後,將會聯繫負責 .com域的這臺服務器。這臺負責 .com域的服務器收到請求後,如果自己無法解析,它就會找一個管理 .com域的下一級 DNS服務器地址( baidu.com)給本地 DNS服務器。當本地 DNS服務器收到這個地址後,就會找 baidu.com域服務器,重複上面的動作,進行查詢,直至找到 www.baidu.com主機。
  6. 如果用的是轉發模式,此 DNS服務器就會把請求轉發至上一級 DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根 DNS 或把轉請求轉至上上級,以此循環。

不管是本地 DNS 服務器用還是轉發,還是根提示,最後都是把結果返回給本地 DNS 服務器,由此 DNS 服務器再返回給客戶機。

DNS 查詢方式包含遞歸和迭代,解析方式包含正向解析和反向解析。我們知道了原理,實戰一下看看吧!

搭建本地 DNS 服務器

如果你用的是kubernetes來部署服務,他的kube-dns組件會自動做好域名解析,讓服務和服務之間用特定的名稱規則自動完成服務發現。

DNS 只是一種協議,真正提供服務的是 bind 軟件,因此,現在來安裝它:

sudo yum install bind-utils bind bind-chroot

安裝後有幾個目錄或文件是需要記得的:

  • /etc/named.conf: 主配置文件
  • /etc/sysconfig/named: 配置是否啓動 chroot 及額外的參數
  • /var/named: 數據庫文件存放目錄,存放主機名對應 ip 的文件
  • /var/run/named: named 程序執行時 pid-file 文件存放目錄(在 ubuntu 系統中,目錄爲/run/named)

知道了這幾個重要配置文件和目錄後,下面開始配置,我們把baidu.com的流量劫持了試試看

修改配置文件前一個重要習慣是先複製一份,這樣改錯了方便恢復。

改主配置文件 named.conf,找到相應的配置位置,改成我這個

listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
allow-query     { any; };
recursion yes;

意思是開放 53 號端口對於任意地址的監聽,允許所有主機對我們進行訪問,拒絕遞歸查詢方式,使用迭代查詢方式,增加資源利用率。

拉到底部可以看到 include 了這個配置文件,你可以在裏面對正解(反解)區域進行定義。

include "/etc/named.rfc1912.zones";

/etc/named.rfc1912.zones底部添加如下內容。

zone "baidu.com" IN {           //一級域名爲.com、二級域名爲.baidu
         type master;               //類型爲主DNS服務器
         file "named.baidu.com";    //指向正解文件爲/var/named/named.baidu.com
};

修改/var/named/named.baidu.com文件如下,其中127.0.0.1這個 ip 你可以改成你想要的。

$TTL 600 ;定義下列所有記錄緩存在客戶端的時間
@       IN SOA dns.yu.com. root.localhost (
                                         0       ; serial       #序列號,用於主從dns中判斷是否爲最新版本
                                         1H      ; refresh      #一小時更新一次
                                         15M     ; retry        #若連接不上,等待15分鐘後重新嘗試連接
                                         1W      ; expire       #超過一週仍無法下載便放棄下載
                                         3D )    ; minimum      #客戶端找服務端做dns解析時,否定答案的緩存時間爲3天
@       IN      NS      dns.baidu.com.           ; NS記錄表明了dns服務器的SDQN爲dns.baidu.com.
dns.baidu.com.     IN      A       127.0.0.1     ; 下面三條A記錄表明了域內主機的IP地址
www.baidu.com.     IN      A       127.0.0.1
ftp             IN      A       127.0.0.1

重啓服務,檢查 SELinux 並開啓防火牆的 dns 服務

systemctl restart named  #重啓服務
setenforce 0   #關閉SELinux
firewall-cmd --add-service=dns #開啓防火牆的dns服務

修改 DNS 服務器指向

linux中,DNS服務器指向的配置有固定的文件,如下文件就有一個主服務器,一個備服務器,等搭建好DNS服務器後就是改這個文件。

$ cat /etc/resolv.conf
nameserver 192.168.3.1
nameserver 114.114.114.114

測試

ping www.baidu.com
PING www.baidu.com (127.0.0.1) 56(84) bytes of data.
64 bytes from VM-0-11-centos (127.0.0.1): icmp_seq=1 ttl=64 time=0.006 ms
64 bytes from VM-0-11-centos (127.0.0.1): icmp_seq=2 ttl=64 time=0.021 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.006/0.013/0.021/0.008 ms

也可以用nslookup來查看域名的解析,如果改完了新的DNS服務器的位置就可以用這個命令來查詢。

$ nslookup coding3min.com
Server:  192.168.3.1
Address: 192.168.3.1#53

Non-authoritative answer:
coding3min.com canonical name = coding3min.com.cdn.dnsv1.com.
coding3min.com.cdn.dnsv1.com canonical name = 6yucorit.dispatch.spcdntip.com.
Name: 6yucorit.dispatch.spcdntip.com
Address: 112.67.251.116
Name: 6yucorit.dispatch.spcdntip.com
Address: 113.105.165.183
Name: 6yucorit.dispatch.spcdntip.com
Address: 113.96.98.77
Name: 6yucorit.dispatch.spcdntip.com
Address: 125.78.252.121
  • Server 後的就是 DNS服務器的地址
  • 因爲我用了 CDN,所以 DNS解析出了多個地址,下面的 Address比如 112.67.251.116就是解析出來的真實 ip

DNS協議運行在UDP協議之上,因此使用的53號端口,當沒有辦法查詢到完整的信息時,就會再次以 TCP 協議來查詢,因此,防火牆需要放行TCPUDP的 53 號端口,端口號可以在/etc/services文件查看到:

cat /etc/services  | grep domain
domain          53/tcp                          # name-domain server
domain          53/udp
domaintime      9909/tcp                # domaintime
domaintime      9909/udp                # domaintime

名詞解釋

DNS 服務器:運行 DNS 服務器程序的計算機,存儲 DNS 數據庫信息。

DNS 緩存:DNS 服務器在解析客戶機的域名請求時,如果本地沒有該域名的記錄,則會詢問其它 DNS 服務器,當其它域名將解析結果返回給 DNS 服務器時,DNS 將對應的記錄保存在本地,生成 DNS 緩存,當下一次客戶機再次請求時,DNS 服務器則可以直接使用緩存中的 DNS 記錄。

DNS 查詢方式:遞歸查詢和迭代查詢

遞歸查詢:當客戶機向 DNS 服務器發起域名解析請求時,DNS 服務器首先查看自己本機的 DNS 記錄,如果沒有則會向其它 DNS 服務器發起解析請求。迭代查詢:當客戶機向 DNS 服務器發起域名解析請求時,DNS 服務器不會給客戶機解析地址,而是告訴客戶機另外一臺 DNS 服務器,客戶機再向這臺服務器發起地址解析請求。

正向解析和反向解析正向解析:指域名解析到 IP 地址的解析過程。反向解析:指 IP 地址解析到域名的解析過程。

課後問題

這裏我只是做了A記錄的正解到www前綴的域名,你還可以自己實現任意一個其他的嗎?比如A記錄的@解析,試試看吧!

引用

    https://www.cnblogs.com/Dy1an/p/11157152.html

    https://blog.csdn.net/weixin_41843699/article/details/90350077

    https://www.cnblogs.com/qingdaofu/p/7399670.html

    https://blog.csdn.net/crisdiano/article/details/104071227

    https://blog.csdn.net/Linjingke32/article/details/80993870


新的一年到了,這是一張3天免費體驗卡,一人只能使用一次,歡迎加入體驗,長按二維碼識別加入,可下載【知識星球】app方便收到更新通知



本文分享自微信公衆號 - 編程三分鐘(coding3min)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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