MikroTik PCC多线叠加+ospf+ovpn
RouterOS V6.47.7 ROS可以进行的负载均衡配置及特点如下:
ECMP(Equal-Cost Multi-path): ECMP是通过在route列表添加多网关的静态路由,然后由路由协议建立劢态的多线路由。这种负载均衡有个缺点,缺点就是每十分钟内核会重新均衡线路,使一些连接会被指定到其他路线,出现频繁掉线的情况。 NTH: NTH是采用第N次链接的负载均衡,它不仅可以实现基于IP的负载均衡,同时还能实现对端口负载均衡和对nat指定有序的访问。这样基本实现了不掉线的真正负载均衡。但是NTH存在着一个弊端,就是在某些对IP要求严格的网站会反复要求验证。比如,网银!这样我们需要通过策略将一些IP或者端口指定走固定的线路出去,从而避开网站繁琐的验证。
PCC(Per connection classified): PCC是通过判断源地址或者目的地址、源端口或者目的端口对数据迚行分类来实现负载均衡,对每个连接迚行分类大多保持了连续性,这样大大弥补了NTH的不足。
PCC
命令行: 添加address list 1、将所有ovpn对端网段+虚拟网段+内网网段全部加入地址列表中,保证访问局域网时绕开PCC策略
1 | /ip firewall address-list |
2、保证上网流量从哪进就从哪出,所以必须比如对从wan口进来的流量进行标识。为避免上下流量出错connection-mark=no-mark不可少!
1 | /ip firewall mangle |
3、对本地内网的流量进行标记,每个1/2。为避免上下流量出错connection-mark=no-mark不可少!
1 | /ip firewall mangle |
4、对于之前进行连接的标识进行,分别标识不同的路由标记。这里注意in-interface=ether1不可少,因为之前的连接标记为双向的,有进有出,这里如果没有in-interface配置,out流量也会被PCC!
1 | /ip firewall mangle |
5、保证上网流量从哪进就从哪出,所以必须比如对从wan口出去的流量进行标识。
1 | /ip firewall mangle |
6、添加静态路由,并添加两个备用网关
1 | /ip route |
7、对两条外网进行伪装(添加一条伪装即可)
1 | /ip firewall nat |
8、修改MTU PPP –> Profiles –> default 中,修改Change TCP MSS为no
1 | /ip firewall mangle |
添加完change mss规则后,移动到所有添加规则的第1位
将所有PPPoE Client 中的Max MTU,Max MRU修改为1500(拨不了号的话需要登录广猫,看下光猫里设置的MTU值,改为一样的即可)
9、关闭fasttrack(如有) fasttrack会使得进行PCC标记后的数据流量奇慢无比,即使change mss 也无法拯救
OVPN+OSPF
路由器A为OVPN客户端,向路由器B转发其收到的来自内网旁路路由(V2RAY)发来的OSPF路由条目 路由器B为OVPN服务端,接收路由器A发来的OSPF路由条目 其内网中的OSPF服务器配置参考
OVPN的配置网上非常多,OSPF的配置方式可以参考上述文章,不再赘述,这里只记录以下两个问题:
1、路由器A中,如何解决策略路由权重比静态路由权重高的问题
2、在OVPN的隧道中,如何使用ROS的OSPF通告路由
路由器A
路由器A为OVPN客户端,向路由器B转发其收到的来自内网旁路路由(V2RAY)发来的OSPF路由条目 OVPN的配置网上非常多,OSPF的配置方式参考上述文章,不再赘述,这里只记录下路由器AOSPF路由表在OVPN之间传递时的一些问题 在OVPN中传递OSPF时,一定先将OVPN Server中的netmask设置为32,否则宣告无效 ovpn两端都使用ROS进行配置,路由器A的内网中有一个OSPF(bird)服务器分发OSPF路由条目给路由器A。路由器A将收到的OSPF条目再通过OVPN隧道传递给路由器B。 由于路由器A使用的PCC多线叠加的动态路由策略优先级高于OSPF收到的静态路由策略,导致OSPF静态路由不生效,可以通过可以通过ROS的rsa脚本在防火墙中加入非中国大陆的地址列表,并添加防火墙mangle表来绕过PCC的动态路由策略。这样就可以正常使用OSPF宣告过来的静态路由条目了。 1、修改文章《RouterOS路由OSPF协议+树莓派分流国外流量》中用到的nchnroutes脚本,生成ROS中添加防火墙地址列表的rsa脚本,并在ROS中添加好相应的下载脚本和计划任务,项目地址 System–>Script中添加getnoCNlist,下载脚本
1 | # Update noCN.rsc |
System–>Scheduler中添加计划任务,每24小时5分钟运行一次
/system script run getnoCNlist;
脚本运行后,在IP–>Firewall–>Address Lists中将生成Name为noCN的地址列表,列表中的IP为OSPF通告给路由器A的静态路由条目。在mangle表中添加规则,绕过PCC规则即可
2、添加firewall mangle规则,使该走OSPF静态路由的路由IP地址绕过PCC规则
/ip firewall mangle
add chain=prerouting dst-address-list=noCN action=accept
路由器B
路由器B为OVPN服务端,接收路由器A转发过来的OSPF路由条目 1、在路由器B中添加instance,其中 router-id 参数为OVPN隧道的本端地址(唯一)
1 | /routing ospf instance |
2、在路由器B中添加interface,authentication-key 参数为认证密钥,在接下来的路由器A中要设置成一样的;interface 参数为网络接口,OVPN建立会话时会生成一个默认以OVPN用户名命名的interface,选它即可。
1 | /routing ospf interface |
3、在路由器B中添加network,network 参数需要设置为OVPN建立隧道时设置的IP地址段
1 | /routing ospf network |
4、由于路由器A中之前修改过 instance 中的Router ID,只需要添加对应的 interface、network 即可,路由器A中的interface选择建立OVPN Client时命名的接口名称;network 参数使用OVPN服务端的隧道地址
1 | /routing ospf interface |
配置完成后,在两端路由器的 Routing–>OSPF–>Neighbors 中可以看到会话状态
在路由器B的路由表中,可以看到路由器A通告过来的静态路由
在路由器B中看到发来的路由表后,在其内网任意一台主机上测试效果如下: