TRex 支持使用称为“客户端集群”的功能测试具有多个 DUT 的复杂拓扑。此功能允许指定 TRex 模拟的客户端的分布。
考虑以下拓扑:
有两个 DUT 集群。使用配置文件,您可以将 TRex 模拟客户端划分为组,并定义它们将如何在 DUT 集群之间传播。
组配置包括:
IP 起始范围。
IP 结束范围。
发起端配置:影响从客户端发送的数据包的参数。
响应端配置:影响从服务器端发送的数据包的参数。
重要的是要了解这是对每个配置文件配置的客户端生成器的补充。它只定义客户端将如何在集群之间传播。
在以下示例中,配置文件定义了客户端生成器。
- [bash]>cat cap2/dns.yaml
- - duration : 10.0
- generator :
- distribution : "seq"
- clients_start : "16.0.0.1"
- clients_end : "16.0.0.255"
- servers_start : "48.0.0.1"
- servers_end : "48.0.0.255"
- dual_port_mask : "1.0.0.0"
- cap_info :
- - name: cap2/dns.pcap
- cps : 1.0
- ipg : 10000
- rtt : 10000
- w : 1
目标:
分别创建具有 4 个和 3 个设备的两个集群。
将80%的流量发送到上层集群,将20%的流量发送到下层集群。通过 MAC 地址或 IP 指定数据包将发送到的 DUT。(以下示例使用 MAC 地址。示例后面的说明指示如何更改为基于 IP。)
创建以下集群配置文件:
- #
- # Client configuration example file
- # The file must contain the following fields
- #
- # 'vlan' - if the entire configuration uses VLAN,
- # each client group must include vlan
- # configuration
- #
- # 'groups' - each client group must contain range of IPs
- # and initiator and responder section
- # 'count' represents the number of different DUTs
- # in the group.
- #
-
- # 'true' means each group must contain VLAN configuration. 'false' means no VLAN config allowed.
- vlan: true
-
- groups:
-
- - ip_start : 16.0.0.1
- ip_end : 16.0.0.204
- initiator :
- vlan : 100
- dst_mac : "00:00:00:01:00:00"
- responder :
- vlan : 200
- dst_mac : "00:00:00:02:00:00"
-
- count : 4
-
- - ip_start : 16.0.0.205
- ip_end : 16.0.0.255
- initiator :
- vlan : 101
- dst_mac : "00:00:01:00:00:00"
-
- responder:
- vlan : 201
- dst_mac : "00:00:02:00:00:00"
-
- count : 3
上述配置将 255 个客户端的生成器范围划分为两个集群。客户端配置文件中所有组中的 IP 范围必须涵盖流量配置文件中的整个客户端 IP 范围。
MAC 地址将被增量分配,在“计数”地址之后有一个环绕。
例子:
发起方(16.xxx 网络中源的数据包):
16.0.0.1 → 48.xxx - dst_mac: 00:00:00:01:00:00 vlan: 100
16.0.0.2 → 48.xxx - dst_mac: 00:00:00:01:00:01 vlan: 100
16.0.0.3 → 48.xxx - dst_mac: 00:00:00:01:00:02 vlan: 100
16.0.0.4 → 48.xxx - dst_mac: 00:00:00:01:00:03 vlan: 100
16.0.0.5 → 48.xxx - dst_mac: 00:00:00:01:00:00 vlan: 100
16.0.0.6 → 48.xxx - dst_mac: 00:00:00:01:00:01 vlan: 100
响应方(48.xxx 网络中具有源的数据包):
48.xxx → 16.0.0.1 - dst_mac(来自响应者):“00:00:00:02:00:00”,vlan:200
48.xxx → 16.0.0.2 - dst_mac(来自响应者):“00:00:00:02:00:01”,vlan:200
等等。
DUT 的 MAC 地址必须更改为连续的。另一种选择是将:替换 dst_mac : <ip-address>
为:next_hop : <ip-address>
例如,配置文件中的第一组是:
- - ip_start : 16.0.0.1
- ip_end : 16.0.0.204
- initiator :
- vlan : 100
- next_hop : 1.1.1.1
- src_ip : 1.1.1.100
- responder :
- vlan : 200
- next_hop : 2.2.2.1
- src_ip : 2.2.2.100
-
- count : 4
在这种情况下,TRex 尝试使用 ARP 解析以下地址:
1.1.1.1、1.1.1.2、1.1.1.3、1.1.1.4(和范围 2.2.2.1-2.2.2.4)
如果没有解析所有 IP,TRex 将退出并显示错误消息。
src_ip用于发送无偿ARP,以及填写ARP请求中的相关字段。如果没有src_ip给出,TRex 在平台配置文件 (/etc/trex_cfg.yaml) 的相关端口部分中查找源 IP。如果没有找到,TRex 将退出并显示错误消息。
如果给定客户端配置文件,TRex 会忽略平台配置文件中的dest_mac和default_gw参数。
现在,流将如下所示:
发起方(16.xxx 网络中源的数据包):
16.0.0.1 → 48.xxx - dst_mac:1.1.1.1 vlan 的 MAC:100
16.0.0.2 → 48.xxx - dst_mac:1.1.1.2 vlan 的 MAC:100
16.0.0.3 → 48.xxx - dst_mac:1.1.1.3 vlan 的 MAC:100
16.0.0.4 → 48.xxx - dst_mac:1.1.1.4 vlan 的 MAC:100
16.0.0.5 → 48.xxx - dst_mac:1.1.1.1 vlan 的 MAC:100
16.0.0.6 → 48.xxx - dst_mac:1.1.1.2 vlan 的 MAC:100
响应方(48.xxx 网络中具有源的数据包):
48.xxx → 16.0.0.1 - dst_mac:2.2.2.1 的 MAC,vlan:200
48.xxx → 16.0.0.2 - dst_mac:2.2.2.2 的 MAC,vlan:200
重要的是要了解 IP 到 MAC 的耦合(使用基于 MAC 或基于 IP 的配置)在开始时完成并且永远不会改变。例如,在基于 MAC 的配置中:
源 IP 为 16.0.0.2 的数据包将始终具有 VLAN 100 和 dst MAC 00:00:00:01:00:01。
目标 IP 为 16.0.0.2 的数据包将始终具有 VLAN 200 和 dst MAC 00:00:00:02:00:01。
因此,您可以准确预测哪个数据包(以及多少数据包)将发送到每个 DUT。
用法:
[bash]>sudo ./t-rex-64 -f cap2/dns.yaml --client_cfg my_cfg.yaml
集群模式的延迟
延迟流客户端 IP 取自默认客户端池中的第一个 IP。每个双端口将有一个客户端 IP。在集群配置的情况下,这是一个限制,因为您可以拥有具有许多路径的拓扑。
流量配置概括
- - duration : 10.0
- generator :
- distribution : "seq"
- clients_start : "16.0.0.1"
- clients_end : "16.0.0.255"
- servers_start : "48.0.0.1"
- servers_end : "48.0.0.255"
- dual_port_mask : "1.0.0.0"
- cap_info :
- - name: cap2/dns.pcap
- cps : 1.0
- ipg : 10000
- rtt : 10000
- w : 1
集群配置文件
- vlan: true
-
- groups:
-
- - ip_start : 16.0.0.1
- ip_end : 16.0.0.204
- initiator :
- vlan : 100
- dst_mac : "00:00:00:01:00:00"
- responder :
- vlan : 200
- dst_mac : "00:00:00:02:00:00"
-
- count : 4
例如,在这种情况下,16.0.0.1→48.0.0.1 ICMP 将是延迟的流。此流的集群配置将取自集群文件( VLAN=100, dst_mac : "00:00:00:01:00:00" )
聚类示例
在此示例中,我们有一个具有四个 10GB 接口的 DUT 和一个具有两个 40Gb/秒接口的 TRex,我们希望将流量从 2 个 TRex 接口转换为 4 个 DUT 接口。下图显示了拓扑
对于此拓扑,创建了以下流量和集群配置文件
流量配置概括
- - duration : 10.0
- generator :
- distribution : "seq"
- clients_start : "12.1.1.1" 1
- clients_end : "12.1.1.1"
- servers_start : "13.1.1.1"
- servers_end : "13.1.1.1"
- dual_port_mask : "0.1.0.0"
- generator_clients :
- - name : "c1" 2
- distribution : "seq"
- ip_start : "12.1.1.2"
- ip_end : "12.1.1.255"
- - name : "c2"
- distribution : "seq" 3
- ip_start : "12.1.2.1"
- ip_end : "12.1.2.255"
- generator_servers :
- - name : "s1"
- distribution : "seq"
- ip_start : "13.1.1.2"
- ip_end : "13.1.1.255"
- - name : "s2"
- distribution : "seq"
- ip_start : "13.1.2.1"
- ip_end : "13.1.2.255"
- cap_ipg : true
- cap_info :
- - name: file10k.pcap
- client_pool : "c2"
- server_pool : "s2"
- cps : 1
- ipg : 20000
- rtt : 20000
- w : 1
- - name: file10k.pcap
- client_pool : "c1"
- server_pool : "s1"
- cps : 1
- ipg : 20000
- rtt: 20000
- w : 1
说明:
1、延迟流将为 IP 12.1.1.1<→13.1.1.1/vlan=4050/next-hop=11.10.0.1
2、第一个客户池
3、第二个客户池
集群配置文件
- lan: true
-
- groups:
-
- - ip_start : 12.1.1.1 1
- ip_end : 12.1.1.255
- initiator :
- vlan : 4050
- next_hop : 11.10.0.1
- src_ip : 11.10.0.11
- responder :
- vlan : 4054
- next_hop : 10.10.0.1
- src_ip : 10.10.0.11
- count : 1
-
- - ip_start : 12.1.2.1
- ip_end : 12.1.2.255
- initiator :
- vlan : 4051
- next_hop : 11.10.0.2
- src_ip : 11.10.0.11
- responder :
- vlan : 4055
- next_hop : 10.10.0.2
- src_ip : 10.10.0.11
- count : 1
来自客户端池和默认池的所有IP 都应映射到此文件中,集群文件中可能有更广泛的范围
下图显示了如何使用集群文件选择新流 src_ip/dest_ip/next-hop/vlan
集群示例

