# 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](../../_static/Landslide_Architecture.png) ### 使用方法 **登录** 使用 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](../../_static/Trex_Architecture.png) ### 安装 需要配置大页为 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](../../_static/Trex_Result.png) ## 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](../../_static/Scapy_Architecture.png) ### 安装 ``` $ 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。