用Python和Scapy實現traceroute路由追蹤


筆者的配置環境

  • windows10
  • python3.6.1
  • pycharm2018
  • scapy2.4.2

需要的支持

Graphviz和ImageMagick的應用程序,而非python的模塊

第一步:安裝scapy

直接pip install scapy即可

第二步:安裝Graphviz和ImageMagick

注:鏈接進不去的話搭配請搭配梯子

第三步:添加環境變量

分別給Graphviz和ImageMagick添加環境變量

這點很重要!!!!沒有添加的話將無法使用traceroute中的graph函數繪制追蹤圖。

  • 筆者添加的Graphviz的環境變量路徑如下 C:\Program Files (x86)\Graphviz2.38\bin
  • 筆者添加的ImageMagick的環境變量路徑 C:\Program Files\ImageMagick-7.0.8-Q16

第四步:測試

直接上代碼:

import os,sys,time,subprocess
from scapy.as_resolvers import AS_resolver_radb  
from scapy.all import traceroute
domains='www.baidu.com'
target = domains.split(' ')
dport = [80]
if len(target) >= 1 and target[0] != '':
	# 啟動路由跟蹤
	res, unans = traceroute(domains, dport=dport, retry=-2)
	# traceroute生成的信息繪制成svg
	res.graph(target="> graph.svg", ASres=AS_resolver_radb(), type="svg") # ASres=AS_resolver_radb()改變為可用的whois提供商,而非原來的ASres=None后默認的被qiang了的提供商
	time.sleep(1)
	# svg 轉格式為 png
	#subprocess.Popen("/usr/local/bin/convert test.svg test.png", shell=True)
else:
    print("IP/domain number of errors, exit")

結果如下:

Begin emission:
********Finished sending 30 packets.
**************Begin emission:
Finished sending 8 packets.
Begin emission:
Finished sending 8 packets.

Received 22 packets, got 22 answers, remaining 7 packets
   183.232.231.174:tcp80 
1  10.21.123.254   11    
2  172.16.9.254    11    
3  10.32.254.2     11    
4  10.32.254.10    11    
5  10.36.254.18    11    
6  10.0.1.6        11    
7  111.59.124.129  11    
9  111.12.4.124    11    
17 183.232.231.174 SA    
18 183.232.231.174 SA    
19 183.232.231.174 SA    
20 183.232.231.174 SA    
21 183.232.231.174 SA    
22 183.232.231.174 SA    
23 183.232.231.174 SA    
24 183.232.231.174 SA    
25 183.232.231.174 SA    
26 183.232.231.174 SA    
27 183.232.231.174 SA    
28 183.232.231.174 SA    
29 183.232.231.174 SA    
30 183.232.231.174 SA  

生成svg的圖片

路由跟蹤圖

遇到的問題以及解決方法

報錯類型為

RuntimeError: Could not contact whois providers

想了解詳細原因的請移步 https://www.oschina.net/question/2917603_2278439 圍觀最下面的okidingme的回答。

解決辦法,請看筆者給出的代碼:

from scapy.as_resolvers import AS_resolver_radb  
res.graph(target="> graph.svg", ASres=AS_resolver_radb(), type="svg")

ASres=AS_resolver_radb()改變為可用的whois提供商,而非原來的ASres=None后默認的被qiang了的提供商


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM