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
2
3
4
5
6
/ip firewall address-list
add list=nomark address=192.168.168.0/24
add list=nomark address=192.168.169.0/24
add list=nomark address=172.16.21.0/24
/ip firewall mangle
add chain=prerouting dst-address-list=nomark action=accept

2、保证上网流量从哪进就从哪出,所以必须比如对从wan口进来的流量进行标识。为避免上下流量出错connection-mark=no-mark不可少!

1
2
3
/ip firewall mangle
add chain=prerouting in-interface=pppoe-Telecom connection-mark=no-mark action=mark-connection new-connection-mark=pppoe-telecom-mark
add chain=prerouting in-interface=pppoe-Unicom connection-mark=no-mark action=mark-connection new-connection-mark=pppoe-unicom-mark

3、对本地内网的流量进行标记,每个1/2。为避免上下流量出错connection-mark=no-mark不可少!

1
2
3
/ip firewall mangle
add chain=prerouting in-interface=bridge connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=pppoe-telecom-mark
add chain=prerouting in-interface=bridge connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=pppoe-unicom-mark

4、对于之前进行连接的标识进行,分别标识不同的路由标记。这里注意in-interface=ether1不可少,因为之前的连接标记为双向的,有进有出,这里如果没有in-interface配置,out流量也会被PCC!

1
2
3
/ip firewall mangle
add chain=prerouting connection-mark=pppoe-telecom-mark in-interface=bridge action=mark-routing new-routing-mark=pppoe-telecom-mark
add chain=prerouting connection-mark=pppoe-unicom-mark in-interface=bridge action=mark-routing new-routing-mark=pppoe-unicom-mark

5、保证上网流量从哪进就从哪出,所以必须比如对从wan口出去的流量进行标识。

1
2
3
/ip firewall mangle
add chain=output connection-mark=pppoe-telecom-mark action=mark-routing new-routing-mark=pppoe-telecom-mark
add chain=output connection-mark=pppoe-unicom-mark action=mark-routing new-routing-mark=pppoe-unicom-mark

6、添加静态路由,并添加两个备用网关

1
2
3
4
5
/ip route
add dst-address=0.0.0.0/0 gateway=pppoe-Telecom routing-mark=pppoe-telecom-mark check-gateway=ping
add dst-address=0.0.0.0/0 gateway=pppoe-Unicom routing-mark=pppoe-unicom-mark check-gateway=ping
add dst-address=0.0.0.0/0 gateway=pppoe-Telecom distance=2
add dst-address=0.0.0.0/0 gateway=pppoe-Unicom distance=3

7、对两条外网进行伪装(添加一条伪装即可)

1
2
/ip firewall nat
add chain=srcnat action=masquerade

8、修改MTU PPP –> Profiles –> default 中,修改Change TCP MSS为no

1
2
/ip firewall mangle
add chain=forward protocol=tcp tcp-flags=syn action=change-mss new-mss=1440

添加完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服务器配置参考

《RouterOS路由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
2
3
4
5
6
7
8
# Update noCN.rsc

/tool fetch mode=http url="http://192.168.169.5/noCN.rsc" \
dst-path=noCN.rsc

/im file=noCN.rsc

:log info ([/file get noCN.rsc contents])

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

添加好后移动到PCC规则前面即可生效

路由器B

路由器B为OVPN服务端,接收路由器A转发过来的OSPF路由条目 1、在路由器B中添加instance,其中 router-id 参数为OVPN隧道的本端地址(唯一)

1
2
/routing ospf instance
set [ find default=yes ] router-id=172.16.21.254

2、在路由器B中添加interface,authentication-key 参数为认证密钥,在接下来的路由器A中要设置成一样的;interface 参数为网络接口,OVPN建立会话时会生成一个默认以OVPN用户名命名的interface,选它即可。

1
2
/routing ospf interface
add authentication=md5 authentication-key=vpnrou interface=ovpn_user_1 network-type=broadcast

3、在路由器B中添加network,network 参数需要设置为OVPN建立隧道时设置的IP地址段

1
2
/routing ospf network
add area=backbone network=172.16.21.0/24

4、由于路由器A中之前修改过 instance 中的Router ID,只需要添加对应的 interface、network 即可,路由器A中的interface选择建立OVPN Client时命名的接口名称;network 参数使用OVPN服务端的隧道地址

1
2
3
4
5
/routing ospf interface 
add authentication=md5 authentication-key=vpnrou interface=Conn-to-OVPN network-type=broadcast

/routing ospf network
add area=backbone network=172.16.21.254

配置完成后,在两端路由器的 Routing–>OSPF–>Neighbors 中可以看到会话状态

在路由器B的路由表中,可以看到路由器A通告过来的静态路由

在路由器B中看到发来的路由表后,在其内网任意一台主机上测试效果如下: