導航:首頁 > 源碼編譯 > dns源碼解析

dns源碼解析

發布時間:2023-01-19 12:34:54

① coredns源碼分析

CoreDNS是使用go語言編寫的快速靈活的DNS服務,採用鏈式插件模式,每個插件實現獨立的功能,底層協議可以是tcp/udp,也可以是TLS,gRPC等。默認監聽所有ip地址,可使用bind插件指定監聽指定地址。

格式如下

SCHEME是可選的,默認值為dns://,也可以指定為tls://,grpc://或者https://。
ZONE是可選的,指定了此dnsserver可以服務的域名前綴,如果不指定,則默認為root,表示可以接收所有的dns請求。
PORT是選項的,指定了監聽埠號,默認為53,如果這里指定了埠號,則不能通過參數-dns.port覆蓋。

一塊上面格式的配置表示一個dnsserver,稱為serverblock,可以配置多個serverblock表示多個dnsserver。

下面通過一個例子說明,如下配置文件指定了4個serverblock,即4個dnsserver,第一個監聽埠5300,後面三個監聽同一個埠53,每個dnsserver指定了特定的插件。

下圖為配置的簡略圖

a. 從圖中可看到插件執行順序不是配置文件中的順序,這是因為插件執行順序是在源碼目錄中的plugin.cfg指定的,一旦編譯後,順序就固定了。
b. .根serverblock雖然指定了health,但是圖中卻沒有,這是因為health插件不參與dns請求的處理。能處理dns請求的插件必須提供如下兩個介面函數。

dns請求處理流程
收到dns請求後,首先根據域名匹配zone找到對應的dnsserver(最長匹配優先),如果沒有匹配到,則使用默認的root dnsserver。
找到dnsserver後,就要按照插件順序執行其中配置的插件,當然並不是配置的插件都會被執行,如果某個插件成功找到記錄,則返回成功,否則根據插件是否配置了fallthrough等來決定是否執行下一個插件。

plugin.cfg
源碼目錄下的plugin.cfg指定了插件執行順序,如果想添加插件,可按格式添加到指定位置。

源碼目錄下的Makefile根據plugin.cfg生成了兩個go文件:zplugin.go和zdirectives.go。

core/dnsserver/zdirectives.go將所有插件名字放在一個數組中。

codedns 主函數

codedns.go 首先導入了包"github.com/coredns/coredns/core/plugin",此包內只有一個文件zplugin.go,此文件為自動生成的,主要導入了所有的插件,執行每個插件的init函數。

接著執行 run.go Run

此文件又引入了包"github.com/coredns/coredns/core/dnsserver",其init函數在 dnsserver/register.go 文件中,如下所示,主要是注冊了serverType

剩下的就是解析參數,解析配置文件後,執行caddy.Start。
這里就是根據配置文件中指定的serverblock,執行插件的setup進行初始化,創建對應的server,開始監聽dns請求

tcp協議調用Serve,udp協議調用ServePacket

收到DNS請求後,調用ServeDNS,根據域名匹配dnsserver,如果沒有匹配不到則使用根dnsserver,然後執行dnsserver中配置的插件

以k8s插件為例

參考
//如何寫coredns插件
http://dockone.io/article/9620

//coredns源碼分析
https://wenku..com/view/.html
https://blog.csdn.net/zhonglinzhang/article/details/99679323
https://www.codercto.com/a/89703.html

//NodeLocal DNSCache
https://www.cnblogs.com/sanzxcvbnm/p/16013560.html
https://blog.csdn.net/xixihahalelehehe/article/details/118894971

② 把一個網站的域名重新解析到另外一個網站上。

  1. 解析域名方法,首先登陸域名解析控制面板,找到「dns解析管理」。

  2. 如想要實現去掉www.的頂級域名亦可訪問網站,除了要在空間里綁定不加www.的域名外,還要解析,主機名為空

  3. 別名記錄,實現通過域名別名到某一個網站,則需要做一個別名解析。

  4. 域名解析已經完成,默認慣例國際域名解析是24小時內生效,國內域名解析2小時內生效。現在也有即時生效的。

③ 寫一個C語言程序: 能修改linux 主機的IP、DHCP、DNS 等設置

