python的網絡(nmap,IPy,dnspython)

一、端口掃描

僅僅知道網絡上的主機是否可達還不夠,很多情況下,我們需要的是一個端口掃描器。使用端口掃描器吋以進行安全檢測與***防範。例如,在2017年5月12日,全球範圍內爆發了基於Windows網絡共享協議的永恆之藍(Wannacry)勒索蠕蟲。僅僅五個小時,包 括美國、中國、俄羅斯以及整個歐洲在內的100多個國家都不問程度地遭受永恆之藍病毒***,尤其是高校、大型企業內網和政府機構專網,被***的電腦被勒索支付高額贖金才能解密恢復文件,對重要數據造成嚴重損失。永恆之藍利用Windows系統的445端口進行蠕蟲***,部分運營商已經在主幹網絡上封禁了 445端口,但是教育網以及大量企業內網並沒有此限制,從而導致了永恆之藍勒索蠕蟲的泛濫。

所以作爲工程師,一方面需要在日常維護養成良好的習慣,如配置防火牆、進行網絡隔離、關閉不必要的服務、及時更新補丁;另一方面可以掌握一些安全相關的工具,在日常中進行安全防範,在緊急悄況下進行安全檢測。在這一小節,我們將介紹如何使用Python進行端口掃描。有了端口掃描器,我們可以快速瞭解主機打開了哪些不必要的端口,以便及時消滅安全隱患。
在這一小節中,我們將使用Python語言編寫一個端口掃描器,然後介紹大名鼎鼎的端 口掃描工具nmap,最後,通過python-nmap在Python代碼中調用nmap進行端口掃描。

1、使用nmap掃描端口

Python-nmap模塊是對nmap命令的封裝。nmap是知名的網絡探測和安全掃描程序, 是Network Mapper的簡稱。nmap可以進行主機發現(Host Discovery)、端口掃描(Port Scanning)、版本偵測(Version Detection〉、操作系統偵測(Operating System Detection),nmap是網絡管理員必用的軟件之一。nmap因爲功能強大、跨平臺、開源、文檔豐富等諸多優點,在安全領域使用非常廣泛。
在使用之前,需要先安裝nmap。如下所示:

(1)安裝namp

-bash-4.2# yum -y install nmap

nmap的使用非常靈活,功能又很強大,因此nmap有很多命令行選項。使用nmap時, 首先需要確定要對哪些主機進行掃描,然後確定怎麼進行掃描(如使用何種技術,對哪些端 口進行掃描)。
nmap具有非常靈活的方式指定需要掃描的主機,我們可以使用nmap命令的-sL選項 來進行測試。-sL選項僅僅打印IP列表,不會進行任何操作。如下所示:

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 16:57 CST
Nmap scan report for 192.168.0.0 (192.168.0.0)
Nmap scan report for 192.168.0.1 (192.168.0.1)
Nmap scan report for 192.168.0.2 (192.168.0.2)
Nmap scan report for 192.168.0.3 (192.168.0.3)
Nmap done: 4 IP addresses (0 hosts up) scanned in 2.01 seconds
-bash-4.2# nmap -sL 192.168.1.80/30

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 16:57 CST
Nmap scan report for 192.168.1.80 (192.168.1.80)
Nmap scan report for 192.168.1.81 (192.168.1.81)
Nmap scan report for 192.168.1.82 (192.168.1.82)
Nmap scan report for 192.168.1.83 (192.168.1.83)
Nmap done: 4 IP addresses (0 hosts up) scanned in 2.01 seconds

nmap提供了非常靈活的方式來指定主機,包括同時指定多個IP、通過網段指定主機、通過通配符指定主機等。如下所示:

nmap -sL 47.100.98.242 14.215.177.39
nmap -sL 47.100.98.*
nmap -sL 47.100.98.242,243,245
nmap -sL 47.100.98.242-250
nmap -sL 47.100.98.* --exclude 47.100.98.242
nmap -sL 47.100.98.242/30

除了上面指定主機的方式,我們也可以將IP地址保存到文本中,通過-iL選項讀取文件中的IP地址。如下所示:

-bash-4.2# vim ip.list 

192.168.1.80
127.0.0.1

-bash-4.2# nmap -iL ip.list

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 21:32 CST
Nmap scan report for 192.168.1.80 (192.168.1.80)
Host is up (0.0000050s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
8888/tcp open  sun-answerbook

Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
111/tcp  open  rpcbind
631/tcp  open  ipp
8888/tcp open  sun-answerbook

(2)掃描連續端口

-bash-4.2# nmap -p20-25 47.100.98.242

python的網絡(nmap,IPy,dnspython)

(3)不進行端口掃描,僅僅判斷主機是否可達

nmap -sL ip
nmap -sn ip

測試

-bash-4.2# nmap -sL 192.168.1.80

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 17:03 CST
Nmap scan report for 192.168.1.80 (192.168.1.80)
Nmap done: 1 IP address (0 hosts up) scanned in 2.01 seconds
-bash-4.2# nmap -sn 192.168.1.80

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 17:03 CST
Nmap scan report for 192.168.1.80 (192.168.1.80)
Host is up.
Nmap done: 1 IP address (1 host up) scanned in 2.01 seconds

(4)主機發現

端口掃描是nmap的重點,除此之外,我們也可以使用nmap檢查網絡上所有在線的主機,實現類似前邊小節中列出網絡上所有活躍的主機的功能。使用-sP或-sn選項可以告訴nmap不要進行端口掃描,僅僅判斷主機是否可達。如下所示:

[root@bogon ~]# nmap -sP 47.100.98.*
Starting Nmap 6.40 ( http://nmap.org ) at 2020-03-01 00:25 CST
Nmap done: 256 IP addresses (0 hosts up) scanned in 206.44 seconds

[root@bogon ~]# nmap -sn 47.100.98.*
Starting Nmap 6.40 ( http://nmap.org ) at 2020-03-01 00:35 CST
Nmap done: 256 IP addresses (0 hosts up) scanned in 205.38 seconds

(5)端口掃描

端口掃描是nmap最基本,也是最核心的功能,用於確定目標主機TCP/UDP端口的開放情況。不添加任何參數便是對主機進行端口掃描。默認情況下,nmap將會掃描1000個最常用的端口號。如下所示:

[root@192 ~]# nmap 10.166.224.140

python的網絡(nmap,IPy,dnspython)

在進行端口掃描時,nmap提供了大M的參數控制端口掃描。包括端口掃描協議、端口掃描類型、掃描的端口號。如下所示:

端口掃描協議:T (TCP)、U (UDP)、S (SCTP>、P (IP);

端口掃描類型:-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans;

掃描的端口號:-p 80,443 -p 80-160

nmap中的端口掃描協議、掃描類型和端口號相關的選項,可以結合起來使用。如下所示:

-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9

nmap通過探測將端口劃分爲6個狀態,下表給出了每個狀態的含義。

端口狀態 狀態含義
open 端口是開放的
closed 端口是關閉的
filtered 端口被防火牆IDS/IPS屏蔽,無法確認其狀態
unfiltered 端口沒有被屏蔽,但是否開放需要進一步確定
open|filtered 端口是開放的或被屏蔽
closed|filtered 端口是關閉的或被屏蔽

在進行端口掃描時,可以使用不同的端口掃描類型。常見的端口掃描類型如下:

TCP SYNC SCAN:半開放掃描,這種類沏的掃描爲發送一個SYN包,啓動一個TCP會話,並等待響應的數據包。如果收到的是一個reset包,表明端口是關閉的; 如果收到的是一個SYNC/ACK包,則表示端口是打開的。
TCP NULL SCAN: NULL掃描把TCP頭中的所有標誌位都設置爲NULL。如果收到的是一個RST包,則表示相應的端口是關閉的。
TCP FIN SCAN : TCP FIN掃描發送一個表示結束一個活躍的TCP連接的FIN包, 讓對方關閉連接。如果收到了一個RST包,則表示相應的端口是關閉的。 TCPXMASSCAN: TCPXMAS掃描發送PSH、FIN、URG和TCP標誌位被設置爲1的數據包,如果收到一個RST包,則表示相砬端口是關閉的。

(6)版本偵測

nmap在進行端口掃描時,還可以進行版本偵測。版本監測功能用於確定開放端口上運行的應用程序及版本信息。如下所示:

-bash-4.2# nmap -sV 10.166.224.140

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 17:06 CST
Nmap scan report for 10.166.224.140 (10.166.224.140)
Host is up (0.00038s latency).
All 1000 scanned ports on 10.166.224.140 (10.166.224.140) are filtered

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.13 seconds

(7)操作系統監測

操作系統偵測用於監測主機運行的操作系統類型及設備類型等信息。nmap擁有豐富的系統數據庫,可以識別2600多種操作系統與設備類型。如下所示:

-bash-4.2# nmap -sO 192.168.1.80

Starting Nmap 6.40 ( http://nmap.org ) at 2020-05-14 17:05 CST
Nmap scan report for 192.168.1.80 (192.168.1.80)
Host is up (0.000018s latency).
Not shown: 249 closed protocols
PROTOCOL STATE         SERVICE
1        open          icmp
2        open|filtered igmp
6        open          tcp
17       open          udp
103      open|filtered pim
136      open|filtered udplite
255      open|filtered unknown

Nmap done: 1 IP address (1 host up) scanned in 3.21 seconds

2、使用python-nmap進行端口掃描

我們在上一小節中,花f較多的篇幅介紹nmap。Python的Python-nmap僅僅趨對nmap的封裝,因此,要使用Python-nmap,必須先了解nmap。Python-nmap相對於nmap, 主要的改進在於對輸出結果的處理。Python-nmap將nmap的輸出結果保存到宇典之中,我們只需要通過Python的字典就可以獲取到nmap的輸出信息,不用像Shell腳本一樣通過字符串處理和正則表達式來解析nmap的結果。Python-nmap將nmap的強大功能與Python語言優秀的表達能力進行了完美的結合,使用Python語言豐富的數據結構保存結果,以便後續繼續進行處理,如使用Python-nmap生成相關的報告。

Python-nmap是開源的庫,因此,在使用之前需要手動進行安裝。如下所示:

pip3 install python-nmap

Python-nmap的使用非常簡單,我們只要創建一個PortScarmer對象,並調用對象的 scan方法就能夠完成基本的nmap端口掃描。如下所示:

-bash-4.2# ipython
Python 3.8.1 (default, Mar  9 2020, 12:35:12) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import nmap                                              

In [2]: nm = nmap.PortScanner()                                  

In [3]: nm.scan('192.168.1.80','22-1000')                        
Out[3]: 
{'nmap': {'command_line': 'nmap -oX - -p 22-1000 -sV 192.168.1.80',
  'scaninfo': {'tcp': {'method': 'syn', 'services': '22-1000'}},
  'scanstats': {'timestr': 'Thu May 14 17:13:44 2020',
   'elapsed': '8.15',
   'uphosts': '1',
   'downhosts': '0',
   'totalhosts': '1'}},
 'scan': {'192.168.1.80': {'hostnames': [{'name': '192.168.1.80',
     'type': 'PTR'}],
   'addresses': {'ipv4': '192.168.1.80'},
   'vendor': {},
   'status': {'state': 'up', 'reason': 'localhost-response'},
   'tcp': {22: {'state': 'open',
     'reason': 'syn-ack',
     'name': 'ssh',
     'product': 'OpenSSH',
     'version': '6.6.1',
     'extrainfo': 'protocol 2.0',
     'conf': '10',
     'cpe': 'cpe:/a:openbsd:openssh:6.6.1'},
    111: {'state': 'open',
     'reason': 'syn-ack',
     'name': 'rpcbind',
     'product': '',
     'version': '2-4',
     'extrainfo': 'RPC #100000',
     'conf': '10',
     'cpe': ''}}}}}

當我們創建PortScanner對象時,Python-nmap會檢査系統中是否已經安裝了 nmap,如果沒有安裝,拋出PortScannerError異常。調用PortScanner對象的scan方法進行掃描以後就可以通過該類的其他方法獲取本次掃描的信息。如命令行參數、主機列表、掃描的方法等。如下所示:

In [4]: nm.command_line()                                        
Out[4]: 'nmap -oX - -p 22-1000 -sV 192.168.1.80'

In [5]: nm.scaninfo()                                            
Out[5]: {'tcp': {'method': 'syn', 'services': '22-1000'}}

In [6]: nm.all_hosts()    #所有主機                                       
Out[6]: ['192.168.1.80']

Python-nmap還提供了以主機地址爲鍵,獲取單臺主機的詳細信息。包括獲取主機網絡狀態、所有的協議、所有打開的端口號,端口號對應的服務等。如下所示:

In [8]: nm['192.168.1.80'].state()                               
Out[8]: 'up'

In [9]: nm['192.168.1.80'].all_protocols()                       
Out[9]: ['tcp']

In [10]: nm.scan('47.100.98.242,127.0.0.2','21-25')              
Out[10]: 
{'nmap': {'command_line': 'nmap -oX - -p 21-25 -sV 47.100.98.242,127.0.0.2',
  'scaninfo': {'error': ['Failed to resolve "47.100.98.242,127.0.0.2".\nWARNING: No targets were specified, so 0 hosts scanned.\n'],
   'warning': ['WARNING: No targets were specified, so 0 hosts scanned.\n'],
   'tcp': {'method': 'syn', 'services': '21-25'}},
  'scanstats': {'timestr': 'Thu May 14 17:22:06 2020',
   'elapsed': '16.00',
   'uphosts': '0',
   'downhosts': '0',
   'totalhosts': '0'}},
 'scan': {}}

In [11]: nm['192.168.1.80'].key()  
Out[11]: dict_keys(['hostnames', 'addresses', 'vendor', 'status', 'tcp'])

二、使用IPy進行IP管理

在網絡設計中,首先要做的就是規劃IP地址。IP地址規劃的好壞直接影響路由算法的效率,包括網絡性能和擴展性。在IP地址規劃中,需要進行大量的IP地址計算,包括網段、網絡掩碼、廣播地址、子網數、IP類型等計算操作。在大量的計算操作中,如果沒有一個好的工具,計算IP地址是一個很無趣有容易出錯的事情。在Perl語言中,可以使用NET::IP模塊,在Python語言中,可以使用開源的IPy模塊進行操作。

1、IPy模塊介紹

IPy模塊是一個處理IP地址的模塊,它能夠自動識別IP地址的版本、IP地址的類型。使用IPy模塊,可以方便地進行IP地址的計算。

IPy模塊是第三方的開源模塊,因此,在使用之前需要進行安裝。直接使用pip安裝即可:

pip install ipy

2、IPy模塊的基本使用

IPy模塊有一個IP類,這個類幾乎可以接受任何格式的IP地址和網段。如下所示:

In [1]: import IPy 

In [2]:from IPy import IP           

In [3]: IP(0x7f000001)               
Out[3]: IP('127.0.0.1')

In [4]: IP('127.0.0.1')               
Out[4]: IP('127.0.0.1')

In [5]: IP('127.0.0.0/30')             
Out[5]: IP('127.0.0.0/30')

In [6]: IP('1080:0:0:0:8:800:200C:417A')
Out[6]: IP('1080::8:800:200c:417a')

In [7]: IP('127.0.0.0-127.255.255.255')
Out[7]: IP('127.0.0.0/8')

IP類包含了許多的方法,用來進行靈活的IP地址操作。例如:

(1)version:獲取IP地址的版本

In [9]: IP('127.0.0.0-127.255.255.255') 
Out[9]: IP('127.0.0.0/8')

In [10]: IP('10.0.0.0/8').version()  
Out[10]: 4

In [11]: IP('::1').version()        
Out[11]: 6

(2)len:得到子網IP地址的個數

In [12]: IP('127.0.0.0/30').len()    
Out[12]: 4

In [13]: IP('127.0.0.0/28').len()    
Out[13]: 16

(3)iptype:返回IP地址的類型

In [14]: IP('127.0.0.1').iptype()    
Out[14]: 'LOOPBACK'

In [15]: IP('8.8.8.8').iptype()      
Out[15]: 'PUBLIC'

(4)int:返回IP地址的整數形式

In [16]: IP('8.8.8.8').int()         
Out[16]: 134744072

(5)strHex:返回IP地址的十六進制形式

In [17]: IP('8.8.8.8').strHex()    
Out[17]: '0x8080808'

(6)strBin:返回IP地址的二進制形式

In [18]: IP('8.8.8.8').strBin()
Out[18]: '00001000000010000000100000001000'

有一個方便的函數能夠將IP轉換爲不同的格式,在工作環境中將會非常有用。例如,以數宇的形式在數據庫中存儲IP地址,在數據庫中存儲IP地址有兩種形式,第一種是以變長字符串的形式將IP地址保存到數據庫中,另一種是將IP地址轉換爲整數以後保存到數據庫中。將IP地址轉換爲整數進行存儲能夠有效地節省存儲空間,提高數據庫的存儲效率和訪問速度。因此,在最佳實踐中,我們一般將IP地址以數字的形式保存到數據庫中。需要 IP地址時,再將數字形式的IP地址轉換爲字符串格式的IP地址。這個需求十分常見,因 此,MySQL提供了兩個函數,分別用以將字符串形式的IP地址轉換爲數據格式的IP地址,以及將數字格式的IP地址轉換爲字符串形式的IP地址。如下所示:

mysql> select INET_ATON('10.166.224.14');
+----------------------------+
| INET_ATON('10.166.224.14') |
+----------------------------+
|                  178708494 |
+----------------------------+
1 row in set (0.00 sec)

mysql> select INET_NTOA('178708494');
+------------------------+
| INET_NTOA('178708494') |
+------------------------+
| 10.166.224.14          |
+------------------------+
1 row in set (0.00 sec)

除了使用MySQL自帶的函數以外,我們也可以使用IP類提供的int方法將字符串形式的IP地址轉換爲數字形式的IP地址。要將數字形式的IP地址轉換會字符串形式的IP地址,可以直接使用數字的方式創建IP對象。如下所示:

In [9]: IP('178708494')             
Out[9]: IP('10.166.224.14')

In [10]: '{0}'.format(IP("178708494"))
Out[11]: '10.166.224.14'

3、網段管理

IP類的構造函數可以接受不同格式的IP地址,也可以接受網段。如下所示:

In [1]: from IPy import IP            

In [2]: IP('127.0.0.0/24')        
Out[2]: IP('127.0.0.0/24')

In [3]: IP('127.0.0.0-127.255.255.255')
Out[3]: IP('127.0.0.0/8')

In [4]: IP('127.0.0.0/127.255.255.255')
Out[4]: IP('127.0.0.0/31')

網段包含多個IP地址,我們可以直接使用len方法或者Python內置的len函數得到網段中IP地址的個數,也可以直接使用for循環迭代網段,以此遍歷各個IP。如下所示:

In [19]: ips = IP('10.166.224.144/28')                           

In [20]: ips.len()                                               
Out[20]: 16

In [21]: len(ips)                      
Out[21]: 16

In [22]: ip = [ip for ip in ips]                                 

In [23]: ip = [ip for i in ips]                                  

In [24]: ip                                                      
Out[24]: 
[[IP('10.166.224.144'),
  IP('10.166.224.145'),
  IP('10.166.224.146'),
  IP('10.166.224.147'),
  IP('10.166.224.148'),

通過IP類,我們也可以方便地判斷一個IP是否屬於一個網段,判斷子網是否包含於另一個網段中,以及兩個網段是否有重疊。如下所示:

In [25]: '10.166.224.146' in IP('10.166.224.144/28')   
//測試ip是否在某網段內
Out[25]: True

In [16]: '10.166.224.144' in IP('10.166.224.144/28')
Out[16]: True

In [17]: IP('10.166.224.144/29') in IP('10.166.224.144/28')
Out[17]: True

In [18]: IP('10.166.224.0/28').overlaps('10.166.224.144/28')
Out[18]: 0

對於網段,我們可以方便地獲取網絡地址掩碼以及網絡的廣播地址。如下所示:

In [22]: ips.netmask()              
Out[22]: IP('255.255.255.240')

In [23]: ips.broadcast()            
Out[23]: IP('10.166.224.159')

三、使用dnspython解析DNS

1、dnspython簡介與安裝

dnspython是Python實現的一個DNS工具集,它支持幾乎所有的記錄類型,可以用於查詢、傳輸並動態更新ZONE信息,同時支持TSIG(事務簽名)驗證消息和EDNS0(擴展DNS)。使用dnspython可以代替Linux命令行下的nslookup以及dig等工具。

dnspython是第三方的開源模塊,因此,使用之前需要先進行安裝:

pip3 install dnspython

2、使用dnspython進行域名解析

dnspython提供了豐富的API,其中,高層次的API根據名稱和類型執行查詢操作,低層次的API可以直接更新ZONE信息、消息、名稱和記錄。在所有的API中,最常使用的是域名查詢。dnspython提供了一個DNS解析類resolver,使用它的query方法可以實現域名的查詢功能。

dns.resolver.query(qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)

query方法各參數的含義如下:

qname:査詢的域名;
rdtype:指定RR資源;

A:地址記錄(Address),返回域名指向的IP地址;
NS:域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設罝爲域名,不能設置爲IP地址;
MX:郵件記錄(Mail exchange),返回接收電子郵件的服務器地址;
CNAME:規範名稱記錄(Canonical Name),別名記錄,實現域名間的映射;
PTR:逆向査詢記錄(Pointer Record),反向解析,與A記錄相反,將IP地址轉換爲主機名。

rdclass:網絡類型;
tcp:指定査詢是否啓用TCP協議;
source:査詢源的地址;
source_port:査詢源的端口 ;
raise_on_no_answer:指定査詢無應答時是否觸發異常,默認爲True。

在使用dnspython查詢DNS相關信息之前,我們先簡單瞭解一下dig命令,以便對照查看Python程序的輸出結果與dig命令的輸出結果。
dig的全稱是domain information groper,它是一個靈活探測DNS的工具,可以執行DNS査找,並顯示從查詢的名稱服務器返回的答案。由於dig命令靈活易用、輸出明確, 因此,大多數DNS管理員都使用dig解決DNS問題。
在我的主機上運行dig命令査找dnspython.org域名的信息。運行結果如下:

[root@192 ~]# dig qiniu.lexizhi.com

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> qiniu.lexizhi.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35907
;; flags: qr rd ra; QUERY: 1, ANSWER: 12, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;qiniu.lexizhi.com.     IN  A

;; ANSWER SECTION:
qiniu.lexizhi.com.  5   IN  CNAME   www.lexizhi.com.qiniudns.com.
www.lexizhi.com.qiniudns.com. 5 IN  CNAME   dt003.china.line.qiniudns.com.
dt003.china.line.qiniudns.com. 5 IN CNAME   tinychinacdnweb.qiniu.com.w.kunlunno.com.
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.231
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.234
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.232
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.233
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 219.147.157.66
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.228
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.235
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.229
tinychinacdnweb.qiniu.com.w.kunlunno.com. 5 IN A 150.138.180.230

;; Query time: 633 msec
;; SERVER: 192.168.79.2#53(192.168.79.2)
;; WHEN: 一 3月 02 17:29:51 CST 2020
;; MSG SIZE  rcvd: 300

(1)在Python代碼中,可以使用dnspython查詢A記錄。如下所示:

from __future__ import print_function
import dns.resolver

data = dns.resolver.query('www.lexizhi.com', 'A')
for item in data:
    print(item)
輸出結果如下:
47.100.98.242

(2)使用dnspython實現NS記錄,查詢方法如下:

from __future__ import print_function
import dns.resolver

data = dns.resolver.query('dnspython.org', 'NS')
for item in data:
    print(item)
輸出結果如下:
ns-343.awsdns-42.com.
ns-518.awsdns-00.net.
ns-1253.awsdns-28.org.
ns-2020.awsdns-60.co.uk.

從輸出結果來看,使用dig命令或dnspython模塊都是一樣的。如果在命令行操作,建議使用dig命令。如果要使用程序管理DNS或查詢DNS的內容,則推薦使用dnspython模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章