Skip to content

DNS原理与动态DNS #11

Description

@ICKelin

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions