UPF 调试工具

Landslide

介绍

Landslide 仪表 5G 实验室内一款可以通过同时模拟 N3,N4,N6 接口对 UPF 进行包围测试的仪表,部署形态为虚拟机。部署在北京机房物理机(172.18.22.105)上,由两台虚拟机组成。

Landslide 仪表具有模拟多 UE 入网,自定义 N4 交互,模拟基站发包,模拟多种协议的上下行流量,模拟 UE 移动管理报文交互等功能;在压力测试方面,实验室版本最高支持 2Gb/s 速率,单个 UE 最高 1000 pps;除了 5G GTPU,还可以直接用来模拟其他协议流量。

TAS:172.18.22.147 管理机,提供 Java 程序客户端,支持编辑 N3,N4,N6 报文,提供抓包文件下载。

TS:172.18.22.145 打流机,打具体流量。

系统登录:cfguser/cfguser

架构图

可以通过 TAS 设置网口地址

Landslide_Architecture

使用方法

登录

使用 IE 浏览器访问:http://172.18.22.147;选择 Landslide Client,需要 Java 运行环境;

弹出框用户名/密码:sms/a1b2c3d4;通过创建 Session 和使用导入的 Session 进行测试;

访问 http://172.18.22.147/results.cgi?sms 下载抓包文件;

Trex

介绍

Trex (真实流量生成器)是一个由 DPDK 提供支持开源、低成本、有状态和无状态的流量生成器,支持 L3-7 层。

TRex Stateless 功能包括对多个流的支持、更改任何数据包字段的能力,并提供每个流/组延迟和抖动的统计信息。高级有状态功能包括对模拟 L7 流量的支持,以及功能齐全的可扩展 TCP/UDP 支持;TRex 仿真功能包括 ARP、IPv6、ND、MLD、IGMP、ICMP、DOT1X、DCHPv4、DHCPv6、DNS 协议,且可以模拟客户端和服务器。TRex 可以在一台服务器上达到 200Gb/s。

在 UPF 测试过程中,我们通常用来使用 Trex 进行报文回放和压力测试。

架构图

在进行压力测试时,通常和 Landslide 配合使用,先由 Landslide 模拟 100 UE 上线后对外访问的 UDP 报文。然后获取到抓包文件后进行编辑,去掉不需要的报文。

报文准备完毕后,需要按架构图连线。

Trex_Architecture

安装

需要配置大页为 1G;直接 https://trex-tgn.cisco.com/trex/release 下载对应版本解压即可。

使用方法

通过 Landslide 模拟 100 UE 上线后,在 Trex 进行压力测试;将准备好的 GTPU 报文放在 stl 文件夹下,编写测试脚本;

upf_test.py 使用 upf_test.pcap 进行报文回放,通过调整 ipg_usec 和 loop_count 调整发包数和速率。

import os
from trex_stl_lib.api import *
import argparse


