2.python IP/DNS地址处理之IPy/Dnspython模块

 

 1.IPy模块python

在IP地址规划中,涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等,即使是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工具,能够帮助实现计算子网掩码、网络掩码、广播地址、子网数、IP类型等。git

github模块下载地址:https://github.com/autocracy/python-ipygithub

我这里使用windows10,采用pip install IPy 安装windows

在平常使用中,常见的IP操做包括IP类型判断,IP转换,反向解析,输出网段地址等。网络

基本使用:dom

1.获取IP地址的版本(IPV4 or IPV6)tcp

>>> import IPy
>>> from IPy import IP
>>> IP('10.0.0.1').version()
4
>>> IP('::1').version()
6工具

#4 表示IPv4,6 表示IPv6spa

2.获取子网IP地址的个数.net

>>> from IPy import IP
>>> ip = IP('10.0.0.0/27') >>> ip.len() 32
# 排除网络地址和广播地址,因此可用地址是30个

3.获取IP地址的类型(私有IP or 公有IP)

>>> from IPy import IP >>> ip = IP('10.0.0.1') >>> ip.iptype() 'PRIVATE'
>>> ip1 = IP('8.8.8.8') >>> ip1.iptype() 'PUBLIC'
# PRIVATE 表示私有地址,PUBLIC 表示公有地址

---------------------------------------------------

4.把IP地址转换成整数格式

>>> from IPy import IP >>> ip = IP('10.0.0.1')
>>> ip.int() 167772161

5.把IP地址转换成十六进制/二进制格式

>>> from IPy import IP
>>> ip = IP('10.0.0.1')
>>> ip.strHex()  #转换成十六进制
'0xa000001'
>>> ip.strBin()   #转换成二进制
'00001010000000000000000000000001'

6.把十六进制/二进制格式转换成IP

>>> from IPy import IP >>> print(IP('0xa0000001'))
10.0.0.1
>>> print(IP(167772161))
10.0.0.1

-------------------------------------------------

7.网络地址的转换,根据IP和子网掩码生成网段格式:

>>> print (IP('192.168.100.0').make_net('255.255.255.0')) 192.168.100.0/24
>>> print (IP('192.168.100.0/255.255.255.0',make_net=True)) 192.168.100.0/24
>>> print (IP('192.168.100.0-192.168.100.255',make_net=True)) 192.168.100.0/24

8.反向解析地址格式

>>> IP('8.8.8.8').reverseNames() ['8.8.8.8.in-addr.arpa.']

9.判断网段大小

>>> IP('10.0.0.0/24') > IP('10.0.0.0/16') True

10.判断IP是否在网段内

>>> '192.168.1.100' in IP('192.168.1.0/24') True

11.判断网段是否在网段内

>>> IP('192.168.1.0/24') in IP('192.168.0.0/16') True

12.判断网段是否重叠

>>> IP('192.168.0.0/16').overlaps('192.165.1.0') 0
>>> IP('192.168.0.0/16').overlaps('192.168.1.0') 1
#0 表示不重叠,1表示重叠

13.获取的网段的子网掩码,以及广播地址

>>> from IPy import IP >>> ip = IP('10.0.0.0/30') >>> ip.netmask() IP('255.255.255.252') >>> ip.broadcast() IP('10.0.0.3')

14.对于网段的地址,能够利用for循环,获得其包含的全部的IP地址

>>> from IPy import IP >>> ip = IP('10.0.0.0/30') >>> for i in ip: print(i) 10.0.0.0
10.0.0.1
10.0.0.2
10.0.0.3

 

2.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用来指定当查询无应答时是否触发异常。

常见的DNS解析类型包括A,MX,NS,CNAME等。利用dnspython的dns.resolver.query方法能够简单实现这些DNS类型的查询,为后面要实现的功能提供数据来源,好比对一个使用DNS轮循业务的域名进行可用性监控,须要获得当前的解析结果。

1.A记录/CNAME记录

import dns.resolver
domain = input('please input an domain: ') #请输入域名地址
A = dns.resolver.query(domain,'A')
for i in A.response.answer:
    for j in i.items:
        if isinstance(j, dns.rdtypes.IN.A.A): ##若是是A记录类型,则输出地址
            print('A记录: %s' % j.address) 
        if isinstance(j, dns.rdtypes.ANY.CNAME.CNAME): ##若是是CNAME记录,则直接输出
            print('CNAME: %s' % j)

2.MX记录查询

import dns.resolver domain = input('please input an domain: ') MX = dns.resolver.query(domain,'MX') #指定查询域名以及MX类型 for i in MX: print("MX preference =%d,mail exchanger=%s" %(i.preference,i.exchange))

3.NS记录查询

import dns.resolver domain = input('please input an domain: ') NS = dns.resolver.query(domain,'NS') #指定查询域名以及MX类型 for i in NS.response.answer: for j in i.items: print(j.to_text()) ##输出结果

 

相关文章
相关标签/搜索