RouterOS在多个上游情况下正确设置返回包的默认路由

应用场景:

一: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的开一下:

同理,其它几个chain上的fasttrack如果涉及到相应功能也需要关闭。

关闭Reverse Path Filter

RP filter如果设置成strict,那么返回的数据包如果不是从默认路由回去就会被丢掉。所以要把RP filter设置成loose或者no。

打开Conntrack

设置分运营商路由表

对每个上游分别建立一个路由表(即connection mark),给这个路由表设置一条默认路由(distance或者metrics统一即可;如果你是想用VRF访问本机,那么不需要默认路由),并且用ip rule功能把main路由表优先级提到自己的路由表之前,以便connected路由能够正确查询到:

注意,这里main路由表就不允许有默认路由了,否则分上游路由表的路由是不会生效的。

如果你的上游运营商使用DHCP或者别的路由协议分发路由表,导致默认路由是动态生成的,那么可以把这个接口直接放进VRF里面来实现相同的配置:

如果默认路由使用路由协议分发,路由协议一般有自己的VRF配置选项,也需要设置成对应的VRF。

设置主路由表

下游设备默认会走main路由表,我们要在main路由表之后接上分运营商路由表,这样下游设备就有默认路由了。这里的顺序就相当于默认路由的fallback顺序,优先级高的在前:

给进站方向连接打标签

对每个上游,在连接从上游接口进来的时候用conntrack打上connection mark,数据返回的时候根据connection mark设置对应的routing mark,这样返回包才能走正确的接口出去:

如果你是想用VRF访问本机,那么所有在该VRF的端口作为一个运营商处理即可,匹配规则可以用interface list实现。

设置端口转发

如果需要做端口转发或者DMZ,可以直接写一条destination NAT规则(如果下游设备是对称路由的话,即使跨三层也不需要source NAT),类似这样:


参考:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据