• TRex学习之旅九


    客户端集群与NAT配置

    客户端集群配置

    TRex 支持使用称为“客户端集群”的功能测试具有多个 DUT 的复杂拓扑。此功能允许指定 TRex 模拟的客户端的分布。

    考虑以下拓扑:

    有两个 DUT 集群。使用配置文件,您可以将 TRex 模拟客户端划分为组,并定义它们将如何在 DUT 集群之间传播。

    组配置包括:

    • IP 起始范围。

    • IP 结束范围。

    • 发起端配置:影响从客户端发送的数据包的参数。

    • 响应端配置:影响从服务器端发送的数据包的参数。

    重要的是要了解这是对每个配置文件配置的客户端生成器的补充。它只定义客户端将如何在集群之间传播。

    在以下示例中,配置文件定义了客户端生成器。

    1. [bash]>cat cap2/dns.yaml
    2. - duration : 10.0
    3. generator :
    4. distribution : "seq"
    5. clients_start : "16.0.0.1"
    6. clients_end : "16.0.0.255"
    7. servers_start : "48.0.0.1"
    8. servers_end : "48.0.0.255"
    9. dual_port_mask : "1.0.0.0"
    10. cap_info :
    11. - name: cap2/dns.pcap
    12. cps : 1.0
    13. ipg : 10000
    14. rtt : 10000
    15. w : 1

    目标:

    • 分别创建具有 4 个和 3 个设备的两个集群。

    • 80%的流量发送到上层集群,将20%的流量发送到下层集群。通过 MAC 地址或 IP 指定数据包将发送到的 DUT。(以下示例使用 MAC 地址。示例后面的说明指示如何更改为基于 IP。)

    创建以下集群配置文件:

    1. #
    2. # Client configuration example file
    3. # The file must contain the following fields
    4. #
    5. # 'vlan' - if the entire configuration uses VLAN,
    6. # each client group must include vlan
    7. # configuration
    8. #
    9. # 'groups' - each client group must contain range of IPs
    10. # and initiator and responder section
    11. # 'count' represents the number of different DUTs
    12. # in the group.
    13. #
    14. # 'true' means each group must contain VLAN configuration. 'false' means no VLAN config allowed.
    15. vlan: true
    16. groups:
    17. - ip_start : 16.0.0.1
    18. ip_end : 16.0.0.204
    19. initiator :
    20. vlan : 100
    21. dst_mac : "00:00:00:01:00:00"
    22. responder :
    23. vlan : 200
    24. dst_mac : "00:00:00:02:00:00"
    25. count : 4
    26. - ip_start : 16.0.0.205
    27. ip_end : 16.0.0.255
    28. initiator :
    29. vlan : 101
    30. dst_mac : "00:00:01:00:00:00"
    31. responder:
    32. vlan : 201
    33. dst_mac : "00:00:02:00:00:00"
    34. 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>

    例如,配置文件中的第一组是:

    1. - ip_start : 16.0.0.1
    2. ip_end : 16.0.0.204
    3. initiator :
    4. vlan : 100
    5. next_hop : 1.1.1.1
    6. src_ip : 1.1.1.100
    7. responder :
    8. vlan : 200
    9. next_hop : 2.2.2.1
    10. src_ip : 2.2.2.100
    11. 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_macdefault_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。在集群配置的情况下,这是一个限制,因为您可以拥有具有许多路径的拓扑。

    流量配置概括

    1. - duration : 10.0
    2. generator :
    3. distribution : "seq"
    4. clients_start : "16.0.0.1"
    5. clients_end : "16.0.0.255"
    6. servers_start : "48.0.0.1"
    7. servers_end : "48.0.0.255"
    8. dual_port_mask : "1.0.0.0"
    9. cap_info :
    10. - name: cap2/dns.pcap
    11. cps : 1.0
    12. ipg : 10000
    13. rtt : 10000
    14. w : 1

    集群配置文件

    1. vlan: true
    2. groups:
    3. - ip_start : 16.0.0.1
    4. ip_end : 16.0.0.204
    5. initiator :
    6. vlan : 100
    7. dst_mac : "00:00:00:01:00:00"
    8. responder :
    9. vlan : 200
    10. dst_mac : "00:00:00:02:00:00"
    11. 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 接口。下图显示了拓扑

    集群示例

    对于此拓扑,创建了以下流量和集群配置文件

    流量配置概括

    1. - duration : 10.0
    2. generator :
    3. distribution : "seq"
    4. clients_start : "12.1.1.1" 1
    5. clients_end : "12.1.1.1"
    6. servers_start : "13.1.1.1"
    7. servers_end : "13.1.1.1"
    8. dual_port_mask : "0.1.0.0"
    9. generator_clients :
    10. - name : "c1" 2
    11. distribution : "seq"
    12. ip_start : "12.1.1.2"
    13. ip_end : "12.1.1.255"
    14. - name : "c2"
    15. distribution : "seq" 3
    16. ip_start : "12.1.2.1"
    17. ip_end : "12.1.2.255"
    18. generator_servers :
    19. - name : "s1"
    20. distribution : "seq"
    21. ip_start : "13.1.1.2"
    22. ip_end : "13.1.1.255"
    23. - name : "s2"
    24. distribution : "seq"
    25. ip_start : "13.1.2.1"
    26. ip_end : "13.1.2.255"
    27. cap_ipg : true
    28. cap_info :
    29. - name: file10k.pcap
    30. client_pool : "c2"
    31. server_pool : "s2"
    32. cps : 1
    33. ipg : 20000
    34. rtt : 20000
    35. w : 1
    36. - name: file10k.pcap
    37. client_pool : "c1"
    38. server_pool : "s1"
    39. cps : 1
    40. ipg : 20000
    41. rtt: 20000
    42. w : 1

    说明:

    1、延迟流将为 IP 12.1.1.1<→13.1.1.1/vlan=4050/next-hop=11.10.0.1

    2、第一个客户池

    3、第二个客户池

    集群配置文件

    1. lan: true
    2. groups:
    3. - ip_start : 12.1.1.1 1
    4. ip_end : 12.1.1.255
    5. initiator :
    6. vlan : 4050
    7. next_hop : 11.10.0.1
    8. src_ip : 11.10.0.11
    9. responder :
    10. vlan : 4054
    11. next_hop : 10.10.0.1
    12. src_ip : 10.10.0.11
    13. count : 1
    14. - ip_start : 12.1.2.1
    15. ip_end : 12.1.2.255
    16. initiator :
    17. vlan : 4051
    18. next_hop : 11.10.0.2
    19. src_ip : 11.10.0.11
    20. responder :
    21. vlan : 4055
    22. next_hop : 10.10.0.2
    23. src_ip : 10.10.0.11
    24. count : 1

    来自客户端池和默认池的所有IP 都应映射到此文件中,集群文件中可能有更广泛的范围

    下图显示了如何使用集群文件选择新流 src_ip/dest_ip/next-hop/vlan

    集群示例

    延迟流将仅检查 12.1.1.1/4050 路径(一个 DUT 接口) 在当前版本中无法检查所有端口的延迟。

    DUT 应该有一个静态路由来将数据包从客户端移动到服务器,反之亦然,因为流量不在端口的同一子网中。

    一个流生成的示例

    1. 下一跳重定位。TRex 解析所有下一跳选项,例如 11.10.0.1/4050 11.11.0.1/4051

    2. 按 CPS 选择模板,每个模板的概率为 50%。获取模板#1

    3. SRC_IP=12.1.1.2, DEST_IP=13.1.1.2

    4. 为12.1.1.2分配src_port =⇒src_port=1025为client=12.1.1.2的第一流

    5. 关联集群池中的下一跳。在这种情况下,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

    1. - duration : 10.0
    2. generator :
    3. distribution : "seq"
    4. clients_start : "12.1.1.1"
    5. clients_end : "12.1.1.1"
    6. servers_start : "13.1.1.1"
    7. servers_end : "13.1.1.1"
    8. dual_port_mask : "0.1.0.0" 1
    9. generator_clients :
    10. - name : "c1"
    11. distribution : "seq"
    12. ip_start : "12.1.1.2"
    13. ip_end : "12.1.1.255"
    14. - name : "c2"
    15. distribution : "seq"
    16. ip_start : "12.1.2.1"
    17. ip_end : "12.1.2.255"
    18. generator_servers :
    19. - name : "s1"
    20. distribution : "seq"
    21. ip_start : "13.1.1.2"
    22. ip_end : "13.1.1.255"
    23. - name : "s2"
    24. distribution : "seq"
    25. ip_start : "13.1.2.1"
    26. ip_end : "13.1.2.255"
    27. cap_ipg : true
    28. cap_info :
    29. - name: file10k.pcap
    30. client_pool : "c2"
    31. server_pool : "s2"
    32. cps : 1
    33. ipg : 20000
    34. rtt : 20000
    35. w : 1
    36. - name: file10k.pcap
    37. client_pool : "c1"
    38. server_pool : "s1"
    39. cps : 1
    40. ipg : 20000
    41. rtt: 20000
    42. w : 1

    说明:

    1、掩码为 0.1.0.0

    集群配置文件

    1. lan: true
    2. groups:
    3. - ip_start : 12.1.1.1
    4. ip_end : 12.1.1.255
    5. initiator :
    6. vlan : 4050
    7. next_hop : 11.10.0.1
    8. src_ip : 11.10.0.11
    9. responder :
    10. vlan : 4054
    11. next_hop : 10.10.0.1
    12. src_ip : 10.10.0.11
    13. count : 1
    14. - ip_start : 12.1.2.1
    15. ip_end : 12.1.2.255
    16. initiator :
    17. vlan : 4051
    18. next_hop : 11.10.0.2
    19. src_ip : 11.10.0.11
    20. responder :
    21. vlan : 4055
    22. next_hop : 10.10.0.2
    23. src_ip : 10.10.0.11
    24. count : 1
    25. - ip_start : 12.2.1.1 1
    26. ip_end : 12.2.1.255
    27. initiator :
    28. vlan : 4060
    29. next_hop : 11.10.0.3
    30. src_ip : 11.10.0.11
    31. responder :
    32. vlan : 4064
    33. next_hop : 10.10.0.3
    34. src_ip : 10.10.0.11
    35. count : 1
    36. - ip_start : 12.2.2.1
    37. ip_end : 12.2.2.255
    38. initiator :
    39. vlan : 4061
    40. next_hop : 11.10.0.4
    41. src_ip : 11.10.0.11
    42. responder :
    43. vlan : 4065
    44. next_hop : 10.10.0.4
    45. src_ip : 10.10.0.11
    46. count : 1

    说明:

    1、我们添加了更多集群,因为将生成更多 IP(+掩码)

    NAT 支持

    不推荐在全状态模式下支持 NAT。请改用高级有状态 (ASTF)。

    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 终端计数器:

    1. -Global stats enabled
    2. Cpu Utilization : 0.6 % 33.4 Gb/core
    3. Platform_factor : 1.0
    4. Total-Tx : 3.77 Gbps NAT time out : 917 1 (0 in wait for syn+ack) 5
    5. Total-Rx : 3.77 Gbps NAT aged flow id: 0 2
    6. Total-PPS : 505.72 Kpps Total NAT active: 163 3 (12 waiting for syn) 6
    7. 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

    1. interface TenGigabitEthernet1/0/0 1
    2. mac-address 0000.0001.0000
    3. mtu 4000
    4. ip address 11.11.11.11 255.255.255.0
    5. ip policy route-map p1_to_p2
    6. ip nat inside 2
    7. load-interval 30
    8. !
    9. interface TenGigabitEthernet1/1/0
    10. mac-address 0000.0001.0000
    11. mtu 4000
    12. ip address 11.11.11.11 255.255.255.0
    13. ip policy route-map p1_to_p2
    14. ip nat outside 3
    15. load-interval 30
    16. ip nat pool my 200.0.0.0 200.0.0.255 netmask 255.255.255.0 4
    17. ip nat inside source list 7 pool my overload
    18. access-list 7 permit 16.0.0.0 0.0.0.255 5
    19. ip nat inside source list 8 pool my overload 6
    20. access-list 8 permit 17.0.0.0 0.0.0.255

    说明:

    1、必须连接到 TRex 客户端端口(路由器内部端口)

    2、NAT 内部

    3、NAT 外部

    4、超载的外部地址池

    5、匹配 TRex YAML 客户端范围

    6、如果是双端口 TRex

    限制:

    1. 路由器上不存在 IPv6-IPv6 NAT 功能,因此该功能仅适用于 IPv4。

    2. 不支持 NAT64。

    3. 不完全支持捆绑/插件。因此, sfr_delay_10.yaml 不起作用。请改用 sfr_delay_10_no_bundling.yaml。

    • --learn-verify是用于测试 TRex 学习机制的 TRex 调试机制。

    • 当 DUT 配置为没有 NAT 时需要运行它。它将验证 inside_ip==outside_ip 和 inside_port==outside_port。

  • 相关阅读:
    MySQL查询优化实例
    [超详细] GraalVM打包含有JNI的本地镜像
    基于Springcloud的服务治理落地实践
    【列表渲染+收集表单数据+过滤器+内置指令+自定义指令】
    CodeGeeX:vscode中全新的智能代码补全插件
    一文读懂!机器人自动化解决方案的应用领域和前景
    nginx转发mysql端口
    [附源码]java毕业设计鞋店销售管理
    飞凌嵌入式受邀参加「NXP创新技术论坛」
    Vue3中diff算法比对新老节点孩子数组
  • 原文地址:https://blog.csdn.net/qq_35029061/article/details/125426527