可以調用system()函數。把linux系統命令拼成字元串,然後調用system去執行這個字元串就可以了。修改系統配置,需要root身份。
1、system函數:
原型:int
system(const
char
*
command);
功能:執行
dos(windows系統)

shell(Linux/Unix系統)
命令,參數字元串command為命令名;
說明:在windows系統中,system函數直接在控制台調用一個command命令。在Linux/Unix系統中,system函數會調用fork函數產生子進程,由子進程來執行command命令,命令執行完後隨即返回原調用的進程;
頭文件:stdlib.h;
返回值:命令執行成功返回0,執行失敗返回-1。
2、常式:
#include<stdio.h>
#include<stdlib.h>
int main(){
system("del C:\\123.txt");//在控制台中,執行命令del C:\\123.txt,刪除C盤目錄下的123.txt文件
return 0;
}

④ 怎麼看一個網站的源代碼,網頁源代碼怎麼看

查看網站的源代碼/網頁源代碼方法有:
1、進入網站,每個網站的最右上角你會看到「查看」這兩個字,點擊查看,然後再點擊查看最後面的「查看網頁代碼」。
2.滑鼠放在空白的地方,點擊滑鼠右鍵,選擇「查看源代碼」在點擊滑鼠左鍵,就行了。
以上兩種方法都可以查看代碼的,你想用哪一種都行哦。

⑤ 如何將域名解析到某個目錄

1、首先登錄中文站,登錄後點擊導航右上角的「管理賬戶」。

⑥ OkHttp源碼解析 (三)——代理和路由

初看OkHttp源碼,由於對Address、Route、Proxy、ProxySelector、RouteSelector等理解不夠,讀源碼非常吃力,看了幾遍依然對於尋找復用連接、創建連接、連接伺服器、連接代理伺服器、創建隧道連接等邏輯似懂非懂,本篇決定梳理一遍相關的概念及基本原理。

● HTTP/1.1(HTTPS)
● HTTP/2
● SPDY

一個http請求的流程(直連):
1、輸入url及參數;
2、如果是url是域名則解析ip地址,可能對應多個ip,如果沒有指定埠,則用默認埠,http請求用80;
3、創建socket,根據ip和埠連接伺服器(socket內部會完成3次TCP握手);
4、socket成功連接後,發送http報文數據。

一個https請求的流程(直連):
1、輸入url及參數;
2、如果是url是域名則解析ip地址,可能對應多個ip,如果沒有指定埠,則用默認埠,https請求用443;
3、創建socket,根據ip和埠連接伺服器(socket內部會完成3次TCP握手);
4、socket成功連接後進行TLS握手,可通過java標准款提供的SSLSocket完成;
5、握手成功後,發送https報文數據。

1、分類
● HTTP代理:普通代理、隧道代理
● SOCKS代理:SOCKS4、SOCKS5

2、HTTP代理分類及說明
普通代理
HTTP/1.1 協議的第一部分。其代理過程為:
● client 請求 proxy
● proxy 解析請求獲取 origin server 地址
● proxy 向 origin server 轉發請求
● proxy 接收 origin server 的響應
● proxy 向 client 轉發響應
其中proxy獲取目的伺服器地址的標准方法是解析 request line 里的 request-URL。因為proxy需要解析報文,因此普通代理無法適用於https,因為報文都是加密的。

隧道代理
通過 Web 代理伺服器用隧道方式傳輸基於 TCP 的協議。
請求包括兩個階段,一是連接(隧道)建立階段,二是數據通信(請求響應)階段,數據通信是基於 TCP packet ,代理伺服器不會對請求及響應的報文作任何的處理,都是原封不動的轉發,因此可以代理 HTTPS請求和響應。
代理過程為:
● client 向 proxy 發送 CONNET 請求(包含了 origin server 的地址)
● proxy 與 origin server 建立 TCP 連接
● proxy 向 client 發送響應
● client 向 proxy 發送請求,proxy 原封不動向 origin server 轉發請求,請求數據不做任何封裝,為原生 TCP packet.

