当前位置: 首页 > 编程日记 > 正文

如何突破DNS报文的512字节限制

DNS协议大家都应该很熟悉,最近有同学问到如何获得UDP承载的超过512字节的DNS报文,借此机会,我们一起了解下DNS协议与报文长度有关的一些细节。


本文将讨论的是DNS协议在UDP承载时超过512字节的这一细节。
在之前的文章里,对DNS协议进行了介绍:

使用Wireshark进行DNS协议解析

Windows下的DNS命令用法


看完这两篇文章,大家应该对DNS协议有一些初步的了解。对DNS协议而言,在IETF网站上,能够很容易地获取到相关的RFC文档及扩展信息。


在大部分讲解DNS协议的文章里,都会这样描述DNS协议的特性:

当封装的DNS响应的长度超过512字节时,协议应采用TCP传输,而不是UDP。


根据协议标准文档RFC1035,这当然是对的,实际使用DNS协议的过程中,抓取的报文也确实是这样的,但是,不要忘记这份RFC文档产生于三十年前,这么多年,随着网络环境的变化,协议是会发展的,大家想想,网络上是不是到处都是超过512字节的UDP数据呀,那超过512字节的UDP DNS又有何不可?


RFC 6891这份标准文档,对DNS进行了扩展,描述了超过512字节的DNS的情况,即EDNS0。


本文将首先描述DNS协议的长度限制情况,然后对EDNS0进行说明,接着用示例说明DNS工具在超过512字节时的通常情况,最后将介绍如何方便地产生超过512字节的UDP承载的DNS报文。大家可以根据需要,跳到对应章节查阅。



01

DNS的512字节限制


根据协议标准,DNS协议同时占用UDP和TCP的53端口,这是为什么呢?


翻阅DNS资料,可以发现,DNS协议默认按UDP传输,为优化传输性能,DNS协议有一个512字节的限制,当数据长度超过了512字节时,DNS协议会改用TCP进行传输。


DNS协议从UDP切换到TCP的过程如下:

1、客户端向服务器发起UDP DNS请求;

2、如果服务器发现DNS响应数据超过512字节,则返回UDP DNS响应中置truncated位,告知客户端改用TCP进行重新请求;

3、客户端向服务器发起TCP DNS请求;

4、服务器返回TCP DNS响应。


那为什么限制是512字节呢?


一个说法是:IPV4标准规定了各个主机必须能够重组576字节或更少字节的数据包。具有512字节内容的DNS报文加上IP头和UDP头,将小于576字节。


02

EDNS0


EDNS0:即Extension Mechanisms for DNS (EDNS(0)),详细情况可参考RFC 6891这份文档。


EDNS0是随着网络的发展,在DNS消息格式和它支持的消息内容已不足以满足一些DNS服务器的需求的情况下被提出的,它用于传递包大小,扩展了DNS协议。


EDNS0是在遵循已有的DNS消息格式的基础上增加一些字段,来支持更多的DNS请求业务。当然,具备向后兼容性,未支持EDNS0的旧的DNS服务器仍然能够很好地处理EDNS0。


EDNS0特征如下:

扩展DNS使用UDP传输时的最大报文限制,可以超过512字节 

扩展RCODE,由4为增加到12位 

建议利用域名标签类型的剩余两个


我们在这里关注的是ENDS0突破DNS 512字节限制的能力。


DNS协议在发起请求时,通过在Additional部分增加OPT RR字段,告知服务器能处理的最大UDP报文长度,当服务器准备进行回应时,如果响应数据大于该值,则在DNS协议中置truncated位,否则,可发送小于该值大小的报文。这相当于突破了512字节的长度限制。


在ENDS0标准文档中,很容易找到OPT RR字段的格式:

640?wx_fmt=png


各字段如下:

NAME:目前为空

TYPE:OPT RR的类型编号,41

CLASS:最大UDP报文长度

TTL:扩展的DNS消息头部

RDLEN:紧接着的RDATA的长度

RDATA:可变部分数据。


RDATA格式如下:

640?wx_fmt=png

说明如下:

OPTION-CODE:由IANA分配

OPTION-LENGTH:OPTION-DATA的长度

OPTION-DATA:具体内容


而TTL则是用来存储扩展消息头部中的RCODE和flags,格式如下:

640?wx_fmt=png

说明如下:

EXTENDED-RCODE:扩展RCODE(返回状态码),这8个bit加上DNS头部的4bit总共有12bit(8bit在高位),这样就可以表示更多的返回类型

VERSOION:EDNS的版本

DO:DNSSEC OK,见相关RFC文档定义

Z:一般被发送者设置为0,接收方可以忽略它


因此,只要在进行DNS请求时,设置了OPT RR的CLASS值,则当响应超过了512字节,但未超过该值时,会仍然使用UDP进行传输。


03


DNS超过512字节时常规交互


在进行示例之前,我们首先要找到能够产生超过512字节DNS报文的域名及DNS服务器。这是由于大部分的DNS响应都不会很长,而同时,不同的DNS服务器缓存的DNS数据是有差异的。


经过搜集,我们选取了微软的DNS服务器之一:208.84.2.53,同时,选取了进行示例的域名:outlook.com。


常规的DNS请求,不会设置OPT RR的CLASS值,因此会默认在DNS报文大于512字节时,换用TCP传输。


常规DNS交互的实力,选择使用windows自带的nslookup服务进行,命令如下:

nslookup -qt=ANY outlook.com 208.84.2.53


使用Wireshark抓包可看到报文如下:

640?wx_fmt=png


可以看到,DNS在UDP传输之后自动进行了TCP DNS请求,响应体长度达到1010字节。


自动进行的关键是UDP的DNS响应报文里给truncated进行了置位:

640?wx_fmt=png


因此,我们只需要找到超过512字节DNS响应的域名及DNS服务器,就能很容易获取到DNS TCP的报文。


04


DNS突破UDP 512字节限制


对于超过512字节的DNS UDP报文,就不是那么容易获得的。一个简单的办法是,到骨干网络上去抓包,抓取DNS服务器之间的DNS同步报文。当然,对很多分析DNS协议的朋友,这不现实。


这里,将介绍一种在PC上产生超过512字节的UDP DNS报文的办法。


使用的仍然是前一节的DNS域名和服务器。


这里,需要找到设置DNS协议的OPT RR的CLASS值的方法,很幸运,有这样的工具存在,即dig这个小工具,一款Linux下用于查看域名详情的小工具,类似于nslookup,但功能更强大。dig也存在Windows版,它包含在BIND工具包中,BIND工具包可以在BIND官网下载,地址如下:https://www.isc.org/downloads/


在页面下方即可找到BIND各个版本的下载按钮。


下载好bind包,解压后,直接命令行进入解压目录,即可使用dig进行DNS请求,为构造UDP的DNS大包,设置了参数+notcp以及+bufsize=1400

dig.exe @208.84.2.53 outlook.com ANY IN +notcp +bufsize=1400


wireshark获取到报文如下:

640?wx_fmt=png

没有从UDP跳转为TCP进行DNS请求,而是直接在UDP中返回了完整的DNS数据。


其中请求如下:

640?wx_fmt=png


在OPT RR中,设置了UDP的payload size 1400。


响应如下:

640?wx_fmt=png

响应体达1031字节。


很容易地,就设置了DNS协议的OPT RR的CLASS值。从而获得了超过512字节的UDP承载的DNS协议报文。


05


总结


只要找到合适的方法,就能很方便地突破DNS协议的UDP 512字节限制。如果有什么疑问,可以随时联系我。

640?wx_fmt=jpeg

长按进行关注。





相关文章:

Fragment为什么须要无参构造方法

