应用场景:
一:RouterOS接了多个上游,都是静态IP并且有NAT(masquerade)配置。默认情况下,如果在非默认路由的上游IP上开了端口转发到内网,内网设备返回包的时候会直接从默认路由出去,从而要么被路由器的reverse path filter丢掉,要么在出口处被masquerade从而导致对面收到的包源IP错误而丢包。下面简述一个方法,让返回包从正确的出口返回。
二:用VRF接了管理网,想从VRF访问本机的WinBox或者SSH。数据包是能从VRF网络正确到达本机的;但是从本机返回包时,默认只会查main路由表。你当然可以简单地把VRF网的路由或静态或动态leak进main,但是这样就失去了隔离管理网的功能。因此,我们可以用类似的方法来实现通过VRF访问本机。
关闭Fasttrack
Fasttrack功能和整个mangle表以及依赖它的所有功能(ip rule,VRF,routing-mark等)冲突。最多只能给没有connection mark的开一下:
12
/ip firewall filteradd action=fasttrack-connection chain=forward connection-mark=no-mark connection-state=established,related
同理,其它几个chain上的fasttrack如果涉及到相应功能也需要关闭。
关闭Reverse Path Filter
RP filter如果设置成strict,那么返回的数据包如果不是从默认路由回去就会被丢掉。所以要把RP filter设置成loose或者no。
1
/ip settings set rp-filter=loose
打开Conntrack
1
/ip firewall connection tracking set enabled=yes
设置分运营商路由表
对每个上游分别建立一个路由表(即connection mark),给这个路由表设置一条默认路由(distance或者metrics统一即可;如果你是想用VRF访问本机,那么不需要默认路由),并且用ip rule功能把main路由表优先级提到自己的路由表之前,以便connected路由能够正确查询到:
12345
/ip routeadd check-gateway=ping distance=1 gateway=
注意,这里main路由表就不允许有默认路由了,否则分上游路由表的路由是不会生效的。
如果你的上游运营商使用DHCP或者别的路由协议分发路由表,导致默认路由是动态生成的,那么可以把这个接口直接放进VRF里面来实现相同的配置:
1234567
/ip route vrfadd route-distinguisher=100:200 export-route-targets=100:200 import-route-targets=100:200 interfaces=
如果默认路由使用路由协议分发,路由协议一般有自己的VRF配置选项,也需要设置成对应的VRF。
设置主路由表
下游设备默认会走main路由表,我们要在main路由表之后接上分运营商路由表,这样下游设备就有默认路由了。这里的顺序就相当于默认路由的fallback顺序,优先级高的在前:
1234
/ip route ruleadd table=mainadd table=isp1add table=isp2
给进站方向连接打标签
对每个上游,在连接从上游接口进来的时候用conntrack打上connection mark,数据返回的时候根据connection mark设置对应的routing mark,这样返回包才能走正确的接口出去:
12345
/ip firewall mangleadd action=mark-connection chain=input in-interface=
如果你是想用VRF访问本机,那么所有在该VRF的端口作为一个运营商处理即可,匹配规则可以用interface list实现。
设置端口转发
如果需要做端口转发或者DMZ,可以直接写一条destination NAT规则(如果下游设备是对称路由的话,即使跨三层也不需要source NAT),类似这样:
12
/ip firewall natadd action=dst-nat chain=dstnat in-interface-list=
参考:
Manual:IP/Fasttrack
Navigation issue with Fasttrack in conjunction with pcc
PBR – Ensure traffic leaves the same interface it arrives on
Manual:PCC
多线接入的返程路由
VRF Management