基于瞻博网络 SRX BGP 的 ECMP 未按预期工作

网络工程 bgp 杜松 负载均衡 回复 电调
2021-07-28 19:30:37

概述

我正在尝试将基于 BGP 的 ECMP 设置到位于不同子网/VLAN 上的两个终端服务器,并将相同的 IP 地址通告给 SRX 防火墙。终端节点是运行 BIRD 的 linux 机器,并在其上运行一个简单的 NGINX Web 服务器。

我想基于源 IP 和源端口在两个端节点上均衡地对流量进行负载平衡。

当前状态

  • 节点 1 在 VLAN 56 上配置并使用私有 IP 地址 192.168.70.2/30(SRX 使用 .1)。它有一个环回地址 10.240.0.0/32(VIP)和 10.240.0.1/32,这两个地址都通过 BGP 通告出去。
  • 节点 2 在 VLAN 556 上配置并使用私有 IP 地址 192.168.70.6/30(SRX 使用 .5)。它有一个环回地址 10.240.0.0/32(VIP)和 10.240.0.2/32,这两个地址都通过 BGP 通告出去。
  • SRX 是在机箱集群中运行的 SRX240。我曾尝试使用一个 SRX100 和一个 vSRX,结果相同。SRX 有 2 个接口,它们都在信任区域(其中包含所有协议和服务以及允许一切的信任到信任策略)。它在同一个组中配置了 2 个 BGP 会话到每个端节点。
    • reth6.56 - 192.168.70.1/30
    • reth6.556 - 192.168.70.5/30

显示协议 bgp

group www-test {
    type external;
    multipath;
    neighbor 192.168.70.2 {
        peer-as 65001;
        local-as 65000;
    }
    neighbor 192.168.70.6 {
        peer-as 65001;
        local-as 65000;
    }
}

显示 bgp 摘要

Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
192.168.70.2          65001      16493      15988       0       0  5d 1:28:19 Establ
  inet.0: 2/2/2/0
192.168.70.6          65001      16169      15668       0       1 4d 23:03:17 Establ
  inet.0: 2/2/2/0

我已将所需的策略添加到转发表中以确保添加多条路由

policy-options {
    policy-statement backup-routes {
        then {
            load-balance per-packet;
        }
    }
}

routing-options {
    forwarding-table {
        export backup-routes;
    }
}

这在路由表中显示了正确的结果

显示路由 10.240.0.0

inet.0: 735 destinations, 771 routes (735 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.240.0.0/32      *[BGP/170] 5d 01:32:57, localpref 100
                      AS path: 65001 I
                      to 192.168.70.6 via reth6.556
                    > to 192.168.70.2 via reth6.56
                    [BGP/170] 4d 23:07:55, localpref 100
                      AS path: 65001 I
                    > to 192.168.70.6 via reth6.556

还有转发表

显示路由转发表匹配 10.240.0.0

Routing table: default.inet
Internet:
Destination        Type RtRef Next hop           Type Index NhRef Netif
10.240.0.0/32      user     0                    ulst 262150     3
                              192.168.70.6       ucst  2239     6 reth6.556
                              192.168.70.2       ucst  2283     6 reth6.56

最重要的是,我还设置了第 3 层和第 4 层哈希键转发选项。

forwarding-options {
    hash-key {
        family inet {
            layer-3;
            layer-4;
        }
    }
}

根据瞻博网络https://www.jnpr.net/documentation/en_US/junos/topics/reference/configuration-statement/family-edit-forwarding-options-hash-key-inet.html在 SRX/vSRX 上支持并且应该将第 3 层和第 4 层信息添加到哈希算法中。

引用的相关位:

family inet——将端口数据合并到哈希键中以进行流量确定。默认情况下,在确定流量时会忽略端口数据。

第 3 层 - 将第 3 层 (IP) 数据合并到哈希键中。您必须包含第 3 层语句。如果省略第 3 层语句,管理过程将从配置中删除哈希键语句,路由器的行为就像您指定第 3 层一样。默认情况下,或者如果您仅指定第 3 层语句,路由器将使用数据包标头中的以下第 3 层信息进行每流负载平衡:

  • 源IP地址
  • 目标 IP 地址
  • 协议
  • 传入接口索引

第 4 层 - 将第 4 层传输控制协议 (TCP) 或用户数据报协议 (UDP) 数据合并到哈希键中。如果包含第 4 层语句,路由器将使用以下第 4 层信息进行负载平衡:

  • 源端口号
  • 目的端口号
  • IP服务类型

测试

我进行了一系列测试。首先关闭哈希键选项。我使用了 120 台主机,分布在 5 个不同的子网中,结果显示在路由上的分割率为 51/49%。伟大的。这对我来说已经足够了。我重复了 3 次记录我的结果。我可以看到,每次远程主机总是以相同的方式运行。即使在确保清除当前会话并重复测试之后,它们每次都以相同的方式运行。

接下来我启用了第 3 层和第 4 层设置。现在应该考虑到连接来自的源端口来对流量进行负载平衡。

我从本地计算机运行了一个脚本,该脚本生成了 43 个并发连接,每个连接来自不同的源端口,我可以看到它们都连接到同一主机。(与他们关闭选项时访问的同一主机)

Session ID: 2357, Policy name: DEFAULT/22, State: Active, Timeout: 294, Valid
  In: 192.168.3.253/53745 --> 10.240.0.0/80;tcp, If: reth6.1199, Pkts: 3, Bytes: 206
  Out: 10.240.0.0/80 --> 192.168.3.253/53745;tcp, If: reth6.56, Pkts: 2, Bytes: 92

Session ID: 10588, Policy name: DEFAULT/22, State: Active, Timeout: 294, Valid
  In: 192.168.3.253/53752 --> 10.240.0.0/80;tcp, If: reth6.1199, Pkts: 3, Bytes: 206
  Out: 10.240.0.0/80 --> 192.168.3.253/53752;tcp, If: reth6.56, Pkts: 2, Bytes: 92

我的问题

  1. 有没有人以前做过这个,他们有没有在 SRX 上工作?
  2. 我错过了什么吗?根据示例,无需太多配置即可完成这项工作。
1个回答

答案是:

那个设定

forwarding-options {
    hash-key {
        family inet {
            layer-4;
        }
    }
}

仅适用于PACKET 模式

SRX 的默认模式是流模式。您可以通过删除安全节下的所有配置然后运行来设置配置数据包模式

set security forwarding-options family mpls mode packet-based

一旦您承诺,您将需要重新启动您的设备。

您可以通过运行操作模式命令来检查并查看它正在运行的模式

show security flow status

这给出了以下输出

 Flow forwarding mode:
    Inet forwarding mode: packet based
    Inet6 forwarding mode: flow based
    MPLS forwarding mode: packet based
    ISO forwarding mode: drop
  Flow trace status
    Flow tracing status: off
  Flow session distribution
    Distribution mode: RR-based
    GTP-U distribution: Disabled
  Flow ipsec performance acceleration: off
  Flow packet ordering
    Ordering mode: Hardware

您对第 2 行和第 3 行感兴趣。下面,我的显示设备处于 IPV4 流量的数据包模式和 IPV6 的流模式。

Inet forwarding mode: packet based
Inet6 forwarding mode: flow based

有关更多详细信息,请参见此处:https : //kb.juniper.net/InfoCenter/index?page=content&id=KB30461

注意:在实验室中构建并测试之后,JTAC 工程师花了几周的时间来解决这个问题。他将尝试更新文档以注意它仅适用于数据包模式!