# PCAP profile
class STLPcap(object):

    def __init__ (self, pcap_file):
        self.pcap_file = pcap_file

    def get_streams (self, tunables, **kwargs):
        parser = argparse.ArgumentParser(description='Argparser for {}'.format(os.path.basename(__file__)), 
                                         formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        parser.add_argument('--ipg_usec',
                            type=float,
                            default=0.1, # 可通过调整 gap 加快发包速率
                            help="Inter-packet gap in microseconds.")
        parser.add_argument('--loop_count',
                            type=int,
                            default=4000000000,
                            help="How many times to transmit the cap")
        args = parser.parse_args(tunables)
        profile = STLProfile.load_pcap(self.pcap_file, ipg_usec = args.ipg_usec, loop_count = args.loop_count)

        return profile.get_streams()



# dynamic load - used for trex console or simulator
def register():
    # get file relative to profile dir
    return STLPcap(os.path.join(os.path.dirname(__file__), 'upf_test.pcap'))

配置文件;

本例使用 v2.92 版本,配置文件如下:
interface:指定 网卡 pci号,本例 00:03.0 为 port0, 00:0a.0 为 port1
注:测试三层流量时,trex 启动时会首先发起 arp 获取 default_gw 的 mac,获取到 mac 后,才会正常启动。

root@upfastri:~# cat /etc/trex_cfg.yaml 
- port_limit: 2
  version: 2
  interfaces: ['00:03.0', '00:0a.0']
  port_bandwidth_gb: 10
  port_info:
      - ip: 192.168.3.110
        default_gw: 192.168.3.100
      - ip: 192.168.3.100
        default_gw: 192.168.3.110

在第一个窗口运行下面命令,初始化 port 接口配置 dpdk,启动 Trex。

$ ./t-rex-64 -i --no-scapy-server

在新窗口运行下面命令进入控制端

$ ./trex-console

控制端有如下命令

$ start -f ./stl/upf_test.py -p 0		// port 0 作为发包口运行 upf_test.py 脚本测试
$ connect		// 连接 trex
$ stop			// 停止发包
$ release		// 释放端口
$ acquire		// 获取端口
$ tui			// 进入数据展示页面

展示图如下

Trex_Result

Scapy

介绍

Scapy 是一个 Python 程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具。Scapy 是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据包,通过线路发送,捕获它们,匹配请求和回复等等。Scapy 可以轻松处理大多数经典任务,如扫描,跟踪路由,探测,单元测试,攻击或网络发现。它可以取代 hping,arpspoof,arp-sk,arping,p0f 甚至是 Nmap,tcpdump 和 tshark 的某些部分。相对于其他网络工具,scapy 最大的特点是它可以构建无法想象的东西,不必有特定的目标。

在未覆盖时,Scapy 尝试为所有数据包字段使用合理的默认值

  • 根据目的地和路由表选择IP源

  • 计算校验和

  • 根据输出接口选择源MAC

  • 以太网类型和IP协议由上层决定

我们可以使用 scapy 构造 GTPU 报文,包括其中的 Extension Header,Teid 等内容。

架构图

通常测试时 Scapy 和 DPDK testpmd 一起使用,设置 testpmd RSS flow 和 Hash fields 等。

Scapy_Architecture

安装

$ git clone https://github.com/secdev/scapy.git
$ sudo python3 setup.py install

使用方法

接线完成后运行,根据层数设置对应的字典组装报文,然后指定接口发送。

$ scapy
// 支持 GTPU 和 SessionContainer
$ from scapy.contrib.gtp import GTP_U_Header as GTP_U_Header
$ from scapy.contrib.gtp import GTPPDUSessionContainer as GTPPDUSessionContainer
$ p=Ether(src='11:11:22:22:33:33',dst='44:44:55:55:66:66')/IP(src='1.1.1.1',dst='2.2.2.2')/UDP(sport=2152,dport=2152)/GTP_U_Header(teid=0x2)/GTPPDUSessionContainer(QFI=1,type=1)/IP(src='3.3.3.1',dst='4.4.4.1')/UDP(sport=2000,dport=3000)/Raw('x'*20)
$ sendp(p, iface='ens3')

sendp 后,对端 testpmd 可以接收到如下报文

Source IP                1.1.1.1
Destination IP           2.2.2.2
IP Protocol              17 (UDP)
GTP Source Port          2152
GTP Destination Port     2152
GTP Message type         0xFF
GTP Tunnel id            0x2
GTP PDU Type			 1	(UL PDU Session)
GTP QFI					 1
-- Inner IPv4 Configuration --------------
Source IP                3.3.3.1
Destination IP           4.4.4.1
IP Protocol              17 (UDP)
UDP Source Port          2000
UDP Destination Port     3000

TS

Trex 启动报错

报错信息如下

Failed resolving dest MAC for default gateway:192.168.3.100 on port 0
Failed resolving dest MAC for default gateway:192.168.6.100 on port 1

原因

UPF 接口 dpdk 驱动为 VFIO-PCI,Trex 默认为接口设置 IGB_UIO,驱动不同。

解决方案

先通过 ./dpdk-devbind.py 设置 Trex 接口绑定的驱动为 VFIO-PCI 后再启动 Trex。