IP地址处理模块IPy
IPy是一个功能强大的第三方模块,它可以很好的辅助完成IP的规划或计算工作
IPy模块安装
首先进入虚拟环境,然后使用pip安装IPy模块
source bin/activate
pip install IPy
IP类常见方法
在日常使用中,常见的IP操作包括IP类型判断、IP转换、反向解析、输出网段地址等。
>>> from IPy import IP
>>> IP('10.0.0.0/8').version() ##判断ip为ipv4还是ipv6
4
>>> IP('192.168.0.0/24').len() ##判断网段的ip个数
256
>>> IP('8.8.8.8').iptype() ##判断ip是公网还是私网
'PUBLIC'
>>> IP('192.168.1.20').reverseNames() ##反向解析地址格式
['20.1.168.192.in-addr.arpa.']
>>> IP("8.8.8.8").int() ##将ip地址转换成整数格式
134744072
>>> IP('8.8.8.8').strHex() ##将ip地址转换成十六进制格式
'0x8080808'
>>> IP('8.8.8.8').strBin() ##将ip地址转换成二进制格式
'00001000000010000000100000001000'
>>> print(IP(0x8080808)) ##将十六进制转成IP格式
8.8.8.8
>>> print(IP('192.168.0.1').make_net('255.255.255.0')) ##将ip与掩码转换成网段格式
192.168.0.0/24
多网络计算方法
我们可以通过IPy模块来计算比较两个网段是否存在包含。重叠等关系,比如10.0.0.0/16网段不等于10.0.0.0/24网段。
>>> IP('10.0.0.0/24') > IP('10.0.0.0/16') ## 判断网段大小
True
>>> '192.168.1.100' in IP('192.168.1.0/24') ##判断ip是否在网段内
True
>>> IP('192.168.1.0/24') in IP('192.168.0.0/16') ##判断网段是否在网段内
True
>>> IP('192.168.0.0/16').overlaps('192.165.1.0') ##判断网段是否重叠,0不重叠,1重叠
0
>>> IP('192.168.0.0/16').overlaps('192.168.1.0')
1
DNS处理模块dnspython
dnspython模块是Python实现的一个DNS工具包,可以用于查询、传输并动态更新ZONE信息。在系统管理方面,dnspython包可以实现DNS服务监控以及解析结果的校验,用来替代linux系统中的nslookup以及dig等工具。
dnspython模块安装
pip install dnspython
dnspython模块中最常用的域名查询,它提供了一个DNS解析器类–resolver,使用resolver的query方法来实现域名的查询功能。query方法的定义如下:
query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)
其中,qname表示待查询的域名;rdtype用来指定待查询的类型,如A记录、MX记录、NS记录等;rdclass用来指定网络类型,如IN、CH、HS等,默认为IN;tcp用来指定查询时是否使用TCP协议,默认为False;source和source_port用于指定查询源地址与端口,默认为查询设备IP和0端口;raise_on_no_answer用来指定当查询无应答时是否触发异常。
查询A记录
>>> import dns.resolver
>>> A = dns.resolver.query('www.163.com','A') ##指定查询域名以及A类型
>>> for i in A.response.answer: ##获取查询回应信息
... for j in i.items: ## 遍历回应信息
... if isinstance(j, dns.rdtypes.IN.A.A): ##如果是A记录类型,则输出地址
... print(j.address)
... if isinstance(j, dns.rdtypes.ANY.CNAME.CNAME): ##如果是CNAME记录,则直接输出
... print('CNAME: %s' % j)
...
CNAME: www.163.com.lxdns.com.
36.25.241.153
实际上现在很多域名都是CNAME形式,想要获取相应的IP需要先获取对应的DNS“别名”。因此,在测试程序中加入对类型的判断。
MX记录查询
>>> MX = dns.resolver.query('163.com','MX') ##指定查询域名以及MX类型
>>> for i in MX:
... print("MX preference =%d,mail exchanger=%s" %(i.preference,i.exchange))
...
MX preference =10,mail exchanger=163mx01.mxmail.netease.com.
MX preference =50,mail exchanger=163mx00.mxmail.netease.com.
MX preference =10,mail exchanger=163mx03.mxmail.netease.com.
MX preference =10,mail exchanger=163mx02.mxmail.netease.com.
>>>
NS记录查询
>>> NS = dns.resolver.query('163.com','NS') ##输入待查询域名以及NS记录,只限输入一级域名
>>> for i in NS.response.answer:
... for j in i.items:
... print(j.to_text()) ##输出结果
...
ns6.nease.net.
ns5.nease.net.
ns8.166.com.
ns2.166.com.
ns1.nease.net.
ns3.nease.net.
ns4.nease.net.
>>> NS = dns.resolver.query('www.163.com','NS') ##如果输入二级域名或者多级,则会报错
Traceback (most recent call last):