ECMP等价多路径路由(与PCC区别)
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还是最好的选择。