zoukankan      html  css  js  c++  java
  • 【DNS】简单聊聊DNS如何工作

    随便聊聊

    我们知道,网络上传输的数据包是一层一层的包起来的,典型的是mac地址层,ip层,tcp/udp层,应用层数据 这么几个层,那用户在浏览器中打开www.baidu.com数据包如何传到baidu的后端服务器呢?我们这个数据包没有ip层的目标ip啊,http请求怎么知道往哪里发?这个时候,dns系统就介入了,dns系统首先会把这个www.baidu.com的ip地址给找出来! dns系统主要是依靠权威dns,和递归dns来工作的,那权威dns和递归dns都是干嘛的呢?

    权威dns(Authority dns)

    首先我们来聊一聊权威dns。 权威dns做的事情主要是管理某个或多个特定域的dns服务。一般大一点的公司,都有自己的权威dns

    比如所有”.alipay.com”结尾的域名都由alipay来管理所有”.alibaba.com”结尾的域名都由alibaba来管理(alipay和alibaba实际又是同一家公司来管理)所有“.baidu.com”结尾的域名都由baidu来管理alibaba和baidu各管各的,没有交互。<>那整个域名系统,如何跑起来的呢,不然你说你管理alibaba.com的所有域名,我说我也管理alibaba.com的所有域名,不就乱套了么。

    光说是没有用的,必须要到相关注册局机构去注册。

    1. 最上面是根域。
    2. 一级域要去根上注册,像com域,net域就属于一级域
      • Com域(也就是所有以“.com”结尾的老祖com域)要去根上注册com域的域名服务器(nameserver)列表。
      • Net域(也就是所有以”.net”结尾的老祖net域)要去根上注册net域的域名服务器(nameserver)列表。
    3. 二级域一般要到一级域上去注册
      • alibaba.com要到com域去注册自己的域名服务器nameserver列表
      • baidu.com也要到com域去注册自己的域名服务器nameserver列表

    那你说a.b.c这个域名的一级域是谁,当然是“c”了,但是c域就没有在根上面去注册,所以这个域名是个无效的域名。 这样的一些实际管理域名系统的dns都是权威dns就这样一级一级的注册。

    整个域名系统就连起来了,就变成了这么个东西

    所以dns叫做分布式的域名系统,分布在世界上面的各个管理域名的公司或机构,有些情况用户只想简单的把自己的ip转化为某个域名,而不想管理整个域,那这个时候他就可以去买域名,有些公司是专门卖域名的。比如alibaba.com完全可以卖任何以“.alibaba.com”结尾的域名,只是alibaba.com不会这么干,这样做一些钓鱼网站来挂自己的网站,也以alibaba.com结尾的话,用户不就很容易被钓鱼了么,比如我支付宝付款的时候我只看跳转后的域名是否是以alipay.com结尾的,如果不是我就不敢付款)

    递归DNS(Recursion DNS)

    那用户访问www.alibaba.com,请求又是如何到alibaba的权威dns服务器上面找到www.alibaba.com的ip呢?

    这个时候递归dns(我们一般叫做local dns)就介入了。

    用户首先要直接配置自己的dns服务器,一般你拨号上网,或者在公司里面上网,我们windows系统都已经预想配置好了递归dns服务器的ip地址,当然自己也可以修改

    RHEL Linux系统是/etc/resolv.conf配置文件来配置。

    一个用户访问www.alibaba.com的过程如下(可放大图片观察)

    其中有几点补充

    1. 递归dns也就是我们常说的缓存dns,local dns,公共dns(提供专门递归服务的dns),这样一步步的从根“.”到"com",再到“alibaba.com”,最后到“www.alibaba.com”的过程叫做递归过程
    2. Dns请求一般是udp报文(也可以是tcp的报文),所以同样也是要有源ip,目标ip,等等这些网络数据包的底层信息,递归过程的每一步,目标ip都必须是很明确的
    3. 各个域的namserver实际上是有多台的,比如根的namserver的ip有13个,com的namserver的ip也有13个,递归dns在进行递归时需要选择其中一个ip作为目标ip进行下一步请求即可(目前主流dns实现软件,如bind会选择延时最小的那个ip作为下一步请求的目标ip)
    4. 大家不用担心根域,或者com域就那么几个ip,能不能接受的了全球的dns请求能不能抗的住的问题。这只是个目标ip,基于ip的负载均衡技术多的很,dns中用的多的是anycast技术,一个ip实际上对了很多个物理服务器,到各个权威nameserver上,也有lvs,ospf等等一些负载均衡技术把同一个ip对应到多个物理服务器上面。
    5. 递归dns还会把图中递归第一步,第二步,第三步向各级权威dns发起的请求结果给缓存到自己的内存中,直到这条结果的ttl超期失效(超期时间一般为几分钟到几小时几天等等),在这个ttl超期之前,任何其他用户发起的www.alibaba.com的dns请求,递归dns都会直接从自己的内存中把缓存结果直接返回给客户端(不会去递归了)。如果ttl超期了,才会去重新递归。
    6. 有的dns既是权威dns,又是递归dns,这并不冲突,这种dns在遇到域名是自己管理的域的后缀结尾时,会直接进行应答(无论是否存在结果),如果不是自己管理的域的后缀域名,则进行递归,同样吧递归结果进行缓存。

    聊聊dns攻击

    我们顺便聊聊dns攻击问题,典型的有拒绝服务攻击,dns劫持等。

    1. 拒绝服务攻击这种是对各种应用(不止是dns应用)都很常见的攻击,大家也都知道,我们构造数据包直接调用驱动,或者使用现成的pktgen改吧改吧,或者用dpdk,或者干脆多一点肉机,随意伪造源ip,dns请求(或者什么http请求,arp请求等等),一秒钟打出几百万或者几千万个包打出很大流量的请求来,不是什么难的事情(不是所有公司的系统都有很强的防攻击措施),而带宽就这么大,硬件的能力也好操作系统的能力也好就这么大,正常的客户请求就进不来而无法服务了,从而达到了攻击。
    2. Dns劫持攻击也有,伪造dns响应是很简单的,或者直接在上级dns上面配置泛域名,但是容易被发现,但是即使容易被发现,一旦进行了劫持,后果也是不堪设想的,比如前段时间根被劫持了,我们从上图的递归dns向各级权威dns询问www.alibaba.com的ip是多少,根的nameserver或者com的nameserver本来是不应该直接告诉递归dns www.alibaba.com的ip到底是多少的,必须要到alibaba.com的权威dns才能得到最终结果,可是根却在第一步递归过程中,就告诉递归dns我知道www.alibaba.com的ip(当时好像是任何域名请求到根的namserver,根的namserver都直接给返回了同一个错误的ip),是y.y.y.y(一个错误的ip)了,这样最后产生http请求的时候,目标ip就完全不对了,而由于各个递归dns ttl超期之后都会先从根递归,这样所有域名就都被劫持了,整个互联网也就崩溃了。
    3. 另外泛域名这种,举个简单的例子,如果我是根的namserver,我配置一个泛域名 ,让其ip为1.1.1.1,那么所有到根进行查询的任何域名查询,都会得到直接响应说ip是1.1.1.1,那打开任何网页,数据包的目标ip就都是1.1.1.1了,不堪设想。小点来说如果我是com的namserver,配置一个泛域名,.com,那所有以”.com”结尾的域名也都不堪设想了,根本走不到各个公司去做dns查询这一步。

    如有错误,欢迎指正。

  • 相关阅读:
    Mybatis动态SQL
    自己动手写一个持久层框架
    最长公共子串算法(Longest Common Substring)
    【SpringCloud】08.客户端负载均衡器:Ribbon
    ESP32 (idf-esp-v4.1)重新生成nvs分区
    IDEA导入新的springboot项目出错
    springboot集成mybatis出现问题/连接数据库出错
    Java学习周记2
    2020.8.6_Java学习日记
    9.23笔试总结
  • 原文地址:https://www.cnblogs.com/zhiqian-ali/p/6046047.html
Copyright © 2011-2022 走看看