用于对dns有线格式数据包进行编码/解码的简单库

dnslib的Python项目详细描述



dnslib
----


用于对同时支持
python 2.7和python 3.2+的dns有线格式数据包进行编码/解码的库。


该库提供:

*支持对有线格式之间的dns数据包进行编码/解码,
python对象,和区域/挖掘文本表示(dnslib.dns)

*一个服务器框架,允许简单地创建自定义dns
解析器(dnslib.server)和多个使用此框架创建的示例服务器


*一系列用于测试的实用程序(dnslib.client,dnslib.代理服务器,
dnslib.intercept)


0.9.0版增加了对python 3的支持,这相当于对库进行了重大更新-关键的更改包括:

*python 2.7/3.2+支持(支持python 2.6
或更早版本的是0.8.3版)

*"bimap"接口被显著更改为通过getitem进行显式的向前拆分(值->;文本)查找和通过getattr进行的向后拆分(值->;文本)查找。需要更新使用旧接口的应用程序。


*默认情况下,主机名现在返回一个尾随点(在带有rfc的
行中)

*大多数对象属性现在都是按照记录定义键入的数据包

*支持对"区域"(绑定)中的资源记录进行编码/解码
文件格式

*支持对"dig"格式的数据包进行编码/解码

*服务器框架允许(大多数情况下)通过对dnsresolver子类化创建自定义解析器
类并重写"resolve"方法,对错误检测/处理进行了大量修复,这将使库对无效/不受支持的数据更加健壮。
库现在要么在分析数据包时返回有效的dnsrecord实例,要么引发dnserror(通过模糊测试)

*改进的实用程序(dnslib.client、dnslib.proxy、dnslib.intercept)

*对编码/解码测试的改进,包括能力
在test_decode.py中自动生成测试数据(将
输出与dig进行比较)


*比较和区分dnsrecords的能力



----


关键dns包处理类位于dnslib.dns中,并映射到
标准dns包部分:

*dnsrecord-dns数据包的容器。包含:
-dnsheader
-问题部分包含零个或多个dnsquestion对象
-回答部分包含零个或多个rr对象
-权限部分包含零个或多个rr对象
-附加部分包含零个或多个rr对象
*dns rrs(资源记录)包含一个rr头和一个rd对象)
*特定的rd类型被实现为rd的子类
*dns标签由dnslabel类表示-在大多数情况下
这处理到/从文本表示的转换,但是
不支持任意性通过字节对象元组的标签

使用
----


解码dns数据包:

>;>;packet=binascii.unhexlify(b'd5ad818000010000000000003777706676f6f676c6500336f6d00001000001c0050001000000005000008037777016cc010c02c000100001000005000442f95b68c02c0001000005000442f95b63c02c0001000010000000100000500442f95b67c02c000100000001000004442f95b93')
>;d=dnsrecord.parse(packet)
>;>d
<;d ns header:id=0xd5ad type=response opcode=query flags=rd,ra rcode='noerror'q=1 a=5 ns=0 ar=0>;
<;dns question:'www.google.com.'qtype=a qclass=in>;
<;dns rr:'w w w.google.com.'rtype=cname rclass=in ttl=5 rdata='www.l.google.com.'>;
<;dns rr:'www.l.google.com.'rtype=a rclass=in ttl=5 rdata='66.249.91.104'>;
<;dns rr:'www.l.google.com.'rtype=a rclass=in ttl=5 rdata='66.249.91.99'>;
<;dns rr:'www.l.google.com."rtype=a rclass=in ttl=5 rdata='66.249.91.103'>;
<;dns rr:'www.l.google.com."rtype=a rclass=in ttl=5 rdata='66.249.91.147'>;

dnsrecord的默认文本表示形式为区域文件格式:

>;>;打印(d)
;>;>;标题<;<;-操作码:查询,状态:无错误,ID:54701
;;标志:qr rd ra;查询:1,答案:5,权限:0,附加:0
;;问题部分:
;www.google.com。在
;回答部分:
www.google.com。5在cname www.l.google.com.
www.l.google.com.在66.249.91.104
www.l.google.com中输入5。在66.249.91.99
www.l.google.com中输入5。在66.249.91.103
www.l.google.com中输入5。5在66.249.91.147


中创建DNS请求数据包:

>;>d=dnsrecord.question("google.com")

