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

 

相關文章
相關標籤/搜索