3、SOCKS代理分類及說明
● SOCKS4:只支持TCP協議(即傳輸控制協議)
● SOCKS5: 既支持TCP協議又支持UDP協議(即用戶數據包協議),還支持各種身份驗證機制、伺服器端域名解析等。
SOCK4能做到的SOCKS5都可得到,但反過來卻不行,比如我們常用的聊天工具QQ在使用代理時就要求用SOCKS5代理,因為它需要使用UDP協議來傳輸數據。

有了上面的基礎知識,下面分析結合源碼分析OkHttp路由相關的邏輯。OkHttp用Address來描述與目標伺服器建立連接的配置信息,但請求輸入的可能是域名,一個域名可能對於多個ip,真正建立連接是其中一個ip,另外,如果設置了代理,客戶端是與代理伺服器建立直接連接,而不是目標伺服器,代理又可能是域名,可能對應多個ip。因此,這里用Route來描述最終選擇的路由,即客戶端與哪個ip建立連接,是代理還是直連。下面對比下Address及Route的屬性,及路由選擇器RouteSelector。

描述與目標伺服器建立連接所需要的配置信息,包括目標主機名、埠、dns,SocketFactory,如果是https請求,包括TLS相關的SSLSocketFactory 、HostnameVerifier 、CertificatePinner,代理伺服器信息Proxy 、ProxySelector 。

Route提供了真正連接伺服器所需要的動態信息,明確需要連接的伺服器IP地址及代理伺服器,一個Address可能會有很多個路由Route供選擇(一個DNS對應對個IP)。

Address和Route都是數據對象,沒有提供操作方法,OkHttp另外定義了RouteSelector來完成選擇的路由的操作。

1、讀取代理配置信息:resetNextProxy()

讀取代理配置:
● 如果有指定代理(不讀取系統配置,在OkHttpClient實例中指定),則只用1個該指定代理;
● 如果沒有指定,則讀取系統配置的,可能有多個。

2、獲取需要嘗試的socket地址(目標伺服器或者代理伺服器):resetNextInetSocketAddress()

結合Address的host和代理,解析要嘗試的套接字地址(ip+埠)列表:
● 直連或者SOCK代理, 則用目標伺服器的主機名和埠,如果是HTTP代理,則用代理伺服器的主機名和埠;
● 如果是SOCK代理,根據目標伺服器主機名和埠號創建未解析的套接字地址,列表只有1個地址;
● 如果是直連或HTTP代理,先DNS解析,得到InetAddress列表(沒有埠),再創建InetSocketAddress列表(帶上埠),InetSocketAddress與InetAddress的區別是前者帶埠信息。

3、獲取路由列表:next()

選擇路由的流程解析:
● 遍歷每個代理對象,可能多個,直連的代理對象為Proxy.DIRECT(實際是沒有中間代理的);
● 對每個代理獲取套接字地址列表;
● 遍歷地址列表,創建Route,判斷Route如果在路由黑名單中,則添加到失敗路由列表,不在黑名單中則添加到待返回的Route列表;
● 如果最後待返回的Route列表為空,即可能所有路由都在黑名單中,實在沒有新路由了,則將失敗的路由集合返回;
● 傳入Route列表創建Selection對象,對象比較簡單,就是一個目標路由集合,及讀取方法。

為了避免不必要的嘗試,OkHttp會把連接失敗的路由加入到黑名單中,由RouteDatabase管理,該類比較簡單,就是一個失敗路由集合。

1、創建Address
Address的創建在RetryAndFollowUpInteceptor里,每次請求會聲明一個新的Address及StreamAllocation對象,而StreamAllocation使用Address創建RouteSelector對象,在連接時RouteSelector確定請求的路由。

每個Requst都會構造一個Address對象,構造好了Address對象只是有了與伺服器連接的配置信息,但沒有確定最終伺服器的ip,也沒有確定連接的路由。

2、創建RouteSelector
在StreamAllocation聲明的同時會聲明路由選擇器RouteSelector,為一次請求尋找路由。

3、選擇可用的路由Route

下面在測試過程跟蹤實例對象來理解,分別測試直連和HTTP代理HTTP2請求路由的選擇過程:
● 直連請求流程
● HTTP代理HTTPS流程
請求url: https://www.jianshu.com/p/63ba15d8877a

