概述
我正在尝试将基于 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
我的问题
- 有没有人以前做过这个,他们有没有在 SRX 上工作?
- 我错过了什么吗?根据示例,无需太多配置即可完成这项工作。