我正在尝试弄清楚如何在 JUNOS 中使用 ECMP 负载平衡。我知道这不是实现负载平衡的最佳方法,但它既快捷又简单,而且可以完成我需要做的事情。在 ScreenOS 中,这很容易。
设备:SRX220 JunOS:10.3R2.11
以下是我目前得到的信息:
routing-options {
static {
route 0.0.0.0/0 {
next-hop [ 1.1.1.1 1.1.1.2 ];
metric 10;
}
}
maximum-paths 2;
这样做可以吗?
汤姆
答案1
您肯定不想要maximum-paths
。这会限制您的路由表大小,并且与 ECMP 无关。
因此只需:
routing-options {
static {
route 0.0.0.0/0 {
next-hop [ 1.1.1.1 1.1.1.2 ];
metric 10;
}
}
}
你会看到的:
lab@router> show route 0.0.0.0/0
...
0.0.0.0/0 *[Static/5] 00:01:28, metric 10
> to 1.1.1.1 via ge-0/0/0.0
to 1.1.1.2 via ge-0/0/0.0
两个下一跳都显示在路由表中,但要查看转发表中实际发生的情况,您必须深入挖掘:
lab@router> show route forwarding-table destination 0.0.0.0/0
...
Destination Type RtRef Next hop Type Index NhRef Netif
0.0.0.0/0 user 0 1.1.1.1 ucst 558 3 ge-0/0/0.0
默认情况下,当路由器将路由表推送到转发表时,它会随机选择一个下一跳。要更改该行为,您可以定义“转发表导出”策略,该策略控制从路由表构建转发表时发生的情况:
routing-options {
static {
route 0.0.0.0/0 {
next-hop [ 1.1.1.1 1.1.1.2 ];
metric 10;
}
}
forwarding-table {
export LOAD-BALANCE;
}
}
policy-options {
policy-statement LOAD-BALANCE {
then {
load-balance per-packet;
}
}
}
现在,路由表仍然看起来一样:
lab@router> show route 0.0.0.0/0
...
0.0.0.0/0 *[Static/5] 00:07:28, metric 10
> to 1.1.1.1 via ge-0/0/0.0
to 1.1.1.2 via ge-0/0/0.0
但是转发表(计算的地方)有两条路由:
lab@router> show route forwarding-table destination 0.0.0.0/0
...
Destination Type RtRef Next hop Type Index NhRef Netif
0.0.0.0/0 user 0 ulst 262142 2
1.1.1.1 ucst 558 3 ge-0/0/0.0
1.1.1.2 ucst 540 3 ge-0/0/0.0
现在您正在进行负载平衡!
然而,有一点要记住,尽管极具误导性 load-balance per-packet
声明中,所有具有此配置的 Juniper 路由器实际上都每流负载平衡。每个数据包都基于(源 IP、目标 IP 和协议号)进行哈希处理。因此,如果您只有几个流量,它们很可能都使用相同的下一跳。一旦您增加流量数量,您应该会看到更均匀的负载。
(实际上,最早的硬件确实实现了每个数据包的负载平衡,但你可能永远不会遇到这种情况)