article icon indicating copy to clipboard operation
article copied to clipboard

DNS原理与动态DNS

Open ICKelin opened this issue 6 years ago • 0 comments

DNS是非常常用的网络基础设施软件,但是如果不是做软件开发的,很多人都接触不到,很多做应用开发的,可能接触DNS服务器的机会也不多,但是不管怎样,DNS是非常非常非常重要的网络基础软件。

这篇文章记录了对DNS的一些基本理解以及在notr内网穿透当中使用到的非常重要的动态域名解析这一功能。

DNS解决什么问题

需要明确的一点,互联网上的通信寻址是通过ip地址来寻址的,打个比方,如果从你的电脑上ping 1.1.1.1,首先判断1.1.1.1是否和你处于同一个子网,如果属于同一个子网,则按照内网通信的基本流程,先进行ARP广播,查找ip地址为1.1.1.1的mac地址,然后通过mac地址进行通信,如果不属于同一个子网,则也要先进行arp广播,不过查找的是网关ip地址的mac地址,将数据包发给网关,网关匹配路由之后,继续转发给他的上一级路由,依次迭代,直到到达1.1.1.1所在的机器。

如果纯粹使用ip地址通信,通信是没问题的,但是互联网发展太快了,五六年前的规模和现在完全一个层面,五六年前,我还在学jsp,学MFC,现在MFC也叫没饭吃,设计互联网的人很早就想到了这点,ip地址太难记了,要记住所有网站的ip地址显然是不可能的,所以他们设计了域名系统,在ip地址与域名之间构建一个映射关系,通过域名关联到ip地址,然后用户只需要记住域名即可,记住www.notr.tech总比记住120.25.214.63要容易得多。但是这又会产生一个问题,用户每次访问www.notr.tech的时候,都需要先通过互联网获取到www.notr.tech的ip地址,每个域名相对直接使用ip而言,都多了一步域名解析的步骤。于是为了加速域名解析的过程,DNS服务器都会设置有高速缓存,不仅如此,每台电脑针对域名查询,也做了高速缓存,不仅如此,有的浏览器内部也做了域名高速缓存。所以就有了如果某浏览器是带有dns缓存功能的,访问一个网站时,首先从自身的缓存看有没有记录,如果有,直接用,如果没有,看系统DNS缓存是否有记录,如果有,直接用,如果没有,发起DNS查询,如果刚好你的网关配备有DNS服务器,而且dhcp服务器给你电脑下发的DNS就是你的网关地址,那么你的网关先从自身缓存查,依次迭代下去,所以,DNS缓存提高了域名解析的效率。

DNS基本流程

DNS采用UDP协议进行交互,交互可以归纳为下面的流程

image

这里将DHCP也纳入其中,DHCP跟DNS的关系仅仅是:PC启动的时候会发送DHCP请求广播,DHCP服务器收到这一广播之后会响应,会告诉PC,你可以使用a.b.c.d这个ip,网关地址是a.b.c.1,DNS地址为1.1.1.1之类的信息。这个很重要,可以通过DHCP控制所有用户电脑的网关和DNS,也就是说可以将下发的网关和DNS指向它自身,然后所有流量和域名查询都经过它。

dns服务器本地无缓存时,会不断迭代同一个过程,以yingjiu.notr.tech为例先找到根服务器,询问是否有yingjiu.notr.tech的ip地址,根服务器响应没有,但是你可以到ns1.china.com去查询,ns1.china.com的ip地址是xxxxx。于是本地dns服务器向ns1.china.com进行域名解析,ns1.china.com发现本地也没有相关的A记录,但是有个ns记录,记录值为ns.notr.tech,于是ns1.china.com响应给本地dns服务器,告诉它,我没有相关记录,但是我知道谁可以解决你这个问题,你可以到ns.notr.tech进行解析,ns.notr.tech查本地记录,发现有对应的记录值,于是响应该记录值,本地DNS服务器拿到域名解析的结果之后,响应给pc,最终完成域名解析。

DNS服务器实现有许多细节,但是如果业务需求不复杂,可以考虑从以下两个角度进行简化

  • 只实现A,AAAA,以及NS记录
  • 只实现dns代理,域名解析交给上游,只需要知道,上游返回的结果肯定是可以返回给pc的。

动态DNS

以下内容摘自百度百科:

动态域名解析服务,是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候,客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务程序负责提供DNS服务并实现动态域名解析。就是说DDNS捕获用户每次变化的IP地址,然后将其与域名相对应,这样域名就可以始终解析到非固定IP的服务器上,互联网用户通过本地的域名服务器获得网站域名的IP地址,从而可以访问网站的服务。

简单理解动态DNS即为:当DNS具备能够动态添加,删除,修改某个域名记录之时,就具备动态DNS的基本能力。

打个比方:你在使用某个动态DNS服务,你配置家庭出口路由器映射的ip地址映射到router.home.me,但是家庭路由器每次启动时ip地址可能会发生修改,原因是运营商之前下发的ip地址可能被分配给其他用户,所以这时候如果DNS不具备修改的能力,那么访问router.home.me解析到的ip地址即为其他客户的ip地址,这时候就需要DNS能够提供一个接口让家庭路由器感知到ip地址发生了改变,将router.home.me的值进行相对应的调整。也就是做router.home.me这个域名的修改操作。

所以在无固定ip地址的情况下,采用动态DNS具备一定的用处,这里介绍我动态DNS的使用场景:

Notr是一款内网穿透服务,其中动态DNS占了非常大的作用,客户端每次分配的域名是固定的,但是域名映射关系每次都是不固定的,因为我内部需要根据当前各个节点的使用情况与负载进行动态调整,选出一个节点为该客户端提供内网映射的接入口。具体可以参考Notr时序图NotrController与NotrNs交互

image

ICKelin avatar Jul 12 '18 12:07 ICKelin