日前在项目代码里遇到偷懒使用重写Fragment带参构造方法来传参的做法,顿生好奇,继承android.support.v4.app.Fragment而又不写无参构造方法不是会出现lint错误编译不通过的咩?仔细追究,原来是这货被加了SuppressLint("ValidF…

CentOS 安装FTP

# 安装FTP * 1 安装命令> yum -y install vsftpd * 2 使用如下命令增加账户,其中 /var/www/html 是我们的 ftp 目录,ftpadmin 为 ftp 用户名。 > useradd -d /var/www/html -s /sbin/nologin ftpadmin * 3 给 ftpadmin 这个用户设置密码 > pa…

HTTP协议中的Range和Content-Range

“ 琢磨HTTP协议的每一个细节。”HTTP协议博大精深,每一个细节都应细细体会。否则,在协议还原的过程中,你会遇到各种问题。今天,本文中将对HTTP协议的Range和Content-Range进行分析。Range和Content-Range是 HTTP/1.1中新增的HTTP…

【HTML5游戏开发】简单的《找不同汉字版》,来考考你的眼力吧

一,准备工作 本次游戏开发需要用到lufylegend.js开源游戏引擎,版本我用的是1.5.2(现在最新的版本是1.6.0)。 引擎下载的位置:http://lufylegend.googlecode.com/files/lufylegend-1.5.2.rar 引擎API文档:ht…

FTP 命令的使用详解

# 使用Terminal 连接FTP ####Tips: 1 通过!进入本地主机的shell,然后通过exit退出本地主机进入远程服务器shell 2 要把文件下载到哪一个目录 就要先cd 到 哪个目录,再去进行ftp 连接,这样 执行 get 文件 自动下载到目录3 下载的文件的时候…

html 11 内联(行内)

行内元素 <span> 块级元素 <div> <p> <section> <header> <footer> 行内元素&#xff0c;这是高 margin-top margin-bottom 无意义 &#xff0c;无效果&#xff0c;因为它仅仅在行内 &#xff0c;它跳不出行&#xff0c;行多少它就多少。…

宅男抖音某猫协议分析及应用破解

“ 分析传说中的快x&#xff0c;顺便提供破VIP线路及去启动广告方法。”在当今这个由应用市场主导的网络上&#xff0c;流传着一批应用&#xff0c;它们低调又神秘&#xff0c;依赖口碑与独立网站在地下渠道传播&#xff0c;应用市场中从来都找不到它们的身影。这类应用&#x…

AdminLTE的使用

官方文档link1.AdminLTE的必要配置文件<!-- Tell the browser to be responsive to screen width --> <meta content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno" name"viewport"> <!-- Bootstrap 3.3.5 --> …

Linux sendmail发送邮件失败诊断案例(一)

在新服务器上测试sendmail发送邮件时&#xff0c;发现邮件发送不成功&#xff0c;检查日志文件发现如下错误&#xff08;Notice&#xff1a;由于涉及公司服务器&#xff0c;邮箱等&#xff0c;故下面hostname、邮箱地址等信息使用xxx代替&#xff09; tail -40 /var/log/maill…

CentOS 安装Python3

# 基于Linux的 Python3 环境的安装 最近买了一台centOS 阿里云轻量级服务器 自带Python2 准备安装Python3.6 版本的 ## Step * 1 查看当前版本python 的路径 使用以下命令,以便后面安装完毕 建立软链接 > which python 正常情况下会显示python 路径&#xff0c;例如…

某米浏览器黑名单文件破解

“粗粮系统自带浏览器的网址黑名单提取。”某米手机作为高性价比的代表&#xff0c;比起菊厂及OV厂妹风手机&#xff0c;向来被我高看一眼&#xff0c;毕竟雷布斯也是我等码农的典范&#xff0c;以至于我都买过好几件粗粮的产品。虽然它的各个应用&#xff0c;包括系统&#xf…

函数的四种调用模式.上下文调用.call.apply

闭包:函数就是一个闭包,一个封闭的作用域; 返回函数,要返回多个函数就用一个对象封装一下,立即执行函数return回调函数JS动态创建的DOM,不会被搜索引擎抓取,对SEO不友好./*window的name属性*/function fn(){ console.log(this.name);} fn.call({name:"zhangsan"});//…

IOC和DI(转)

1、IoC(Inversion of Control)控制反转和 DI(Dependency Injection)依赖注入 首先想说说IoC&#xff08;Inversion of Control&#xff0c;控制倒转&#xff09;。这是spring的核心&#xff0c;贯穿始终。所谓IoC&#xff0c;对于spring框架来说&#xff0c;就是由spring来负责…

生成公钥链接github

# 生成公钥 连接Git### 1 检查本机是否有公钥 > cd ~/.ssh### 2 如果有的话 直接使用 不要随便删除电脑公钥 没有的话进行生成 生成如下 id_rsa 是 私钥 id_rsa.pub 是公钥 ### 3 生成公钥命令如下 邮箱是你的邮箱地址 终端会提示输入密码 可以以回车带过 如果设置密码…

精确哈克,以贪婪为基础的欺诈式引流法

“ 一种seo手段探讨。”前一段时间&#xff0c;有朋友在后台留言&#xff0c;让我测评一个网站上的信用卡号码生成器&#xff1a;我兴致勃勃&#xff0c;以为是什么黑科技出现了。打开网站&#xff0c;一股熟悉的wordpress风迎面飘来&#xff0c;伴随着风骚的黑色风味。多点击几…

HTML 基础知识(特殊字符的转义)

1. body、head&#xff08;meta&#xff09; <body></body>标签的常见属性&#xff1a; bgcolor&#xff1a;整个页面的背景&#xff1b;text&#xff1a;设置文本颜色link&#xff1a;设置连接颜色&#xff08;&#xff09;&#xff0c;vlink&#xff1a;已经访问…

1 组件化的了解

组件化 概念:讲一个单一的工程的项目&#xff0c;分解成为各个独立的组件&#xff0c;然后按照某一种方式&#xff0c;任意的组织成一个拥有完整业务逻辑的工程 优势 组件的独立–> 独立编写&#xff0c;独立编译&#xff0c;独立运行&#xff0c;独立测试资源的重用–&g…

WebView通过loadDataWithBaseURL加载本地页面卡死

最近开发遇到一个使用 Android WebView加载本地页面进度条始终卡在20%左右不动的情况。打 Log、抓包发现卡在 WebView对象调用 loadDataWithBaseURL方法。 去网上搜了一下解决方案&#xff0c;stackoverflow上有人说是因为 JELLY_BEAN以上版本没有设置 WebView访问文件的权限导…

微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办?如何获取被屏蔽的网页的网址?...

点击上方↑↑↑蓝字[协议分析与还原]关注我们今天介绍一个微信使用技巧。微信出现“已停止访问该网页”或“关于潜在的违法或违规内容”怎么办&#xff1f;如何获取被屏蔽的网页的网址&#xff1f;由于微信严格的管控措施&#xff0c;经常会导致一些分享的网址被微信屏蔽&#…

self.navigationController push到指定控制器

1 返回到当前页面上面第三级控制器int idx (int)[[self.navigationController viewControllers]indexOfObject:self]; [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:(idx -3)] animated:YES];2 //遍…

Google搜索的常用技巧

个人搜索方案 1、选择合适的搜索词&#xff0c;一些行业术语或专家名字可以带来更加高质量的结果。 2、搜索词手动使用空格分隔&#xff0c;先进行第一次搜索&#xff0c;看搜索结果标题是否满足预期&#xff0c;如果不满足&#xff0c;采用更换关键词&#xff0c;添加关键词&a…

hdu 1085 Holding Bin-Laden Captive!

Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China! “Oh, God! How terrible! ” Don’t be so afraid, guys. Although he hides in a cave of…

GPS NMEA-0183协议常用报文数据格式

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 整理的GPS有关的协议分析资料。”之前分析一些车载设备的流量时&#xff0c;有部分经验&#xff0c;在这里和大家分享。产生这些流量的设备通常是实体终端设备&#xff0c;里面装有处理芯片&#xff0c;与GPS通信&#xff0c;也通…

【tyvj1052】【树状dp】没有上司的舞会

描述 Ural大学有N个职员&#xff0c;编号为1~N。他们有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会&#xff0c;要求与会职员的快乐指数最大。但是&#xff0c;没有职员…

java中memcached

http://www.oschina.net/code/snippet_250396_9181 转载于:https://www.cnblogs.com/suifengbingzhu/p/3737053.html

01内存管理-概述

内存管理 内存消耗内存管理模型语言架构减少内存使用的实践 1 内存消耗 栈大小 每一个线程都有专有的栈空间&#xff0c;栈内存在线程存在期间自由使用。 每一个函数都有其自己的栈帧&#xff0c;所有的变量都会载入到方法的栈帧中&#xff0c;并且消耗一定的内存。 &…

linux下unzip解压报错“symlink error: File name too long”怎么办?提供解决方案。

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分享unzip工具的一个bug。”最近在研究菠菜站&#xff0c;中间用到了Spidermonkey&#xff0c;碰到一些小波折&#xff0c;在这里分享出来&#xff0c;以便大家快速跳坑。从全球最大的男性交友网站GitHub上把Spidermonkey-master…

EF-Linq将查询结果转换为Liststring

List<int> id_list new List<int>() { 1 };//测试数据...List<string> guid_list (from uinfo in db.UserInfowhere id_list.Contains(uinfo.ID)select new{uid uinfo.Guid}).ToList().Select(u > u.uid).ToList<string>(); 转载于:https://www.c…

hdu 2594 kmp

这个题和kmp算法的共同点&#xff0c;也就是可以用kmp解的原因&#xff0c;在于当前缀所在串&#xff08;kmp中的模式串&#xff09;字符pj≠后缀所在串(kmp中文本串)字符tj时&#xff0c;应使前缀串(kmp中模式串)尽量往右移动最大位移&#xff0c;而暴力算法则是每次移动位移为…

途游斗地主加密协议分析及破解

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分析途游斗地主的加密协议。”作为一个手机棋牌游戏厂商&#xff0c;途游是排得上号的&#xff0c;它的途游斗地主一直很火热&#xff0c;隐约记得&#xff0c;这个厂商一直在搞斗地主的全国竞技赛事&#xff0c;并蹭上了体育总局…