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()) ##輸出結果