ECMP-“Equal-Cost Multi-Path Routing”即等价多路径路由是三层路由标准协议,对于各个厂商对ECMP支持都是基本的路由功能,由于自己一直在使用RouterOS系统,对ECMP技术发展受到部分限制,最近因为一些阴差阳错的原因重新对Linux的ECMP做了相关的了解,Linux发展变化这里有一个时间线,试图重述ECMP的内核开发中过程:

  • 1997 年 11 月 v2.1.68 初步支持 IPv4 多路径路由。包括对加权 ECMP 的支持,下一跳以伪随机方式选择路径(使用jiffies 值作为随机数),也就是使用基于数据包的负载均衡。
  • 2012 年 9 月 v3.6 IPv4 路由缓存被删除,这使得多路径路由无法与面向连接的协议(如 TCP)一起使用,因为可以为属于同一流的数据包选择不同的下一跳。
  • 2013 年 2 月 v3.8 初步支持 IPv6 多路径路由。由于基于IP数据流(一条会话连接)的哈希路径选择,属于一个相同会话的数据包始终路由到相同的下一跳,取消了加权 ECMP。
  • 2016 年 1 月 v4.4 IPv4 的多路径路由切换到基于IP数据流的哈希路径选择,使得面向连接的协议再次可与 ECMP 一起使用。

这里需要特别提示:RouterOS v6是基于Linux 3.3的内核,RouterOS v7基于Linux 5.x后的内核,也就是说RouterOS v6和之前的版本都是基于对加权 ECMP的IP数据包负载均衡,而在v7默认就支持同一流的数据包选择不同的下一跳负载均衡。

在MikroTik的官方文档找到关于ECMP说明:Equal-Cost Multi-Path Routing(等价多路径路由)均衡策略是每10分钟后,会重新计算均衡线路。这种10分钟后重新计算技能和线路会导致破坏原有的会话连接,对于非nat网络的三层路由目标和源地址是没有隐藏的,目标和源IP是相互能识别的,虽然线路改变了,但目标和源地址IP地址未改变,连接不会受到影响。然而nat网络下私网IP到出口IP是做了隐藏的,ECMP重新计算线路路径,目标IP虽然不变,但多线路出口的IP改变了,源出口IP改变后,连接到目标IP会认为是非法连接,导致目标IP无响应出现频繁掉线情况,所以当基于nat的负载均衡时“Equal-Cost Multi-Path Routing”在RouterOS v6是无法被作为NAT的负载均衡使用,在nat网络的负载均衡RouterOS推荐选择PCC策略(PCC配置参考),当然PCC也可以实现ECMP,而且还能实现按照线路不同带宽比例调整路由权重

而对于Linux 4.4后的ECMP则完全摆脱了这个缺陷,由于基于IP数据流(一条会话连接)的哈希路径选择,和PCC有着相同的原理,属于一个相同会话的数据包始终路由到相同的下一跳。意味着我们在RouterOS v7可以使用ECMP来配置我们的NAT负载均衡

  • Equal-Cost Multi-Path Routing的操作,通过在ip route添加多网关的静态路由(v6格式如:gateway=x.x.x.x,y.y.y.y)路由协议会建立动态的多路路由。

假设路由网络中有两条网关到10.1.12.0/24,一个网关是192.168.0.253,一个是192.168.1.253,我们配置ECMP负载均衡规则:

[admin@MikroTik] ip route> add dst-address=10.1.12.0/24 gateway=192.168.0.253,192.168.1.253
[admin@MikroTik] ip route> print
Flags: X – disabled, A – active, D – dynamic,

C – connect, S – static, r – rip, b – bgp, o – ospf, m – mme,
B – blackhole, U – unreachable, P – prohibit
 #      DST-ADDRESS        PREF-SRC       GATEWAY            DISTANCE
 0 A S  0.0.0.0/0                             10.5.8.1                  1
 1 A S  10.1.12.0/24                         192.168.0.253            1
                                                           192.168.1.253    
 2 ADC  10.5.8.0/24        10.5.8.2          ether1                    0
 3 ADC  192.168.0.0/24     192.168.0.2     ether2                    0
 4 ADC  192.168.1.0/24     192.168.1.2     ether3                    0

[admin@MikroTik] ip route>

使用winbox配置:

当有多个默认网关时,也可以配置为

[admin@MikroTik] ip route> add  gateway=192.168.0.253,192.168.1.253

 

RouterOS v7配置

在RouterOS v7 做了修改,不能gateway参数填写多个网关,只能一条规则配置一个gateway网关

[admin@v7] ip/route> add  gateway=192.168.0.253

[admin@v7] ip/route> add  gateway=192.168.1.253

在命令行看到的是在前缀有AS+:

[admin@v7] /ip/route> print
Flags: D - DYNAMIC; I - INACTIVE, A - ACTIVE; C - CONNECT, S - STATIC, m - MODEM; + - ECMP
Columns: DST-ADDRESS, GATEWAY, DISTANCE
#       DST-ADDRESS      GATEWAY       D
0   AS+   0.0.0.0/0   192.168.0.253   1
1   AS+   0.0.0.0/0   192.168.1.253   1

配置后会自动变为ECMP模式,但目前RouterOS不支持ECMP的权重设置。由于只是简单的测试ECMP在RouterOS v7的nat负载均衡,没有出现掉线和丢包的问题,因此个人认为是可以代替PCC,因为PCC的mangle中会创建大量的规则,极大的消耗了CPU性能,如果使用ECMP,可以更节约CPU资源。咨询MikroTik官方也是含糊其辞,不否认可以代替PCC,但认为PCC还是最好的选择。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章很值,打赏犒劳作者一下