Python利用Scapy生成动态路由轨迹图详解

Felix
Felix
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何使用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之——生成动态路由轨迹图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。