DDOS防御专家-提供超强DDoS高防/CC防护/大流量清洗服务!
当前位置:主页 > DDOS防御 > 正文

如何写一个DNS压力测试工具

09-17 DDOS防御

DNS是DomainNameSystem(域名系统)的缩写,简单来说就是负责域名与IP地址之间的转换,平时我们用到的大部分是域名转IP,当然也支持IP转域名的反向解析。在方方面面都会有DNS的身影,在负载均衡方面也可以借助DNS来实现,还有就是黑产们喜欢坚持广大用户的DNS来获取利益,可以说DNS是互联网最重要的协议之一。
0×01 起因
互联网上的DNS服务器非常非常的多,有公共的DNS 也有公司自己内部使用的DNS也有用于负载均衡的,我们公司呢也要建一个 DNS服务器,搭建DNS我是不擅长,但是搭建完之后需要做一下压力测试这我就比较喜欢了,毕竟这个压力测试说好听叫压力测试,说不好点那就是DOS攻击,接下来我就说说我进行压力测试的过程吧。
0×02 DNS协议基础
想要进行压力测试,至少要能模拟出正常用户的DNS请求才行,所以构造DNS请求报文我们需要先了解DNS协议的报文格式。
DNS是应用层的协议,使用TCP和UDP的53端口,不过一般情况下是使用UDP53端口的,所以呢今天我们构造的DNS也是基于UDP的。

如何写一个DNS压力测试工具


DNS协议的报文首部是定长的12字节,分别是标识(16bit)、标志(16bit)、问题记录数(16bit)、回答记录数(16bit)、授权记录数(16bit)、附加信息记录数(16bit)。
标识字段是用来匹配请求和响应的,有点类似ip协议的ID字段,应答报文的标识字段应该和请求报文的相同。
标志是由多个字段组成的

如何写一个DNS压力测试工具


QR字段长度是1bit,用来表示这个DNS报文是请求还是响应,因为DNS的请求和响应的报文首部格式相同,0表示请求,1表示响应。
OPcode字段呢长度是4bit,表示操作类型,0表示正向解析,1表示反向解析,2表示服务器状态请求。
AA字段长度为1bit,是授权回答标志位,0表示回答是非权威的,1则表示回答的服务器是授权服务器。
TC字段长度也是1bit,是截断标志位,1表示报文长度超过了512字节,并且被截断成了512字节,不过我在抓包的时候抓到很多超过512字节的
也并没有被截断。
RD字段长度为1bit,表示希望递归的标志,1表示请求服务器进行递归解析,0表示希望反复查询,但这个怎么查询还是服务器说了算。
RA字段只在服务器响应中有效,1表示服务器支持递归,0表示不支持递归。
RA后面的是保留字段,长度为3bit,必须置0。
rCode字段是用来表示错误状态的,长度为4bit,0表示没有错误,1表示格式错误,2表示服务器故障,3表示查询域名不存在,4表示不知道的解析类型,5表示管理上禁止。
问题记录数的16bit表示问题部分所包含的域名解析查询的个数,理论上最大是65535.
回答记录数也是16bit,相应的也是表示响应报文中回答记录的个数。
授权记录数也是16bit,表示授权部分所包含的授权记录的个数,请求报文中置0。
附加信息记录数长度是16bit,表示附加信息部分所包含的附加信息记录的个数。
以上的这12字节就是DNS包文的首部,我们做压力测试的话,只需要构造请求报文,所以一般情况下回答记录数、授权记录数、附加信息记录数都会置0.
接下来就是DNS的变长部分了,分别是问题部分、回答部分、授权部分、附加信息部分,我们要做只需要问题部分就可以了。

如何写一个DNS压力测试工具


这其中查询名就是我们要查询的域名,他是变长的。查询类型和查询类是定长的,都是16bit,这两个要写在整个报文的结尾。
查询类比较简单,1表示ip协议,符号为IN。其他协议的表示是什么其实我也不知道…
查询类型字段选择就比较多了,常用的如下图:

如何写一个DNS压力测试工具


查询名就是我们常说的域名,比如,但是在报文中不能直接这么写,而是要改成 3www7freebuf3com0 这种形式,字段之间不再以.分割,而是以字符串前的数字表示这个字符串的长度,最后以0结束。
0×03 构造报文
编程语言:C
运行环境:kali/ubuntu linux
编译器:gcc version 6.1.1
在linux中已经构造好了ip和udp的结构体分别在ip.h和udp.h两个头文件中,linux中应该也定义好了DNS协议的结构,不过我没找到…所以咱就自己构造一个也是一样的。
详细的解释在代码的备注中看吧。
#include
#include
#include
#include
#include
#include
/*定义一个DNS首部的结构体*/
struct dnshdr {
    __be16 id;
    __be16 flags;
    __be16 questions;
    __be16 answer;
    __be16 auth;
    __be16 add;
};
int main(int argc, char *argv[])
{
if( argc == 1 )
   {
printf("这是一个DNS压力测试工具,命令格式./DNStest ip port delay \n");
exit(0);
   }
else if( argc > 4 )
   {
printf("参数输入太多啦,请不带参数查看输入格式!\n");
exit(0);
   }
else if( argc 4 )
   {
printf("参数输入太少啦,请不带参数查看输入格式!\n");
exit(0);
   }
struct sockaddr_in dstaddress;
dstaddress.sin_family=AF_INET;
dstaddress.sin_port=htons(atoi(argv[2]));

版权保护: 本文由 DDOS防御专家 原创,转载请保留链接: http://sskjddosgb11.ddosgb.com//ddos1/86.html

DDoS防御专家简介孤之剑
国内资深白帽子二十人组成员,前BAT资深网络安全工程师,知名网络安全站点板块大神,每年提交Google及微软漏洞,原sina微博负载插件开发者,现在整体防御复合攻击长期接受1-4.7T攻击,CC防护自主开发指纹识别系统,可以做到99.9999%的无敌防御。
  • 文章总数
  • 700565访问次数
  • 建站天数
  • 友情链接

    DDOS防御

    ddos防御

    cc防护

    web安全

    高防服务器

    高防cdn


    QQ客服

    400-0797-119

    X