1、構造address對象

2、讀取代理配置:resetNextProxy

3、解析目標伺服器套接字地址:resetNextInetSocketAddress

4、選擇Route創建RealConnection

5、確定協議

測試方法:
● 在PC端打開Charles,設置埠,如何設置代理,網上有教程,比較簡單;
● 手機打開WIFI,選擇連接的WIFI修改網路,在高級選項中設置中指定了代理伺服器,ip為PC的ip,埠是Charles剛設置的埠;
● OkHttpClient不指定代理,發起請求。

1、構造address對象

2、讀取代理配置:resetNextProxy

3、解析目標伺服器套接字地址:resetNextInetSocketAddress

4、選擇Route創建RealConnection

5、創建隧道
由於是代理https請求,需要用到隧道代理。

從圖可以看出,建立隧道其實是發送CONNECT請求,header包括欄位Proxy-Connection,目標主機名,請求內容類似:

6、確定協議,SSL握手

1、代理可分為HTTP代理和SOCK代理;
2、HTTP代理又分為普通代理和隧道代理;普通代理適合明文傳輸,即http請求;隧道代理僅轉發TCP包,適合加密傳輸,即https/http2;
3、SOCK代理又分為SOCK4和SOCK5,區別是後者支持UDP傳輸,適合代理聊天工具如QQ;
4、沒有設置代理(OkHttpClient沒有指定同時系統也沒有設置),客戶端直接與目標伺服器建立TCP連接;
5、設置了代理,代理http請求時,客戶端與代理伺服器建立TCP連接,如果代理伺服器是域名,則解釋代理伺服器域名,而目標伺服器的域名由代理伺服器解析;
6、設置了代理,代理https/http2請求時,客戶端與代理伺服器建立TCP連接,發送CONNECT請求與代理伺服器建立隧道,並進行SSL握手,代理伺服器不解析數據,僅轉發TCP數據包。

如何正確使用 HTTP proxy
OkHttp3中的代理與路由
HTTP 代理原理及實現(一)

⑦ 如何將域名解析到指定伺服器

首先購買域名,伺服器/虛擬主機

1、打開網路搜索域名主機->選擇一個你知道喜歡的服務商網站->輸入想要的域名->購買->注冊->登陸->購買->充值->付款-->購買成功->選擇虛擬主機->購買->付款->購買成功

2、打開管理中心->在選擇備案->提交備案資料->等待備案審核通過/海外主機不需要備案

3、打開管理中心->域名管理->解析域名->如果是伺服器ip地址,使用A記錄值解析!如果是虛擬主機->一般使用C記錄解析

主機名前綴一般填寫www,如果是論壇可以寫bbs.虛擬主機一般使用CNAME記錄解析對應值可以查看虛擬主機控制面板查看解析記錄值!等待解析時間為5-30分鍾

伺服器同理一般使用A記錄解析,對應值寫入ip地址!等待解析時間為5-30分鍾

4、上傳網站源碼文件->打開網站測試是否成功

如果遇到困難咨詢服務商!

可以參考網路經驗:http://jingyan..com/article/676629973f96f454d51b849b.html

圖片教程以西數為例子:

⑧ Linux命令行模式下查詢DNS包括NS記錄利器dig命令詳解

