路由是为TCP / IP网络上的数据包传输找到最佳路径的过程。 连接到IPv4网络的任何设备都包含一个进程表和路由表。
本文不是HOWTO,而是以RouterOS中的静态路由为例进行说明,我有意省略了其余设置(例如,用于访问Internet的srcnat),因此理解此材料需要一定程度的网络和RouterOS知识。
交换与路由

交换是在一个Layer2网段(以太网,ppp等)内交换数据包的过程。 如果设备发现数据包接收者与它原来在同一以太网子网上,则它会使用arp协议识别mac地址,并绕过路由器直接发送数据包。 ppp(点对点)连接只能有两个成员,并且数据包始终发送到相同的0xff地址。
路由是在第2层网段之间传输数据包的过程。 如果设备要发送数据包(其接收者在以太网段之外),则会查看其路由表,然后将数据包传递给网关,该网关知道进一步向何处发送数据包(或者可能不知道,数据包的原始发送者并不知道这一点)。
考虑路由器的最简单方法是将其作为连接到两个或多个Layer2网段并能够在它们之间传输数据包的设备,从而从路由表中确定最佳路由。
如果一切对您都清楚或您已经知道,请继续阅读。 我强烈建议其他人阅读一篇简短但非常全面的文章 。
在RouterOS和PacketFlow中进行路由
几乎所有与静态路由相关的功能都在系统软件包中。 路由包增加了对动态路由算法(RIP,OSPF,BGP,MME),路由过滤器和BFD的支持。
用于配置路由的主菜单: [IP]->[Route]
。 复杂的方案可能需要在[IP]->[Firewall]->[Mangle]
使用路由标签对数据包进行初步标签( PREROUTING
和OUTPUT
链)。
PacketFlow上有三个地方可以决定路由IP数据包:

- 路由器收到的路由数据包。 在此阶段,决定将数据包转到本地进程还是将进一步发送到网络。 传输数据包接收输出接口
- 路由本地传出数据包。 传出数据包接收输出接口
- 传出数据包的附加路由步骤使您可以在
[Output|Mangle]
更改路由决策。
- 块1、2中的数据包路径取决于
[IP]->[Route]
的规则 - 步骤1、2和3中的数据包路径取决于
[IP]->[Route]->[Rules]
- 可以使用
[IP]->[Firewall]->[Mangle]
影响块1、3中的数据包路径。
RIB,FIB,路由缓存

路由信息库
收集来自动态路由协议的路由,来自ppp和dhcp的路由,静态和连接的路由的基础。 该数据库包含除管理员过滤的路由以外的所有路由。
按照惯例 ,我们可以假设[IP]->[Route]
显示RIB。
转发信息库

从RIB出发的最佳航线路线所依据的基地。 FIB中的所有路由均处于活动状态,并用于转发数据包。 如果路由变为非活动状态(由管理员(系统)禁用,或者应该通过其发送数据包的接口处于非活动状态),则会从FIB中删除该路由。
为了确定路由,在FIB表中使用以下IP数据包数据:
进入FIB软件包需要经历以下阶段:
- 软件包是为本地路由器进程设计的吗?
- 软件包是否属于PBR系统或用户规则?
- 数据包发送到主表
按照惯例 ,我们可以假设[IP]->[Route Active=yes]
显示FIB。
路由缓存
路由缓存机制。 路由器会记住数据包的发送位置,如果有相似的数据包(大概来自同一连接),它将沿着相同的路由启动它们,而无需检查FIB。 定期清除路由缓存。
对于管理员来说,RouterOS没有查看和管理路由缓存的方法,但是有了它,您可以在[IP]->[Settings]
中将其禁用。
此机制已从Linux 3.6内核中删除,但是RouterOS仍使用内核3.3.5,可能是路由缓存是原因之一。
路线添加对话框
[IP]->[Route]->[+]

- 要为其创建路由的子网(默认值:0.0.0.0/0)
- 数据包将发送到的网关IP或接口(可能有多个,请参阅下面的ECMP)
- 检查网关可用性
- 记录类型
- 路线距离(公制)
- 路由表
- 通过此路由的本地出站数据包的IP
- 范围的目的和目标范围写在本文的末尾。
路线标志

- X-路由被管理员
disabled=yes
( disabled=yes
) - A-路由用于传输数据包。
- D-动态添加的路由(BGP,OSPF,RIP,MME,PPP,DHCP,已连接)
- C-子网直接连接到路由器
- S-静态路线
- r,b,o,m-路由是由一种动态路由协议添加的
- B,U,P-过滤路由(丢弃数据包而不是发送数据包)
在网关中指定什么:ip地址或接口?
该系统允许您同时指定它们两者,但不会发誓,并且如果做错了事也不会给出提示。
IP地址
网关地址必须可以通过Layer2访问。 对于以太网,这意味着路由器必须在活动接口之一上具有来自同一子网的IP地址,对于ppp-网关地址在活动接口之一上列为子网地址。
如果不满足第2层的可用性条件,则该路由被认为是不活动的,并且不属于FIB。
介面
一切都更加复杂,路由器的行为取决于接口的类型:
- PPP(异步,PPTP,L2TP,SSTP,PPPoE,OpenVPN *)假定连接只有两个参与者,并且数据包将始终发送到网关进行传输,如果网关检测到它是接收者本身,它将把数据包传输到其本地进程。

- 以太网假定有很多参与者,并且将使用数据包接收器的地址向arp接口发送请求,这是所连接路由的正常预期行为。
但是,当您尝试将接口用作远程子网的路由时,会遇到以下情况:路由处于活动状态,ping传递到网关,但未从指定的子网到达收件人。 如果通过嗅探器查看接口,则会看到带有来自远程子网地址的arp请求。


尽可能尝试将IP地址指定为网关。 例外是连接的路由(自动创建)和PPP(异步,PPTP,L2TP,SSTP,PPPoE,OpenVPN *)接口。
OpenVPN不包含PPP标头,但是您可以使用OpenVPN接口名称来创建路由。
更具体的路线
路由的基本规则。 在确定数据包路由时,描述较小子网(具有最大子网掩码)的路由具有较高的优先级。 条目在路由表中的位置与选择无关-基本规则是“更具体”。

指定方案中的所有路由均处于活动状态(位于FIB中),因为 指向不同的子网并且不会相互冲突。
如果其中一个网关不可用,则关联的路由将被视为不活动(已从FIB删除),并且将从其余路由中搜索数据包。
子网为0.0.0.0/0的路由有时具有特殊的意义,称为“默认路由”或“最后的网关”。 实际上,它没有什么神奇的功能,它仅包含所有可能的IPv4地址,但是这些名称很好地描述了其目的-它指示网关,在该网关处转发没有其他更准确路由的数据包。
IPv4的最大可能子网掩码为/ 32;此路由指向特定主机,可以在路由表中使用。
了解更特定的路由是任何TCP / IP设备的基础。
距离
距离(或度量)是对通过多个网关可访问的一个子网的路由进行管理性过滤所必需的。 度量值较低的路由被认为是优先级,将在FIB中。 如果具有较低度量标准的路由停止活动,则在FIB中它将被具有较高度量标准的路由替换。

如果有多个具有相同度量标准的通往同一子网的路由,则路由器将在其内部逻辑的指导下仅将其中一条添加到FIB表中。
指标的取值范围是0到255:

- 0-所连接路由的度量。 管理员无法设置距离0
- 1-254-管理员可用于设置路由的度量。 值较低的指标优先。
- 255-管理员可用于设置路由的度量。 与1-254不同,度量值为255的路由始终保持不活动状态,并且不属于FIB
- 特殊指标。 从动态路由协议接收的路由具有标准度量值
检查网关
检查网关-MikroTik RoutesOS扩展,用于通过icmp或arp检查网关的可用性。 每10秒一次(无法更改),一个请求将发送到网关,如果没有两次回答,则认为该路由不可用,并将其从FIB中删除。 如果检查网关禁用了验证路由,它将继续执行,并且一次成功的检查后,路由将再次变为活动状态。

检查网关会禁用配置网关的条目以及指定网关的所有其他条目(在所有路由表和ecmp路由中)。
通常,如果网关的数据包丢失没有问题,则检查网关可以正常工作。 Check网关不知道在被检查网关外部进行通信会发生什么,因为还需要以下附加工具:脚本,递归路由,动态路由协议。
大多数VPN和隧道协议都包含用于检查连接活动的内置工具,因此为它们启用检查网关是网络和设备性能的额外(但很小)负载。
ECMP路线
等价多路径-使用Round Robin算法同时使用多个网关将数据包发送到收件人。
管理员通过为一个子网指定多个网关来创建ECMP路由(如果有两个等效的OSPF路由,则为自动创建)。

ECMP用于平衡两个通道之间的负载,理论上,如果ecmp路由中有两个通道,则对于每个数据包,传出通道都应该不同。 但是路由缓存机制沿第一个数据包到达的路由从连接发送数据包,结果,我们得到了一种针对每个连接的负载平衡。
如果禁用路由缓存,则ECMP路由中的数据包将被正确分割,但是NAT存在问题。 NAT规则仅处理来自连接的第一个数据包(其余的将自动处理),并且情况是具有一个源地址的数据包来自不同的接口。

检查网关(RouterOS错误)在ECMP路由中不起作用。 但是,如果您创建其他验证路径,则会绕开此限制,这将禁用ECMP中的条目。
路由过滤
“类型”选项确定如何处理软件包:
- 单播-发送到指定的网关(接口)
- 黑洞-丢包
- 禁止,无法访问-丢弃数据包并向发送方发送icmp消息
通常,当您需要以错误的方式保护发送数据包的安全时,通常会使用过滤,当然您可以通过防火墙对其进行过滤。
几个例子
用于解决有关路由的基本问题。
典型的家用路由器

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1
- 到0.0.0.0/0的静态路由(默认路由)
- 与提供者的接口上的连接路由
- LAN接口上的连接路由
典型的PPPoE家庭路由器

- 静态路由到默认路由,自 这在连接属性中指示
- PPP连接的连接路由
- LAN接口上的连接路由
具有两个提供商和冗余的典型家庭路由器

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 distance=1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 distance=2
- 通过具有度量标准1的第一个提供程序的静态路由到默认路由,并检查网关的可用性
- 通过具有度量标准2的第二个提供程序的静态路由到默认路由
- 连通路线
到0.0.0.0/0的流量通过10.10.10.1,而此网关可用,否则它将切换到10.20.20.1
这样的方案可以被认为是信道预留,但是它也不是没有缺点。 如果中断发生在提供商的网关外部(例如,运营商网络内部),则您的路由器将不知道该中断,并将继续认为该路由处于活动状态。
典型的家用路由器具有两个提供程序,冗余和ECMP

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.10.10.1,10.20.20.1 distance=1
- 检查Chack网关的静态路由
- ECMP路线
- 连通路线
用于检查蓝色的路由(非活动路由的颜色),但这不会影响检查网关的操作。 在当前版本(6.44)RoS中,将自动优先级赋予ECMP路由,但是最好将测试路由添加到其他路由表中(选项routing-mark
)
Speedtest和其他类似站点上的速度不会提高(ECMP按连接而不是数据包划分流量),但p2p应用程序应加载得更快。
通过路由过滤

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 add dst-address=192.168.200.0/24 gateway=10.30.30.1 distance=1 add dst-address=192.168.200.0/24 gateway=10.10.10.1 distance=2 type=blackhole
- 静态路由到默认路由
- 通过ipip隧道到192.168.200.0/24的静态路由
- 禁止通过提供商的路由器到192.168.200.0/24的静态路由
过滤选项,禁用ipip接口时,隧道流量不会进入提供商的路由器。 很少需要这种方案,因为 可以通过防火墙实施阻止。
路由回路
路由循环是指ttl过期之前,数据包在路由器之间运行的情况。 通常,这是配置错误的结果,在大型网络中,应谨慎执行动态路由协议,在小型网络中应将其处理。
看起来像这样:

示例(最简单)如何获得相似的结果:

路由循环示例没有实际用途,但是它表明路由器不了解其邻居的路由表。
策略库路由和其他路由表
选择路由时,路由器仅使用数据包标头(目标地址)中的一个字段-这是基本路由。 基于其他条件的路由,例如源地址,流量类型(ToS),不使用ECMP的平衡,是指策略基础路由(PBR),并使用其他路由表。

“更特定的路由”是在路由表中选择路由的基本规则。
默认情况下,所有路由规则都添加到主表中。 管理员可以创建任意数量的其他路由表,并将数据包路由到它们。 不同表中的规则不会相互冲突。 如果程序包在指定的表中找不到合适的规则,它将转到主表。
通过防火墙的分发示例:

