Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1658898
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类: 系统运维

2014-03-12 09:58:22

随便聊聊

 我们知道,网络上传输的数据包是一层一层的包起来的

(典型的是mac地址层,ip层,tcp/udp层,应用层数据 这么几个层)

那用户在浏览器中打开的后端服务器呢?

我们这个数据包没有ip层的目标ip啊,http请求怎么知道往哪里发?

这个时候,dns系统就介入了,dns系统首先会把这个地址给找出来!

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)列表。

….

那你说a.b.c这个域名的一级域是谁,当然是“c”了,但是c域就没有在根上面去注册,所以这个域名是个无效的域名。

(3)      二级域一般要到一级域上去注册

alibaba.com要到com域去注册自己的域名服务器nameserver列表

Baidu.com也要到com域去注册自己的域名服务器nameserver列表

 

这样的一些实际管理域名系统的dns都是权威dns

就这样一级一级的注册。整个域名系统就连起来了,就变成了这么个东西

alt

所以dns叫做分布式的域名系统,分布在世界上面的各个管理域名的公司或机构

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

递归DNS(Recursion DNS)

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

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

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

alt

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

 

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

alt

 

其中有几点补充

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

聊聊dns攻击

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

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

如有错误,欢迎指正。

阅读(1809) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~