RouterOS PCC基于IDC机房路由网络应用
这里探讨的不是RouterOS在IDC机房的VPS或虚拟化的应用,而是作为一个IDC客户与运营商接入三层路由的应用,或是与集群服务器多条回指路由的应用。当然这种环境并非只出现在IDC机房网络,这个应用是本人在IDC工作中总结的,仅供参考。
IDC接入应用
通过一个实例,比如我在运营商的IDC机房开通了30G的IDC带宽,那运营商给我开通肯定是3个10GE的接口,分配了256个公网IPv4地址(暂不讨论IPv6网络),IPv4地址接入采用路由模式,而非二层接入。
运营商30G接入配置,可以是分配3组/30子网互联IPv4地址,也可以是配置3个端口的链路聚合口,例如华为的Eth-trunk接口,分配一组/30子网互联IPv4地址。
这里我们排除链路聚合口的配置,选择3组/30子网互联地址,将一个C段的IPv4地址,假如IPv4地址是:80.8.8.0/24,运营商会配置3条静态路由,指向3个互联接口的IPv4地址,我方也会配置3条默认路由到3个互联接口的IPv4网关,这个是最常见的ECMP协议,保证3个接入端口流量均衡,IDC网络中应用非常普片。互联配置如下:
通过上面的互联图,有网络基础的朋友,大概就明白了IDC网络路由模式接入配置
基本的接入说完了,现在要说下PCC如何应用其中,这个应用非nat网络,仅是三层路由,因此关闭连接跟踪:
[admin@MikroTik] > ip/firewall/connection/tracking/set enabled=no
3条mangle直接标记路由包,因为不涉及nat的连接跟踪,所以没有mark-connection的标记规则:
/ip firewall mangle add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route1 passthrough=yes per-connection-classifier= both-addresses:3/0 add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route2 passthrough=yes per-connection-classifier= both-addresses:3/1 add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route3 passthrough=yes per-connection-classifier= both-addresses:3/2
路由配置:
/ip route add gateway=10.1.1.1 routing-mark=route1 add gateway=10.1.1.5 routing-mark=route2 add gateway=10.1.1.9 routing-mark=route3
上面的配置其实和ECMP没什么区别,就是用PCC复现了ECMP的配置,也就是PCC做的3条负载均衡
现在我们要实现4:4:2,也就是2:2:1,需要标记5条路由规则
标记5条规则配置:
/ip firewall mangle add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route1 passthrough=yes per-connection-classifier= both-addresses:5/0 add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route2 passthrough=yes per-connection-classifier= both-addresses:5/1 add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route3 passthrough=yes per-connection-classifier= both-addresses:5/2 add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route4 passthrough=yes per-connection-classifier= both-addresses:5/3 add action=mark-routing chain=prerouting src-address=80.8.8.0/24 \ new-routing-mark=route5 passthrough=yes per-connection-classifier= both-addresses:5/4
路由配置:
/ip route add gateway=10.1.1.1 routing-mark=route1 add gateway=10.1.1.1 routing-mark=route2 add gateway=10.1.1.5 routing-mark=route3 add gateway=10.1.1.5 routing-mark=route4 add gateway=10.1.1.9 routing-mark=route5
这样3条线路比例调配,这个比例还可以修改PCC规则调整,同时RouterOS的script可以参与实时的流量调整比例分配,至于这种配置有什么用,搞IDC的朋友他们自然明白!
服务器集群应用
考虑另外一个场景,方向是去一个集群服务器,也就是和之前的案例反过来,RouterOS需要面向客户,让集群服务器需要确保流量调度均衡,也需要按比例分配一定流量,同样是4:4:2,需要标记5条路由规则,下图是服务器集群是三台和RouterOS都有一个/30子网互联:
标记5条规则,对于RouterOS来说,是去80.8.8.0/24,修为dst-address
/ip firewall mangle add action=mark-routing chain=prerouting dst-address=80.8.8.0/24 \ new-routing-mark=route1 passthrough=yes per-connection-classifier= both-addresses:5/0 add action=mark-routing chain=prerouting dst-address=80.8.8.0/24 \ new-routing-mark=route2 passthrough=yes per-connection-classifier= both-addresses:5/1 add action=mark-routing chain=prerouting dst -address=80.8.8.0/24 \ new-routing-mark=route3 passthrough=yes per-connection-classifier= both-addresses:5/2 add action=mark-routing chain=prerouting dst -address=80.8.8.0/24 \ new-routing-mark=route4 passthrough=yes per-connection-classifier= both-addresses:5/3 add action=mark-routing chain=prerouting dst -address=80.8.8.0/24 \ new-routing-mark=route5 passthrough=yes per-connection-classifier= both-addresses:5/4
在写静态路由同时加上routing-mark标记
/ip route add dst-address=80.8.8.0/24 gateway=192.168.10.2 routing-mark=route1 add dst-address=80.8.8.0/24 gateway=192.168.10.2 routing-mark=route2 add dst-address=80.8.8.0/24 gateway=192.168.10.6 routing-mark=route3 add dst-address=80.8.8.0/24 gateway=192.168.10.6 routing-mark=route4 add dst-address=80.8.8.0/24 gateway=192.168.10.10 routing-mark=route5
到目标地址的路由,PCC的hash算法能确保相同的源IP命中到同一台服务器,而不会随机连接到其中一台。
在RouterOS v6版本ECMP基于包分流会每10秒调整一次算法,导致路由线路变动,对于三层路由而言并不影响使用,因为多条路径下,都可以到达目标网络,DNS和普通web服务采用相同loopback的IP地址用ECMP没问题,对于一些特殊的内容连接服务,有时候要求源IP始终落到同一台服务器的loopback IP上能保持一直的路径连接,PCC为一些特殊应用提供可用性。RouterOSv7后的ECMP升级了Linux内核支持基于会话的哈希算法,因此某种程度上是可以代替PCC。
之前的一篇文章大家可以参考下:探讨下RouterOS PCC的工作原理与应用延伸
注意:RouterOS的当前的CRS3系列交换机,ECMP是在v7版本后可以下发给交换机芯片处理的,但PCC无法下发交换芯片,就需要CPU来抗了(可以选择CCR1072,或者多核心,高频率的x86服务器),能跑多少流量我不清楚,只是闲聊下。