- 192.168.100.10-> 8.8.8.8
- 来自192.168.100.10的流量会在
[Prerouting|Mangle]
收到via-isp1标签 。 - 在“路由”阶段,在via-isp1表中,搜索一条路由 ,直到8.8.8.8。
- 找到路由,将流量发送到网关10.10.10.1
- 192.168.200.20-> 8.8.8.8
- 来自192.168.200.20的流量会在
[Prerouting|Mangle]
收到via-isp2标签 - 在“路由”阶段, via-isp2表搜索的路由最高可达8.8.8.8。
- 找到路由,将流量发送到网关10.20.20.1
- 如果其中一个网关(10.10.10.1或10.20.20.1)不可用,则数据包将转到主表并在其中寻找合适的路由
术语问题
RouterOS存在某些术语问题。
在[IP]->[Routes]
使用规则时,会显示路由表,尽管它说标签:

在[IP]->[Routes]->[Rule]
一切正确,在表操作的条件标签中:

如何将数据包发送到特定的路由表
RouterOS提供了几种工具:
[IP]->[Routes]->[Rules]
[IP]->[Firewall]->[Mangle]
路由标签( action=mark-routing
)- VRF
规则[IP]->[Route]->[Rules]
规则是按顺序处理的,如果数据包符合规则的条件,则不会继续进行。
路由规则使您可以扩展路由功能,不仅依赖于收件人地址,而且还依赖于源地址和接收数据包的接口。

规则由条件和动作组成:
- 条件。 他们实际上重复了在FIB中检查数据包的标志列表;仅缺少ToS。
- 动作
- 查找-将数据包发送到表
- 仅在表中查找-将包锁定在表中,如果未找到路由,则包将不会进入主表
- 丢弃-丢弃数据包
- 无法到达-删除发件人通知数据包
在FIB中,绕过规则[IP]->[Route]->[Rules]
处理到本地进程的流量:

标记[IP]->[Firewall]->[Mangle]
路由标签允许您使用几乎所有防火墙条件为数据包设置网关:

实际上,因为并非所有人都讲得通,所以有些人可能工作不稳定。

有两种标记包装的方法:
- 立即设置路由标记
- 首先设置连接标记 ,然后基于连接标记设置路由标记
在有关防火墙的文章中,我写道第二种选择是可取的,因为 在标记路由的情况下,可以减少cpu的负载-这并非完全正确。 这些标记方法并不总是等效的,通常用于解决各种问题。
使用范例
我们继续使用“基于策略的路由”的示例,向他们展示为什么需要所有这些更加容易。
MultiWAN和响应传出(输出)流量
MultiWAN配置的一个常见问题:Mikrotik仅可通过“活动”提供程序从Internet访问。

与路由器请求的IP无关,在生成响应时,它将在路由表中查找通过isp1的路由处于活动状态的路由。 此外,这样的分组很可能在到达接收者的途中被过滤。
另一个有趣的观点。 如果在ether1接口上配置了“简单”源nat: /ip fi nat add out-interface=ether1 action=masquerade
数据包将通过src进入网络。 地址= 10.10.10.100,这将使情况进一步恶化。
有几种方法可以解决此问题,但是任何一种方法都需要附加的路由表:

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 check-gateway=ping distance=1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 check-gateway=ping distance=2 add dst-address=0.0.0.0/0 gateway=10.10.10.1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 routing-mark=over-isp2
使用[IP]->[Route]->[Rules]
指定将用于具有指定源IP的数据包的路由表。

/ip route rule add src-address=10.10.10.100/32 action=lookup-only-in-table table=over-isp1 add src-address=10.20.20.200/32 action=lookup-only-in-table table=over-isp2
您可以使用action=lookup
,但是对于本地传出流量,此选项完全排除了来自错误接口的连接。
- 系统生成带有Src的响应数据包。 地址:10.20.20.200
- 在路由决策(2)阶段,检查
[IP]->[Routes]->[Rules]
,并将数据包发送到over-isp2路由表 - 根据路由表,必须通过ether2接口将数据包发送到网关10.20.20.1

与使用Mangle表不同,此方法不需要有效的Connection Tracker。
使用[IP]->[Firewall]->[Mangle]
连接从传入的数据包开始,因此我们对其进行标记( action=mark-connection
),对于来自标记的连接的传出数据包,我们设置了路由标签( action=mark-routing
)。

/ip firewall mangle # add chain=input in-interface=ether1 connection-state=new action=mark-connection new-connection-mark=from-isp1 add chain=input in-interface=ether2 connection-state=new action=mark-connection new-connection-mark=from-isp2 # add chain=output connection-mark=from-isp1 action=mark-routing new-routing-mark=over-isp1 passthrough=no add chain=output connection-mark=from-isp2 action=mark-routing new-routing-mark=over-isp2 passthrough=no
ip, dst-address
.
- ether2 .
[INPUT|Mangle]
from-isp2 - Src. Address: 10.20.20.200
- Routing Decision(2) 10.20.20.1 ether1.
[OUTPUT|Filter]
[OUTPUT|Mangle]
from-isp2 over-isp2- Routing Adjusment(3)
- 10.20.20.1 ether2

MultiWAN dst-nat
, ( web) .
/ip firewall nat add chain=dstnat proto=tcp dst-port=80,443 in-interface=ether1 action=dst-nat to-address=192.168.100.100 add chain=dstnat proto=tcp dst-port=80,443 in-interface=ether2 action=dst-nat to-address=192.168.100.100
, Firewall Mangle, :

/ip firewall mangle add chain=prerouting connection-state=new in-interface=ether1 protocol=tcp dst-port=80,443 action=mark-connection new-connection-mark=web-input-isp1 add chain=prerouting connection-state=new in-interface=ether2 protocol=tcp dst-port=80,443 action=mark-connection new-connection-mark=web-input-isp2 add chain=prerouting connection-mark=web-input-isp1 in-interface=ether3 action=mark-routing new-routing-mark=over-isp1 passthrough=no add chain=prerouting connection-mark=web-input-isp2 in-interface=ether3 action=mark-routing new-routing-mark=over-isp2 passthrough=no

NAT, .
MultiWAN
PBR vpn ( SSTP) .

:
/ip route add dst-address=0.0.0.0/0 gateway=192.168.100.1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=192.168.200.1 routing-mark=over-isp2 add dst-address=0.0.0.0/0 gateway=192.168.0.1 routing-mark=over-isp3 add dst-address=0.0.0.0/0 gateway=192.168.100.1 distance=1 add dst-address=0.0.0.0/0 gateway=192.168.200.1 distance=2 add dst-address=0.0.0.0/0 gateway=192.168.0.1 distance=3
:
/ip firewall mangle add chain=output dst-address=10.10.10.100 proto=tcp dst-port=443 action=mark-routing new-routing-mark=over-isp1 passtrough=no add chain=output dst-address=10.10.10.101 proto=tcp dst-port=443 action=mark-routing new-routing-mark=over-isp2 passtrough=no add chain=output dst-address=10.10.10.102 proto=tcp dst-port=443 action=mark-routing new-routing-mark=over-isp3 passtrough=no
NAT, Src. Address:
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade add chain=srcnat out-interface=ether2 action=masquerade add chain=srcnat out-interface=ether3 action=masquerade
:
- SSTP
- Routing Decision (2) , main. Src. Address ether1
[Output|Mangle]
- Routing Adjusment
- Src. Address ether1,
[Nat|Srcnat]
, :

Connection Tracker [Mangle]
[Srcnat]
, , Replay Dst. Address
NAT:

VPN ( ) :

, :
/ip route add dst-address=10.10.10.100 gateway=192.168.100.1 add dst-address=10.10.10.101 gateway=192.168.200.1 add dst-address=10.10.10.102 gateway=192.168.0.1
. , vpn , 6 [IP]->[Routes]
type=blackhole
. — 3 [IP]->[Route]->[Rules]
.
, . :
/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=2 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=1 routing-mark=over-isp2
[IP]->[Route]->[Rules]

/ip route rules add src-address=192.168.100.0/25 action=lookup-only-in-table table=over-isp1 add src-address=192.168.100.128/25 action=lookup-only-in-table table=over-isp2
action=lookup
, main . — .
[IP]->[Firewall]->[Mangle]
ip . . layer7, , , .

/ip firewall mangle add chain=prerouting src-address-list=users-over-isp1 dst-address-type=!local action=mark-routing new-routing-mark=over-isp1 add chain=prerouting src-address-list=users-over-isp2 dst-address-type=!local action=mark-routing new-routing-mark=over-isp2
"" [IP]->[Route]->[Rules]
:
/ip route rules add routing-mark=over-isp1 action=lookup-only-in-table table=over-isp1 add routing-mark=over-isp2 action=lookup-only-in-table table=over-isp2
[IP]->[Firewall]->[Filter]
:
/ip firewall filter add chain=forward routing-mark=over-isp1 out-interface=!ether1 action=reject add chain=forward routing-mark=over-isp2 out-interface=!ether2 action=reject
dst-address-type=!local
dst-address-type=!local
(dns, winbox, ssh, ...). , , dst-address-table
.
[IP]->[Route]->[Rules]
, . , FIB [PREROUTING|Mangle]
main, . Routing Rules, User PBR .
[IP]->[Firewall]->[Mangle action=route]
[Prerouting|Mangle]
, :
/ip firewall mangle add chain=prerouting src-address=192.168.100.0/25 action=route gateway=10.10.10.1 add chain=prerouting src-address=192.168.128.0/25 action=route gateway=10.20.20.1
route
( [IP]->[Route]->[Rules]
). , action=route
action=mark-route
, ( passtrough
), .
wiki , .
PPC
Per Connection Classificator — ECMP. ECMP (ECMP , Routing Cache ).
PCC ip , 32- . , . . , .

:
192.168.100.10: 192+168+100+10 = 470 % 3 = 2 192.168.100.11: 192+168+100+11 = 471 % 3 = 0 192.168.100.12: 192+168+100+12 = 472 % 3 = 1
src.address :

# /ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=2 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.30.30.1 dist=3 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=1 routing-mark=over-isp2 add dst-address=0.0.0.0/0 gateway=10.30.30.1 dist=1 routing-mark=over-isp3 # /ip firewall mangle add chain=prerouting in-interface=br-lan dst-address-type=!local connection-state=new per-connection-classifier=src-address:3/0 action=mark-connection new-connection-mark=conn-over-isp1 add chain=prerouting in-interface=br-lan dst-address-type=!local connection-state=new per-connection-classifier=src-address:3/1 action=mark-connection new-connection-mark=conn-over-isp2 add chain=prerouting in-interface=br-lan dst-address-type=!local connection-state=new per-connection-classifier=src-address:3/2 action=mark-connection new-connection-mark=conn-over-isp3 add chain=prerouting in-interface=br-lan connection-mark=conn-over-isp1 action=mark-routing new-routing-mark=over-isp1 add chain=prerouting in-interface=br-lan connection-mark=conn-over-isp2 action=mark-routing new-routing-mark=over-isp2 add chain=prerouting in-interface=br-lan connection-mark=conn-over-isp3 action=mark-routing new-routing-mark=over-isp3
: in-interface=br-lan
, action=mark-routing
.
Check ping — , IP , , , check ping .
BGP, .
, ip , , google dns: 8.8.8.8. 8.8.4.4. Mikrotik .
Multihop BGP MikroTik, check gateway .
scope/target scope :

- scope main target scope
- ,
- connected
, :

- 1-3 connected ,
- 4-6 connected ""
RIB, FIB : 0.0.0.0/0 via 10.10.10.1 on ether1
.

:

/ip route add dst-address=0.0.0.0/0 gateway=8.8.8.8 check-gateway=ping distance=1 target-scope=10 add dst-address=8.8.8.8 gateway=10.10.10.1 scope=10 add dst-address=0.0.0.0/0 gateway=10.20.20.1 distance=2
, 10.10.10.1:

Check gateway ping' 8.8.8.8, ( main) 10.10.10.1.
10.10.10.1 8.8.8.8, , ( ping) 8.8.8.8 10.10.10.1:

ether1, , 8.8.8.8 :

, NetWatch 8.8.8.8. NetWatch . :
/ip route add dst-address=8.8.8.8 gateway=10.20.20.1 distance=100 type=blackhole

, NetWatch .
, 8.8.8.8 , dns .
Virtual Routing and Forwarding (VRF)
VRF , ( MPLS) L3VPN :