(这相当于:d=dnsrecord(q=dnsquestion("google.com"))

>;d
<;dns头:id=…type=query opcode=query flags=rd rcode='noerror'q=1 a=0 ns=0 ar=0>;
<;dns问题:"google.com."qtype=a qclass=in>;

>;>;str(dnsrecord.parse(d.pack())==str(d)

>;>;打印(d)
;;->;>;标题<;<;-操作码:查询,状态:noerror,id:…
;;标志:rd;查询:1,答案:0,权限:0,附加:0
;;问题部分:
;google.com。在a

>;>d=dnsrecord.question("google.com","mx")

(相当于:d=dnsrecord(q=dnsquestion("google.com",qtype.mx))

>;>str(dnsrecord.parse(d.pack()))==str(d)

>;打印(d)
;->;标题<;<;-操作码:查询,状态:无错误,ID:…
;;标志:rd;查询:1,答案:0,权限:0,附加:0
;;问题部分:
;google.com。在mx

中创建dns响应包:

>;>d=dnsrecord(dnsheader(qr=1,a a=1,ra=1),
…q=dnsquestion("abc.com"),
…a=rr("abc.com",rdata=a("1.2.3.4"))
>;>d
<;dns头:id=…type=response opcode=query flags=a a,rd,ra rcode='noerror'q=1 a=1 ns=0 ar=0>;
<;dns question:'abc.com.'qtype=a qclass=in>;
<;dns rr:'abc.com.'rtype=a rclass=in ttl=0 rdata='1.2.3.4'>;
>;>;str(dnsrecord.parse(d.pack())==str(d)
true

>;>>打印(d)
;->;>标题<;<;-操作码:查询,状态:无错误,ID:…
;;标志:qr aa rd ra;查询:1,答案:1,权限:0,附加:0
;;问题部分:
;abc.com。在a
;回答部分:
abc.com。0在1.2.3.4中


]

(注意:这将生成一个rr列表,如果
传递给add-answer/add-auth/add-ar etc,则应将其解压缩)


>;>;q=dnsrecord.question("abc.com")
>;>;a=q.reply()
>;>;a.添加"应答"("abc.com 60 a 1.2.3.4")
>;>;打印(a)
;->;>;标题<;<;-操作码:查询,状态:无错误,ID:…
;标志:qr aa rd ra;查询:1,应答:1,权限:0,附加:0
;问题部分:
;abc.com。在a
;回答部分:
abc.com。60在1.2.3.4中

在RFC1035中(特别是不包括$include)

>;z='
…$TTL 300
…$origin abc.com

…@在mx:10 mail.abc.com.
www:in:a:1.2.3.4
…在txt"some text"
…邮箱:cname:www.abc.com.
"
>;>;对于rr.fromzone中的rr(textwrap.dedent(z):
…打印(rr)
abc.com。300:in mx:10 mail.abc.com.
www.abc.com.300:in:a:1.2.3.4
www.abc.com。300,文本"some text"
mail.abc.com。To create a skeleton reply to a DNS querquerquery to DNS querquerquerquerquerquerquerquerquerquerquerquery: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< >> > > > > >; > >; >; >;;; >;;; >;;; >;; >; >; >;; >;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; />;; QUESTION SECTION:
;abc.com.在:any
;;回答部分:
abc.com。A.2.3.3.3.4.4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<gt>gt>gt>gt>gt>添加添加添加添加添加添加添加添加答案(rrr("xxxxx.abbabcc.abc.abc.abc.abc.abc.abc.com.abc.abc.abc.abc.abc.abc.abbabababababababababababababababababababababababababaaaaa aa tyyyyyyappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappappapp"1234:5678::1"))
>;(DNDNSRecord.parsparse (a.pack ()). ====<<<<<
True <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;;;; flagflagflagflagflagflagflagflagflagflagflagflag: qqqr a a a a a a a a a a a a a a rd ra; QUERY: 1, ANANANANANSWER: 3, AUAUTHORIY: 0 0, AUAUAUAUAUAUAUAUAUAUDIDIDIDIDIDIDIDIDIDIDIAL: 0 <<<<<<;abc.com.在:any
;;回答部分:
abc.com。60:in:a:1.2.3.4
xxx.abc.com。0:in:a:1.2.3.4
xxx.abc.com。And then there's 12121212555581 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< >>打印(a)
;;->;>;标题<;<;-操作码:查询,状态:无错误,ID:
;;标志:qr a rd ra;查询:1,答案:1,权限:0,附加:0
;;问题部分:
;abc.com。在:any
;;回答部分:
abc.com。I'm going to CNAME xxxxabc.com.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>&&> &>;; >;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; replyZone(textwrap.dedent (z)
>>> print (a)
; >>;标题<;<;-操作码:查询,状态:无错误,ID:
;标志:qr aa rd ra;查询:1,答案:4,权限:0,附加:0
;问题部分:
;abc.com。在:any
;;回答部分:
abc.com。300:in mx:10 mail.abc.com.
www.abc.com.300:in:a:1.2.3.4
www.abc.com。300,文本"some text"
mail.abc.com。You can send a DNSSEC request (EDNS OPT record record with DO flag & headheadheader AD flag):<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;)
>>q.header.ad=1
>;>;打印(q)
;->;>;header<;<;-操作码:查询,状态:无错误,ID:
;标志:rd ad;查询:1,答案:0,权限:0,附加:1
;问题部分:
;abc.com。在a
;附加部分:
;opt pseudosection
;edns:version:0,flags:do;udp:4096

库中还包含一个简单的框架,用于在dnslib.server中生成自定义dns
解析器(请参阅模块文档)。在后置情况下,这只需要
实现一个自定义的"resolve"方法,该方法接收一个问题
对象并返回一个响应。


提供了一些示例解析器(请参阅cli--help):

*dnslib.fixedresolver-使用fixed响应所有请求response
*dnslib.zoneresolver-从区域文件响应
*dnslib.shellresolver-调用shell脚本生成响应

*DNS代理服务器

python-m dnslib.proxy--帮助

*拦截DNS代理服务器(替换指定域的代理响应)




--

*0.1 2010-09-19初始release
*0.2 2010-09-22小补丁
*0.3 2010-10-02添加dnslabel类以支持任意标签(嵌入".")
*0.4 2012-02-26与dbslib电路合并
*0.5 2012-09-13添加对rfc2136 ddns更新的支持
patch由Wesley Shields<;wxs@freebsd.org>;提供-感谢
*0.6 2012-10-20基本AAAA支持
*0.7 2012-10-20添加初始EDNS0支持(未测试)
*0.8 2012-11-04添加对NAPTR的支持,权威rr和附加rr
stefan andersson提供的补丁(https://bitbucket.org/norox)-谢谢
*0.8.1 2012-11-05添加了naptr测试用例和修正了逻辑错误
stefan andersson提供的补丁(https://bitbucket.org/norox)-感谢
*0.8.2 2012-11-11修补程序修复IPv6格式
torbjórn lónnemark提供的修补程序(https://bitbucket.org/tobbez)-感谢
*0.8.3 2013-04-27如果rdlength为0,则不解析rdataWesley Shields提供的修补程序<;wxs@freebsd.org>;-感谢
*0.9.0 2014-05-05主要更新,包括PY3支持(请参阅文档)
*0.9.1 2014-05-05次要修复
*0.9.2 2014-08-26修复BIMAP处理未知映射以避免打印异常
将类型化属性添加到类
james mills的misc fixes-感谢
*0.9.3 2014-08-26 argparse错误的解决方法,如果[]在选项文本中存在(真的吗?)
*0.9.4 2015-04-10修复支持TXT记录中的多个字符串
james cherry提供的修补程序(https://bitbucket.org/james廑cherry)-谢谢
注意:为了保持一致性,此修补程序更改了
始终引用TXT记录
*0.9.5 2015-10-27向dnsserver添加线程和超时处理
*0.9.6 2015-10-28替换rrsig格式的strftime,以避免bryan发现的可能的语言环境问题
-谢谢
*0.9.72017-01-15整理caa/type257 dig解析不匹配
*0.9.8 2019-02-25强制dnskey key为bytes object
catch bimap\uu wrapped\uuuu attr(由3.7中的inspect模块使用)
*0.9.9 2019-03-19添加对dnssec标志获取器/设置器的支持(from<;raul@dinosec.com>;-谢谢)
添加了dnssec标志到dnslib.client&dnslib.test_decode(设置edns0 do标志)
添加了edns0对dnslib.digparser的支持*0.9.10 2019-03-24修复dnssec支持测试数据
(感谢<;raul@dinosec.com>;获取帮助)


许可证:
——



作者:
——

*paul chakravarti(paul.chakravarti@gmail.com)


主存储库/问题:
——

*https://bitbucket.org/paulc/dnslib
(在github上克隆:https://github.com/paulchakravarti/dnslib)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java传递实现接口的内部类   java为什么managedbean方法在post请求中的过滤器调用之前调用   java Android应用程序在Android M,O上崩溃,登录A/libc时出错:tid 17938中的致命信号11(SIGSEGV),代码2,故障地址0x343a2944   java JPA存储库。findByAll()返回null,但数据库中存在所有内容   用于发送电子邮件的java Ant脚本   Java小程序HTML页面发生了奇怪的事情   在Postman的请求正文中传递多个JSON数据,并使用Jersy(JXRS)进入Java Rest API   无法强制转换java DAO类   10分钟后重新连接java   正则表达式如何在java中选择字符串直到某个字符   java我的输出有一些问题   Objective中的java时间段   java如何在新屏幕上基于按钮单击在webview中打开url   java哪个selenium版本与Firefox ESR 45.2.0兼容   java无法使用Apache Camel 3.1.0将XML转换为JSON