生成动态路由轨迹图

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

在此次实践中,通过 scapy 的 traceroute() 方法实现探测机到目标服务器的路由轨迹,整个过程的原理见图3-14,首先通过探测机以 SYN 方式进行 TCP 服务扫描,同时启动 tcpdump 进行抓包,捕获扫描过程经过的所有路由点,再通过 graph() 方法进行路由 IP 轨迹绘制,中间调用 ASN 映射查询 IP 地理信息并生成 svg 流程文档,最后使用 ImageMagick 工具将 svg 格式转换成 png,流程结束。

image 2023 12 08 11 29 06 822
Figure 1. 图3-14 TCP探测目标服务路由轨迹原理图

本次实践通过 traceroute() 方法实现路由的跟踪,跟踪结果动态生成图片格式。功能实现源码如下:

scapy/simple1.py
# -*- 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")

代码运行结果见图3-15,"-" 表示路由节点无回应或超时;"11" 表示扫描的指定服务无回应;"SA" 表示扫描的指定服务有回应,一般是最后一个主机 IP。

image 2023 12 08 11 31 45 223
Figure 2. 图3-15 代码运行结果

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

image 2023 12 08 11 40 54 961
Figure 3. 图3-16 路由轨迹图

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

参考提示

scapy 方法参数说明参考 http://www.secdev.org/projects/scapy/doc/usage.html