延迟流将仅检查 12.1.1.1/4050 路径(一个 DUT 接口) 在当前版本中无法检查所有端口的延迟。
DUT 应该有一个静态路由来将数据包从客户端移动到服务器,反之亦然,因为流量不在端口的同一子网中。
一个流生成的示例
下一跳重定位。TRex 解析所有下一跳选项,例如 11.10.0.1/4050 11.11.0.1/4051
按 CPS 选择模板,每个模板的概率为 50%。获取模板#1
SRC_IP=12.1.1.2, DEST_IP=13.1.1.2
为12.1.1.2分配src_port =⇒src_port=1025为client=12.1.1.2的第一流
关联集群池中的下一跳。在这种情况下,12.1.1.2 具有以下信息 5.1 客户端:VLAN=4050 和 11.10.0.1(发起者)的 MAC 5.2 服务器端:VLAN=4054 和 10.10.0.1(响应者)的 MAC
使用 FirePower 和 NAT 学习和校验和卸载来运行它
[bash]>sudo ./t-rex-64 -f profile.yaml --client_cfg cluster.yaml -m 10 -d 1000 -l 1000 --l-pkt-mode 2 --learn-mode 1 --checksum-offload
集群示例 - 四个端口
在这个例子中,TRex 有两个双端口。我们可以使用流量掩码来区分ip范围。

profile 文件和上一个类似,不同的是我们需要在 cluster 文件中添加更多的映射。可以在配置中的另一条路径上测试延迟。
Traffic profile
- - duration : 10.0
- generator :
- distribution : "seq"
- clients_start : "12.1.1.1"
- clients_end : "12.1.1.1"
- servers_start : "13.1.1.1"
- servers_end : "13.1.1.1"
- dual_port_mask : "0.1.0.0" 1
- generator_clients :
- - name : "c1"
- distribution : "seq"
- ip_start : "12.1.1.2"
- ip_end : "12.1.1.255"
- - name : "c2"
- distribution : "seq"
- ip_start : "12.1.2.1"
- ip_end : "12.1.2.255"
- generator_servers :
- - name : "s1"
- distribution : "seq"
- ip_start : "13.1.1.2"
- ip_end : "13.1.1.255"
- - name : "s2"
- distribution : "seq"
- ip_start : "13.1.2.1"
- ip_end : "13.1.2.255"
- cap_ipg : true
- cap_info :
- - name: file10k.pcap
- client_pool : "c2"
- server_pool : "s2"
- cps : 1
- ipg : 20000
- rtt : 20000
- w : 1
- - name: file10k.pcap
- client_pool : "c1"
- server_pool : "s1"
- cps : 1
- ipg : 20000
- rtt: 20000
- w : 1
说明:
1、掩码为 0.1.0.0
集群配置文件
- lan: true
-
- groups:
-
- - ip_start : 12.1.1.1
- ip_end : 12.1.1.255
- initiator :
- vlan : 4050
- next_hop : 11.10.0.1
- src_ip : 11.10.0.11
- responder :
- vlan : 4054
- next_hop : 10.10.0.1
- src_ip : 10.10.0.11
- count : 1
-
- - ip_start : 12.1.2.1
- ip_end : 12.1.2.255
- initiator :
- vlan : 4051
- next_hop : 11.10.0.2
- src_ip : 11.10.0.11
- responder :
- vlan : 4055
- next_hop : 10.10.0.2
- src_ip : 10.10.0.11
- count : 1
-
- - ip_start : 12.2.1.1 1
- ip_end : 12.2.1.255
- initiator :
- vlan : 4060
- next_hop : 11.10.0.3
- src_ip : 11.10.0.11
- responder :
- vlan : 4064
- next_hop : 10.10.0.3
- src_ip : 10.10.0.11
- count : 1
-
-
- - ip_start : 12.2.2.1
- ip_end : 12.2.2.255
- initiator :
- vlan : 4061
- next_hop : 11.10.0.4
- src_ip : 11.10.0.11
- responder :
- vlan : 4065
- next_hop : 10.10.0.4
- src_ip : 10.10.0.11
- count : 1
说明:
1、我们添加了更多集群,因为将生成更多 IP(+掩码)
TRex 可以学习动态 NAT/PAT 转换。要启用此功能,请
--learn-mode <mode>
在命令行中使用开关。为了学习 NAT 转换,TRex 必须在每个流的第一个数据包中嵌入描述数据包属于哪个流的信息。TRex 可以使用多种方法中的一种来执行此操作,具体取决于所选的 <mode>。
模式一:
--learn-mode 1
TCP 流:流信息嵌入在第一个 TCP SYN 的 ACK 中。
UDP 流:流信息嵌入在流中第一个数据包的 IP 标识字段中。
此模式是为测试带有防火墙的 NAT(通常不适用于模式 2)而开发的。在这种模式下,TRex 还学习和补偿可能由 DUT 完成的 TCP 序列号随机化。TRex 可以在连接的两个方向学习和补偿 seq num 随机化。
模式二:
--learn-mode 2
流信息被添加到一个特殊的 IPv4 选项头中(8 字节长 0x10 id)。此选项标头仅添加到流中的第一个数据包。此模式不适用于丢弃带有 IP 选项的数据包的 DUT(例如 Cisco ASA 防火墙)。
模式三:
--learn-mode 3
与模式1类似,但TRex不学习服务器→客户端方向的seq num随机化。这种模式可以提供比模式 1 更好的每秒连接数性能。但是对于所有现有的防火墙,模式 1 cps 速率就足够了。
例子
简单的 HTTP 流量
[bash]>sudo ./t-rex-64 -f cap2/http_simple.yaml -c 4 -l 1000 -d 100000 -m 30 --learn-mode 1
没有捆绑/ALG 支持的 SFR 流量
[bash]>sudo ./t-rex-64 -f avl/sfr_delay_10_1g_no_bundling.yaml -c 4 -l 1000 -d 100000 -m 10 --learn-mode 2
NAT 终端计数器:
- -Global stats enabled
- Cpu Utilization : 0.6 % 33.4 Gb/core
- Platform_factor : 1.0
- Total-Tx : 3.77 Gbps NAT time out : 917 1 (0 in wait for syn+ack) 5
- Total-Rx : 3.77 Gbps NAT aged flow id: 0 2
- Total-PPS : 505.72 Kpps Total NAT active: 163 3 (12 waiting for syn) 6
- Total-CPS : 13.43 Kcps Total NAT opened: 82677 4
说明:
1、TRex 必须为其发送流中的下一个数据包但尚未学习 NAT 转换的连接数。应该为 0。通常,如果 DUT 丢弃流(可能是因为它无法处理连接数),则会看到一个不同于 0 的值。
2、到 TRex 收到转换信息时,流已经老化的流数。0 以外的值很少见。仅当 DUT 输入/输出队列中的延迟非常高时才会发生。
3、TRex 在学习 NAT 转换之前为其发送第一个数据包的流数。该值取决于每秒连接速率和往返时间。
4、TRex 实例生命周期内的翻译总数。如果模板是单向的(因此不需要翻译),则可能与流的总数不同。
5、在超时流中,等待从 SYN+ACK 数据包中学习服务器→客户端的 TCP seq num 随机化时超时的数量。仅在 --learn-mode 1 中可见。
6、在活动的 NAT 会话中,等待从 SYN 数据包中学习客户端→服务器转换的数量。(其他人正在等待来自服务器的 SYN+ACK。)仅在 --learn-mode 1 中可见。
Cisco ASR1000 系列的配置:
此功能已使用以下配置和
sfr_delay_10_1g_no_bundling.yaml
流量配置文件进行了测试。客户端地址范围是 16.0.0.1 到 16.0.0.255
- interface TenGigabitEthernet1/0/0 1
- mac-address 0000.0001.0000
- mtu 4000
- ip address 11.11.11.11 255.255.255.0
- ip policy route-map p1_to_p2
- ip nat inside 2
- load-interval 30
- !
-
- interface TenGigabitEthernet1/1/0
- mac-address 0000.0001.0000
- mtu 4000
- ip address 11.11.11.11 255.255.255.0
- ip policy route-map p1_to_p2
- ip nat outside 3
- load-interval 30
-
- ip nat pool my 200.0.0.0 200.0.0.255 netmask 255.255.255.0 4
-
- ip nat inside source list 7 pool my overload
- access-list 7 permit 16.0.0.0 0.0.0.255 5
-
- ip nat inside source list 8 pool my overload 6
- access-list 8 permit 17.0.0.0 0.0.0.255
说明:
1、必须连接到 TRex 客户端端口(路由器内部端口)
2、NAT 内部
3、NAT 外部
4、超载的外部地址池
5、匹配 TRex YAML 客户端范围
6、如果是双端口 TRex
限制:
路由器上不存在 IPv6-IPv6 NAT 功能,因此该功能仅适用于 IPv4。
不支持 NAT64。
不完全支持捆绑/插件。因此, sfr_delay_10.yaml 不起作用。请改用 sfr_delay_10_no_bundling.yaml。
--learn-verify是用于测试 TRex 学习机制的 TRex 调试机制。
当 DUT 配置为没有 NAT 时需要运行它。它将验证 inside_ip==outside_ip 和 inside_port==outside_port。