在DNS中,泛域名(wildcard Resource Record)可以被认为是一种合成RR的机制,借助于它,DNS服务器可以响应本来不存在的域名的请求,它的设计初衷是用来把所有邮件都转发到一个邮件系统(当然,它除了用在MX类型的资源记录上外,还可以用在其他的资源记录上)。

泛域名

一个典型的泛域名的格式是:

*.taobao.com 300 IN A 10.20.30.40

其中:

  • *号必须是位于最左端的DNS Lable,任何其他位置的'*'都不会被认为是泛域名,例如*taobao.com,shop.*.taobao.com以及*.*.taobao.com都不会被认为是泛域名
  • anydomain是任何域名,但是anydomain不能包含*,同时它必须属于一个本域名服务器所服务的zone

上面的泛域名配置会使得对所有请求域名中以taobao.com结尾的A记录请求都返回10.20.30.40

需要注意的是:泛域名只匹配不存在的域名,如果这个域名存在,但是它的资源类型与请求资源类型不匹配,那么请求域名不会被再次做泛域名匹配

泛域名的匹配原则

为了清楚地解释泛域名的匹配原则,RFC4592中引入了Closest Encloser 和 Source of Synthesis的概念:

  1. Closest Encloser

    Closest Encloser是zone中所有domain所组成的树中,与请求域名匹配了最多lable数的那个节点。所以Closest Encloser是zone中已经存在的一个domain,而且这个domain与请求的域名具有最长公共后缀(这个最长不是指字符串的长度,而是lable的个数)。
  2. Source of Synthesis

    Source of Synthesis是zone中所有domain所组成的树中,Closest Encloser的含有字符*的最亲子树(如果有的话),即:*.[Closest Encloser]

    Source of Synthesis不能保证能生成请求RR类型的结果,也就是说source of synthesis中可能没有资源记录,也可能没有请求所需要的资源记录

如果在域名匹配的过程中,source of synthesis为空,则没有与之匹配的泛域名

泛域名举例

(借用RFC4592中的例子来说明泛域名的匹配原则)

假设有一个DNS zone有如下的资源记录:

      $ORIGIN example.
example. 3600 IN SOA <SOA RDATA>
example. 3600 NS ns.example.com.
example. 3600 NS ns.example.net.
*.example. 3600 TXT "this is a wildcard"
*.example. 3600 MX 10 host1.example.
sub.*.example. 3600 TXT "this is not a wildcard"
host1.example. 3600 A 192.0.2.1
_ssh.tcp.host1.example. 3600 SRV <SRV RDATA>
_ssh.tcp.host2.example. 3600 SRV <SRV RDATA>
subdel.example. 3600 NS ns.example.com.
subdel.example. 3600 NS ns.example.net.

这个zone中domain的树结构如下:

下面是一些请求域名和它对应的Closest Encloser和Source of synthesis:

     QNAME                      Closest Encloser    Source of Synthesis
host3.example. example. *.example.
_telnet._tcp.host1.example. _tcp.host1.example. no source
_dns._udp.host2.example. host2.example. no source
_telnet._tcp.host3.example. example. *.example.
_chat._udp.host3.example. example. *.example.
foobar.*.example. *.example. no source

下面是一些请求和其结果:

  1. host3.example. MX

    它有对应的source of synthesis--*.example,所以这个域名请求的结果是

    host3.example. IN MX 10.host1.example

  2. host3.example. A

    它有对应的source of synthesis--*.example,但是对应的泛域名*.example中没有A记录,所以它的响应结果是:

    no error,answer为空

  3. foo.bar.example. TXT

    它对应的source of synthesis--*.example,并且泛域名*.example中有TXT记录,所以它的响应结果是:

    foo.bar.example. IN TXT "this is a wildcard"

  4. host1.example. MX

    它匹配到了域名host1.example,但是host1.example中没有MX记录,所以它的响应结果是:

    no-error, no data

  5. sub.*.example. MX

    这种带*的域名,只会把*当作一个普通字符去匹配,所以它的响应结果是:

    no-error, no data

  6. _telnet.tcp.host1.example SRV

    它对应的closest encloser是tcp.host1.example,所以它匹配不到泛域名,响应结果为空

  7. host.subdel.example. A

    因为subdel.example是属于另外一个zone,根据rfc1034的4.3.2的step2-b,遇到本域名服务器服务的domain请求,则将跟这个domain相关的zone的信息添加到authority section中并返回

  8. ghost.*.example. MX

    不会匹配到泛域名*.example,因为泛域名的匹配是lable by lable的,所以ghost.*.example的Closest Encloser是*.example,而*.example下面没有最近的泛域名子树(带*的子树),所以ghost.*.example的Source of Synthesis空,所以匹配不到泛域名。从上面可以看出,并不是说*.example能匹配所有以example结尾的域名请求,它不能匹配*.example的subdomain

SRV中的泛域名

SRV的格式是:

 _Service._Proto.Name TTL Class SRV Priority Weight Port Target

如果把_Service和_Proto去掉,那么Name是一个正常的域名。SRV的泛域名也遵守上面提到的泛域名匹配规则。 例如有如下的SRV配置:

_foo._udp.*.example. 10800 IN SRV 0 1 9 old-slow-box.example.