VRF Mikrotik , ip VRF, .
vrf:

/ip route vrf add interfaces=ether1 routing-mark=vrf1 add interfaces=ether2 routing-mark=vrf2 /ip address add address=192.168.100.1/24 interface=ether1 network=192.168.100.0 add address=192.168.200.1/24 interface=ether2 network=192.168.200.0
ether2 , ping vrf ( ), ping :

main ( vrf route leaking):

/ip route add distance=1 gateway=172.17.0.1@main routing-mark=vrf1 add distance=1 gateway=172.17.0.1%wlan1 routing-mark=vrf2
route leaking: : 172.17.0.1@main
: 172.17.0.1%wlan1
.
[PREROUTING|Mangle]
:

/ip firewall mangle add chain=prerouting in-interface=ether1 action=mark-connection new-connection-mark=from-vrf1 passthrough=no add chain=prerouting connection-mark=from-vrf1 routing-mark=!vrf1 action=mark-routing new-routing-mark=vrf1 passthrough=no add chain=prerouting in-interface=ether2 action=mark-connection new-connection-mark=from-vrf2 passthrough=no add chain=prerouting connection-mark=from-vrf2 routing-mark=!vrf1 action=mark-routing new-routing-mark=vrf2 passthrough=no

VRF netmap:

:
/ip route vrf add interfaces=ether1 routing-mark=vrf1 add interfaces=ether2 routing-mark=vrf2 /ip address add address=192.168.100.1/24 interface=ether1 network=192.168.100.0 add address=192.168.100.1/24 interface=ether2 network=192.168.100.0 add address=192.168.0.1/24 interface=ether3 network=192.168.0.0
firewall:
# /ip firewall mangle add chain=prerouting dst-address=192.168.101.0/24 in-interface=ether3 action=mark-routing new-routing-mark=vrf1 passthrough=no add chain=prerouting dst-address=192.168.102.0/24 in-interface=ether3 action=mark-routing new-routing-mark=vrf2 passthrough=no # netmap "" /ip firewall nat add chain=dstnat dst-address=192.168.101.0/24 in-interface=ether3 action=netmap to-addresses=192.168.100.0/24 add chain=dstnat dst-address=192.168.102.0/24 in-interface=ether3 action=netmap to-addresses=192.168.100.0/24
:
# route leaking, connected /ip route add distance=1 dst-address=192.168.0.0/24 gateway=ether3 routing-mark=vrf1 add distance=1 dst-address=192.168.0.0/24 gateway=ether3 routing-mark=vrf2
dhcp
VRF , ( dhcp client) .
vrf:
/ip route vrf add interface=ether1 routing-mark=over-isp1
( ) over-isp1 :
/ip firewall mangle add chain=output out-interface=!br-lan action=mark-routing new-routing-mark=over-isp1 passthrough=no add chain=prerouting in-interface=br-lan dst-address-type=!local action=mark-routing new-routing-mark=over-isp1 passthrough=no
, :
/interface bridge add name=bare /ip route add dst-address=0.0.0.0/0 gateway=bare
Routing decision (2) [OUTPUT|Mangle]
, 0.0.0.0/0 main .

connected-in
dynamic-in
[Routing] -> [Filters]
( ) — ( routing ), :
- connected-in — connected
- dynamic-in — PPP DCHP
, : distance, routing-mark, comment, scope, target scope, ...
- Routing Filters ( ), Routing Filters, . Routing Filters .
Routing Mark
. VPN . - :
# vpn default route /interface pptp-client add connect-to=XXXX add-default-route=yes default-route-distance=101 ... add connect-to=YYYY add-default-route=yes default-route-distance=100 ... # /routing filter add chain=dynamic-in distance=100 prefix=0.0.0.0/0 action=passthrough set-routing-mark=over-vpn1 add chain=dynamic-in distance=101 prefix=0.0.0.0/0 action=passthrough set-routing-mark=over-vpn2
, , vrf ppp , 0.0.0.0/0 main. .
Connected
:
/route filter add chain=connected-in prefix=192.168.100.0/24 action=reject
RouterOS :
[Tool]->[Torch]
—/ip route check
— ,/ping routing-table=<name>
/tool traceroute routing-table=<name>
— pingaction=log
[IP]->[Firewall]
— , packet flow,