Dig簡介:
Dig是一個在類Unix命令行模式下查詢DNS包括NS記錄,A記錄,MX記錄等相關信息的工具 。由於一直缺失
Dig man page文檔,本文就權當一個dig使用向導吧。
Dig的源碼是ISC BIND大包的一部分,但是大多編譯和安裝Bind的文檔都不把它包括在內,但是在linux系
統下,它通常是某個包的一部分,在Gentoo下是bind-tools,在Redhat/Fedora下是 bind-utils,或者在
Debian下是 dnsutils。
如果你要查找Bind的配置相關的信息,你參考我的文章:Bind for the mall LAN
( http://www.madboa.com/geek/soho-bind/ )。
看懂默認輸出:
最簡單最常見的查詢是查詢一台主機,但是默認情況下,Dig的輸出信息很詳細。你可能不需要所有的輸出,
但是它確實值得知道。

=====================================================================

下面是一個帶有注釋的查詢:
$ dig www.isc.org

上面是我調用dig 的命令行。
; DiG 9.2.3 www.isc.org
;; global options: printcmd
Dig的部分輸出告訴我們一些有關於它的版本信息(version 9.2.3)和全局的設置選項,如果+nocmd在命令行下
是第一個參數的話,那麼這部分輸出可以通過加+nocmd的方式查詢出來。
;; Got answer:
;; ->>HEADER

⑨ 在linux操作系統中,採用 什麼來搭建dns伺服器

linux下是一個叫bind的軟體,用來搭建dns伺服器

⑩ RouterOS aliyun 實現DDNS動態解析

本文主要講解如何藉助阿里雲aliyun的雲解析API介面來實現RouterOS(以下簡稱ROS)的DDNS動態解析。

一、創建訪問控制RAM的AccessKey

我這邊簡單的講講如何申請開通:

1、阿里雲網站 --> 產品 --> 安全 --> 應用身份服務 ,這個就是控制API ,用戶管理,新建用戶,填寫用戶名和勾上「為該用戶自動生成AccessKey」,保存好這個accesskey。

2、策略管理 --> 自定義授權策略,新建授權策略,選擇空白模版,授權策略名稱隨便填(如alidns),策略內容為下面的內容(修改下面內容中的域名為你自己要做DDNS的域名)

action是api的介面,只接受AddDomainRecord(增加域名解析),DescribeDomainRecords(輸出域名解析列表)和UpdateDomainRecord(修改域名解析記錄)

Resource是指被授權的具體對象,這邊domain/myxzy.com需要修改成你自己的域名domain/xxx.com。這樣就是授權對象是該域名

3、授權--新增授權--添加許可權—在授權主體,對上面創建的用戶,點擊授權,選擇剛才自定義創建的策略,確定。

二、php製作aliyun API動態解析介面

以下是我製作好的php解析介面

介面地址:

HTTP請求方式:

請求參數:

示例:

「0」代表解析修改成功或者是當前解析記錄ip相同

「1」代表AccessKey報錯(這個阿里雲我這邊經常出現,刷新就可以正常)

「2」代表沒有設置參數

1、本介面未記錄所有的解析AccessKey和解析記錄,但是伺服器的訪問日誌會有鏈接記錄(按照政策要求需保存6個月的日誌)。雖然有日誌但是本介面不提供任何查詢。

2、強烈建議按照步驟一設置授權許可權。

3、由於使用本介面出現的任何安全問題,本人概不負責。這邊只能保證本人不會去做任何後門行為。這邊建議勤換AccessKey

id、secret、domain、record、pppoe修改成自己的。定時1分鍾運行就好。

腳本說明:獲取pppoe撥號ip,然後判斷和記錄解析ip是否相同,不同開始訪問我的php解析腳本,解析腳本就判斷參數執行,返回0或1或2,如果是0更新記錄的alidns解析ip,其他的不記錄。

四、alidns-api-php腳本源碼

Github: https://github.com/myxzy/alidns-api-php

閱讀全文

與dns源碼解析相關的資料

熱點內容
程序員的職業發展前途 瀏覽:620
安卓是世界上多少個程序員開發 瀏覽:43
解壓器官方免費 瀏覽:85
單片機p10開發 瀏覽:486
做什麼app賺錢 瀏覽:83
博途編譯失敗聯系客戶支持部門 瀏覽:928
金蝶旗艦版編譯 瀏覽:51
萬象伺服器斷電後啟動不了怎麼辦 瀏覽:356
我的世界蘋果版的2b2t伺服器地址咋查 瀏覽:95
xlsx轉換pdf 瀏覽:98
3dmax擠出命令英語 瀏覽:903
靶心率的定義和演算法 瀏覽:514
3d模術師app哪裡下載 瀏覽:474
php中文api文檔 瀏覽:458
安卓設計怎麼加入輸入框 瀏覽:185
主根伺服器什麼時候開始 瀏覽:738
奇門遁甲完整版pdf 瀏覽:904
app軟體怎麼用的 瀏覽:804
電子書pdf購買 瀏覽:195
浪潮伺服器如何做系統 瀏覽:113