导航:首页 > 源码编译 > 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源码解析相关的资料

热点内容
u盘内容全部显示为压缩包 浏览:517
编译固件时使用00优化 浏览:356
速借白条app怎么样 浏览:756
用纸张做的解压东西教程 浏览:12
求圆的周长最快算法 浏览:190
安卓热点怎么减少流量 浏览:270
北京代交社保用什么app 浏览:855
第一眼解压视频 浏览:726
文件夹err是什么 浏览:97
qt4编程pdf 浏览:572
局域网服务器下如何连续看照片 浏览:254
经过加密的数字摘要 浏览:646
加密锁9000变打印机 浏览:694
程序员的职业发展前途 浏览:639
安卓是世界上多少个程序员开发 浏览:45
解压器官方免费 浏览:85
单片机p10开发 浏览:487
做什么app赚钱 浏览:85
博途编译失败联系客户支持部门 浏览:929
金蝶旗舰版编译 浏览:53