Python之——生成动态路由轨迹图的实例


Posted in Python onNovember 22, 2019

一、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模块提供了众多网络数据包操作的方法,包括发包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实现探测目标服务路由轨迹

Python之——生成动态路由轨迹图的实例

在此次实践中,通过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。

Python之——生成动态路由轨迹图的实例

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

Python之——生成动态路由轨迹图的实例

通过路由轨迹图,我们可以非常清晰地看到探测点到目标节点的路由走向,运营商时常会做路由节点分流,不排除会造成选择的路由线路不是最优的,该视图可以帮助我们了解到这个信息。另外IE8以上及chrome浏览器都已支持SVG格式文件,可以直接浏览,无需转换成png或其他格式,可以轻松整合到我们的运营平台当中。

本文出自《Python自动化运维 技术与最佳实践》

以上这篇Python之——生成动态路由轨迹图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中实现贪婪排名算法的教程
Apr 17 Python
Python2中的raw_input() 与 input()
Jun 12 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
简单谈谈python中的lambda表达式
Jan 19 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
python内置模块collections知识点总结
Dec 19 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
解析目标检测之IoU
Jun 26 Python
python:动态路由的Flask程序代码
Nov 22 #Python
python判断无向图环是否存在的示例
Nov 22 #Python
python计算无向图节点度的实例代码
Nov 22 #Python
Python字符串格式化输出代码实例
Nov 22 #Python
python常用数据重复项处理方法
Nov 22 #Python
Python pickle模块实现对象序列化
Nov 22 #Python
python绘制无向图度分布曲线示例
Nov 22 #Python
You might like
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python datetime包函数简单介绍
2019/08/28 Python
Python 切分数组实例解析
2019/11/07 Python
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
高中生班主任评语
2014/04/25 职场文书
班主任寄语2016
2015/12/04 职场文书
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL