Python利用Scapy生成动态路由轨迹图详解
本文介绍如何使用Python的Scapy库实现TCP协议的路由跟踪功能。通过配置traceroute方法参数,可探测80或443等服务的可用性,并生成SVG矢量路由图。文中详细解析了关键参数设置、代码实现及从SVG到PNG的转换流程,帮助管理员清晰掌握网络节点分布与运营商信息。
Scapy简介与安装
一、Scapy简介与安装
Scapy(http://www.secdev.org/projects/scapy/)是一款功能强大的交互式数据包处理工具,支持数据包的伪造与解包,具备发送数据包、嗅探、响应匹配等多种能力。它广泛应用于网络扫描、路由跟踪、服务探测及单元测试等场景。本文将重点介绍如何利用Scapy的路由跟踪功能,通过TCP协议探测服务(如80端口HTTP和443端口HTTPS)的可用性,并生成直观的路由线路图报表,帮助管理员清晰掌握探测点到目标主机的服务状态、骨干路由节点所在的IDC位置以及经过的运营商路由节点信息。
接下来将详细介绍具体实现步骤。
Scapy模块的安装方法如下:
# scapy模板需要tcpdump程序支持,生成报表需要graphviz、ImageMagick图像处理包支持
# yum -y install tcpdump graphviz ImageMagick
# 源码安装
# wget http://www.secdev.org/projects/scapy/files/scapy-2.2.0.tar.gz
# tar -zxvf scapy-2.2.0.tar.gz
# cd scapy-2.2.0
# python setup.py install
Scapy模块常用方法说明
二、Scapy模块常用方法说明
Scapy提供了丰富的网络数据包操作接口,包括发包send()、SYN/ACK扫描、嗅探sniff()、抓包wrpcap()以及TCP路由跟踪traceroute()等。本节重点聚焦于服务监控内容,特别是traceroute()方法,其具体定义如下:
traceroute(target, dport=80, minttl=1, maxttl=30, sport=<RandShort>, l4=None, filter=None, timeout=2, verbose=None, **kargs)
该方法用于实现TCP路由跟踪,关键参数说明如下:
target:跟踪的目标对象,可以是域名或IP,类型为列表,支持同时指定多个目标,如["www.qq.com","www.baidu.com",www.google.com.hk];
dport:目标端口,类型为列表,支持同时指定多个端口,例如[80,443];
minttl:指定路由跟踪的最小跳数(即节点数);
maxttl:指定路由跟踪的最大跳数(即节点数)。
基于TCP实现探测目标服务路由轨迹
三、基于TCP实现探测目标服务路由轨迹

本次实践利用Scapy的traceroute()方法,从探测机到目标服务器进行路由轨迹探测。整个过程原理如图所示:首先通过探测机以SYN方式扫描TCP服务,同时启动tcpdump进行抓包,捕获扫描过程中经过的所有路由点;随后调用graph()方法绘制路由IP轨迹,中间调用ASN映射查询IP地理信息并生成SVG流程文档;最后使用ImageMagick工具将SVG格式转换为PNG格式,流程结束。
本次实践通过traceroute()方法实现路由跟踪,结果动态生成图片格式。功能实现源码如下:
# -*- coding: utf-8 -*-
import os,sys,time,subprocess
import warnings,logging
warnings.filterwarnings("ignore", category=DeprecationWarning) #屏蔽scapy无用告警信息
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) #屏蔽模块IPv6多余告警
from scapy.all import traceroute
domains = raw_input('Please input one or more IP/domain: ') #接受输入的域名或IP
target = domains.split(' ')
dport = [80] #扫描的端口列表
if len(target) >= 1 and target[0]!='':
res,unans = traceroute(target,dport=dport,retry=-2) #启动路由跟踪
res.graph(target="> test.svg") #生成svg矢量图形
time.sleep(1)
subprocess.Popen("/usr/bin/convert test.svg test.png", shell=True) #svg转png格式
else:
print "IP/domain number of errors,exit"
代码运行结果如图所示,“-”表示路由节点无回应或超时;“11”表示扫描的指定服务无回应;“SA”表示扫描的指定服务有回应,通常对应最后一个主机IP。

生成的路由轨迹图如图所示(仅局部),“-”将使用unk*单元代替,重点路由节点将通过ASN获取其所处的运营商或IDC位置。例如IP“202.102.69.210”对应“CHINANET-JS-AS-AP AS Number for CHINANET jiangsu province backbone,CN”,意为该IP位于中国电信江苏省骨干网。

通过路由轨迹图,我们可以清晰地看到探测点到目标节点的路由走向。运营商常进行路由节点分流,可能导致所选路由并非最优,该视图有助于了解这一情况。此外,IE8及以上版本及Chrome浏览器均支持SVG格式文件,可直接浏览,无需转换为PNG或其他格式,便于轻松整合至运营平台中。
本文出自《Python自动化运维 技术与最佳实践》
以上这篇Python之——生成动态路由轨迹图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













