最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

008. 從零開始搭建 DNS 服務(wù)器——進(jìn)階篇

2023-01-22 12:56 作者:姚千山  | 我要投稿

之前我們實(shí)現(xiàn)了一個(gè)簡單的 DNS 服務(wù)器(007. 從零開始搭建 DNS 服務(wù)器——入門篇),今天我們就來試試進(jìn)階操作,搭建一個(gè)功能更強(qiáng)大的 DNS 服務(wù)器。

DNS 解析類型

DNS 服務(wù)器的解析大致分為幾類,A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR 等,大致為:

  • A 記錄: 將域名指向一個(gè) IPV4 地址

  • AAAA?記錄:將域名指向一個(gè) IPV6 地址

  • CNAME 記錄:將該域名指向另外一個(gè)域名

  • MX 記錄:建立電子郵箱服務(wù),將指向郵件服務(wù)地址

  • NS 記錄:域名解析記錄,如果要將子域名指定某個(gè)域名服務(wù)器來解析,需要設(shè)置 NS 記錄

  • TXT 記錄:可任意填寫,一般為某主機(jī)或域名設(shè)置使用,用于做一些備注

  • PTR 記錄:記錄 A 記錄的逆向記錄,又稱做 IP 反查記錄或指針記錄,負(fù)責(zé)將 IP 反向解析為域名

  • SOA 記錄:表示開始權(quán)限記錄,記錄用于在眾多 NS 記錄中那一臺(tái)是主服務(wù)器

QTYPE 實(shí)際上還有其他類型,所有可能的 type 及其約定的數(shù)值表示如下:

DNS 解析類型

在這十幾種類型中,最常用的是 A 記錄,負(fù)責(zé)將域名轉(zhuǎn)換為 IPV4 地址。在進(jìn)階篇中,只對(duì) A 記錄作特殊處理,其余類型仍是直接轉(zhuǎn)發(fā)數(shù)據(jù)。

DNS 協(xié)議格式

DNS 請(qǐng)求與響應(yīng)的格式是一致的,其整體分為 Header、Question、Answer、Authority、Additional 五部分,如下圖所示:

協(xié)議整體格式

Header 部分是一定有的,長度固定為 12 個(gè)字節(jié);其余 4 部分可能有也可能沒有,并且長度也不固定,這個(gè)在 Header 部分中有指明。Question?與 Answer 部分在 A 記錄中也是一定有的。注意,Question?與 Answer?部分并不是一定成對(duì)出現(xiàn)的。在請(qǐng)求中有 Question?部分,在響應(yīng)中不一定會(huì)有 對(duì)應(yīng)的Answer 部分。

DNS 服務(wù)器實(shí)現(xiàn)

1. 導(dǎo)入模塊

使用?socketserver 代替 socket 庫,它提供了服務(wù)器中心類,可以簡化 DNS 服務(wù)器的開發(fā)。

socketserver 內(nèi)部使用 IO 多路復(fù)用以及 “多線程” 和 “多進(jìn)程” ,從而實(shí)現(xiàn)并發(fā)處理多個(gè)客戶端請(qǐng)求的 socket 服務(wù)端。即:每個(gè)客戶端請(qǐng)求連接到服務(wù)器時(shí),socket 服務(wù)端都會(huì)創(chuàng)建一個(gè)“線程”或者“進(jìn)程” 專門負(fù)責(zé)處理當(dāng)前客戶端的所有請(qǐng)求,從而大大提升了并發(fā)處理能力。

由于是 Python 標(biāo)準(zhǔn)庫,直接引入:

使用 dnslib 解析 DNS 報(bào)文,攔截并重新生成新的響應(yīng)報(bào)文。

引入 time 庫處理時(shí)間,用于 DNS 緩存過期控制。

引入 logging 庫記錄服務(wù)器日志,并進(jìn)行配置。

2. 啟動(dòng)服務(wù)

以上下文管理器方式啟動(dòng)多線程 UDP 服務(wù)器,將會(huì)持續(xù)運(yùn)行,直到手動(dòng)結(jié)束程序退出為止。

3. 緩存控制與自定義記錄

新建一個(gè) Hosts 類,負(fù)責(zé)緩存與自定義記錄。

可以在 record 中添加自定義記錄,并設(shè)定過期時(shí)間為 9e11(相當(dāng)于永不過期)。設(shè)定初始緩存為自定義記錄。

對(duì)于一般的 DNS 記錄,設(shè)定緩存時(shí)間為 12 小時(shí)。在每次 DNS 請(qǐng)求完畢,可以檢查一次緩存,并清除過期記錄:

4. 請(qǐng)求處理

在啟動(dòng)服務(wù)中,我們可以看見在?ThreadingUDPServer 中傳入了一個(gè) Threading UDP RequestHandler 參數(shù),這是一個(gè)請(qǐng)求處理類,繼承自?DatagramRequestHandler,即 UDP請(qǐng)求處理類。

在這個(gè)類里,我們需要重寫 handle 函數(shù),進(jìn)行 DNS 請(qǐng)求的處理。

首先,我們需要解析客戶端發(fā)來的數(shù)據(jù),解析出請(qǐng)求類型是否為 A 記錄。不是 A 記錄就直接轉(zhuǎn)發(fā)數(shù)據(jù):

A 記錄也有兩種情況:一是有緩存(包含自定義記錄),直接重緩存中獲取 IP 地址,封裝后發(fā)給原客戶端。另一種則是沒有緩存(或緩存過期)的情況,需要重新請(qǐng)求獲取 IP 地址。由于需要將新得到記錄加入緩存,也需要對(duì)響應(yīng)報(bào)文解包再封包發(fā)回。

處理邏輯如下:

在?get_answer_A 函數(shù)中,對(duì)兩種情況區(qū)別處理:

最后,由于引入了緩存與日志,還需要重寫 finish 方法,最后清理緩存并添加 DNS 解析記錄:

這樣,一個(gè)具有并發(fā)處理能力,支持自定義記錄、緩存機(jī)制、日志查看的實(shí)用 DNS 服務(wù)器就完成了。

至于有沒有高級(jí)篇,那就不好說啦。

5. 完整代碼

延伸閱讀

  1. DNS 消息格式:https://www.cnblogs.com/cobbliu/archive/2013/04/02/2996333.html

  2. 自己動(dòng)手實(shí)現(xiàn) DNS 協(xié)議:https://www.cnblogs.com/dongkuo/p/6714071.html

  3. 寫一個(gè) DNS 服務(wù)器:http://python.quanduan.com/post/dns-fu-wu-qi/ji-chu/xie-yi-ge-dns-fu-wu-qi

  4. socketserver --- 用于網(wǎng)絡(luò)服務(wù)器的框架:https://docs.python.org/zh-cn/3/library/socketserver.html


008. 從零開始搭建 DNS 服務(wù)器——進(jìn)階篇的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
固阳县| 和静县| 凤凰县| 望奎县| 麦盖提县| 夹江县| 河北省| 乌拉特前旗| 安塞县| 武功县| 梓潼县| 新宁县| 南雄市| 榆树市| 杂多县| 雅江县| 友谊县| 新和县| 吉木萨尔县| 静宁县| 富平县| 集安市| 平罗县| 肇庆市| 新绛县| 会东县| 舒城县| 崇阳县| 武平县| 景东| 林州市| 偏关县| 林芝县| 营口市| 大冶市| 安徽省| 苍山县| 泰兴市| 华蓥市| 旌德县| 宜州市|