根据SRV的定义,上面的域名_foo._udp.*.example.不是一个泛域名,它只是一个普通的域名,*在此处被当作一个普通的字符处理。

假如有一个对_foo._udp.xx.example.的SRV查询,它只会查询到‘.example.’,而不会匹配到上面配置的SRV。如果‘.example.’没有对应的SRV资源记录,则返回空结果。

参考文献

  1. RFC1034
  2. RFC4592
  3. 维基百科

DNS Wildcard(DNS泛域名)的更多相关文章

  1. Let’s Encrypt Wildcard 免费泛域名SSL证书获取安装

    2018 年 1 月Let’s Encrypt CA 宣布免费提供通配符证书(Wildcard certificate).通配符证书是一种可被多个子域使用的公钥证书.这意味着,单个证书可用于提供多台服 ...

  2. 泛域名Wildcard Domain

    泛域名Wildcard Domain 泛域名Wildcard Domain是一种特殊的域名形式.它使用星号作为域名的一级.例如,*.baidu.com就是使用星号作为域名的二级部分.在域名解析中,一个 ...

  3. 解释-DNS,A记录,CNAME记录,域名转向,SRV记录,TTL值,泛域名与泛解析,域名绑定

    http://www.lihongye.net/post/dns.html DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务).域名 ...

  4. Linux的DNS实现负载均衡及泛域名部署

    DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到 ...

  5. DNS服务——智能域名解析、镜像Web站点、直接域名泛域名

    智能域名解析 智能域名解析只有Linux DNS服务器才有.下面给出2种智能域名解析应用场景. 应用场景1 整个互联网由众多ISP组成,在中国就是联通.电信.移动等等 各家ISP内部网络四通八达,速度 ...

  6. 安装简易OpenShift单节点并配置DNS泛域名

    1 楔子 公司有个项目部署在 OpenShift 容器云平台上,出现问题较多,于是萌生在公司环境搭建现场仿真环境,由于资源没有生产环境多,就使用单节点简单模拟下 本文主要内容包括以下: 使用 Dnsm ...

  7. DNS解析过程和域名收敛、域名发散、SPDY应用

    前段时间项目要做域名收敛,糊里糊涂的完成了,好多原理不清晰,现在整理搜集下知识点. 域名收敛的目的是什么?简单来说就是域名解析慢.那为什么解析慢?且听下文慢慢道来. 什么是DNS? DNS( Doma ...

  8. 域名dns查询_查询域名dns ip地址

    最近有部分用户反应管理的天气网站打开偏慢,决定从每一个可以出现的问题点查起!首先就是dns! 通过360dns监控对比发现,同一组域名,15tianqi.cn的dns响应时间比较长,在300-700间 ...

  9. DNS与DNS劫持原理、IP、域名、服务器访问浅讲

    我们都知道,平常我们所访问的网站,都是与服务器进行数据交互的.但是,浏览器和服务器是分处于不同的计算机上的,那他们是怎样进行通信的呢?今天,我们就来粗浅地聊一聊.不涉及很深的技术原理,只讲大概的流程. ...

随机推荐

  1. Linux学习小记(1)

    学习Linux,进行阶段性总结,权当笔记方便日后翻阅和查看. 在此特别推荐peida的博客,他的有关Linux的理解个人感觉深入浅出,很适合入门的小白来理解和学习. 说一说针对IP的修改,ifconf ...

  2. 20165213Java第二次实验

    实验二Java面向对象程序设计 实验1 实验目的与要求: 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 提交 ...

  3. java中date日期格式的各种转换

    示例 Date dt =new Date(); System.out.println(dt); //格式: Wed Jul 06 09:28:19 CST 2016 //格式:2016-7-6 Str ...

  4. Netsharp平台工具常见问题(FAQ)

    1. 请问EntityId如何填? 回答:Netsharp中EntityId是经常需要输入的一个字段,因为Netsharp工具一般的源头是实体元数据,也就是一般常说的所谓模型驱动.所以很多工具都需要E ...

  5. C# 多线程编程,传参,接受返回值

    C# 多线程编程,传参,接受返回值 今天将多线程的知识有回顾了下,总结了几点: 新建一个线程(无参数,无返回值) Thread th = new Thread(new ThreadStart(Prin ...

  6. sshpass 使用方法

    首先下载sshpass并且安装 $ tar -zxvf sshpass-1.06.tar.gz $ cd sshpass-1.06 $ ./configure --prefix=/usr/local/ ...

  7. 可遇不可求的Question之MySQL系统变量interactive_timeout 与 wait_timeout 篇

    mysql>show variables like '%timeout'; 打印结果如下: +----------------------------+-------+ | Variable_n ...

  8. 实现一个简单的C++协程库

    之前看协程相关的东西时,曾一念而过想着怎么自己来实现一个给 C++ 用,但在保存现场恢复现场之类的细节上被自己的想法吓住,也没有深入去研究,后面一丢开就忘了.近来微博上看人在讨论怎么实现一个 user ...

  9. Bootstrap框架的基本使用

    Bootstrap是什么 简介 就是已经写好的一个html和css的样式组合 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应 ...

  10. Android Fragment用法知识点的讲解

    Android Fragment用法的讲解 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示.Fragment的出现,如微信的额主界面包含多个Fragment,使得微信功能更加简洁明了 ...