Mikrotik RouterOS 中静态路由的基础知识

路由是寻找通过 TCP/IP 网络传输数据包的最佳路径的过程。 任何连接到 IPv4 网络的设备都包含一个进程和路由表。

这篇文章不是HOWTO,它是用例子描述RouterOS中的静态路由,我特意省略了其余的设置(例如,用于上网的srcnat),所以看懂这些材料需要一定的网络和RouterOS知识。

交换和路由

Mikrotik RouterOS 中静态路由的基础知识

交换是在第 2 层网段(以太网、ppp 等)内交换数据包的过程。 如果设备发现数据包的接收方与其在同一以太网子网上,它会使用 arp 协议学习 mac 地址并直接传输数据包,绕过路由器。 ppp(点对点)连接只能有两个参与者,数据包总是发送到一个地址 0xff。

路由是在第 2 层网段之间传输数据包的过程。 如果一个设备想要发送一个接收者在以太网段之外的数据包,它会查看它的路由表并将数据包传递给网关,网关知道接下来将数据包发送到哪里(或者可能不知道数据包的原始发送者对此一无所知)。

将路由器视为连接到两个或多个第 2 层网段并能够通过确定路由表中的最佳路由在它们之间传递数据包的设备。

如果您了解所有内容,或者您​​已经了解,请继续阅读。 对于其余部分,我强烈建议您熟悉一个小但非常宽敞的 文章.

RouterOS 和 PacketFlow 中的路由

几乎所有与静态路由相关的功能都在包中 系统. 塑料袋 路由 添加对动态路由算法(RIP、OSPF、BGP、MME)、路由过滤器和 BFD 的支持。

设置路由的主菜单: [IP]->[Route]. 复杂的方案可能需要在以下位置预先标记数据包的路由标记: [IP]->[Firewall]->[Mangle] (链条 PREROUTING и OUTPUT).

PacketFlow 在三个地方做出 IP 数据包路由决策:
Mikrotik RouterOS 中静态路由的基础知识

  1. 路由路由器收到的数据包。 在此阶段,决定数据包是转到本地进程还是进一步发送到网络。 中转包裹领取 输出接口
  2. 路由本地传出数据包。 传出数据包接收 输出接口
  3. 传出数据包的附加路由步骤,允许您更改路由决策 [Output|Mangle]

  • 块 1、2 中的数据包路径取决于中的规则 [IP]->[Route]
  • 点 1、2 和 3 中的数据包路径取决于中的规则 [IP]->[Route]->[Rules]
  • 可以使用影响块 1、3 中的包路径 [IP]->[Firewall]->[Mangle]

RIB、FIB、路由缓存

Mikrotik RouterOS 中静态路由的基础知识

路由信息库
从动态路由协议、来自 ppp 和 dhcp 的路由、静态路由和连接路由收集路由的基础。 该数据库包含所有路由,但管理员过滤的路由除外。

有条件的, 我们可以假设 [IP]->[Route] 显示 RIB。

转发信息库
Mikrotik RouterOS 中静态路由的基础知识

收集来自 RIB 的最佳路线的基地。 FIB 中的所有路由都处于活动状态,用于转发数据包。 如果路由变为非活动状态(被管理员(系统)禁用,或者应该发送数据包的接口不活动),则该路由将从 FIB 中删除。

为了做出路由决策,FIB 表使用有关 IP 数据包的以下信息:

  • 源地址
  • 目的地址
  • 源接口
  • 路线标记
  • 服务条款 (DSCP)

进入 FIB 包需要经历以下阶段:

  • 该包是否用于本地路由器进程?
  • 数据包是否受制于系统或用户 PBR 规则?
    • 如果是,则将数据包发送到指定的路由表
  • 数据包发送到主表

有条件的, 我们可以假设 [IP]->[Route Active=yes] 显示 FIB。

路由缓存
路由缓存机制。 路由器会记住数据包的发送位置,如果有相似的数据包(可能来自同一连接),它会让它们沿着相同的路线前进,而无需检查 FIB。 定期清除路由缓存。

对于 RouterOS 管理员,他们没有制作用于查看和管理路由缓存的工具,但是当它可以被禁用时 [IP]->[Settings].

这种机制在linux 3.6内核中被移除了,但是RouterOS仍然使用内核3.3.5,也许Routing cahce是原因之一。

添加路线对话框

[IP]->[Route]->[+]
Mikrotik RouterOS 中静态路由的基础知识

  1. 您要为其创建路由的子网(默认值:0.0.0.0/0)
  2. 数据包将发送到的网关 IP 或接口(可能有多个,请参阅下面的 ECMP)
  3. 网关可用性检查
  4. 记录类型
  5. 路线的距离(公制)
  6. 路由表
  7. 通过此路由的本地传出数据包的 IP
  8. Scope和Target Scope的用途写在文章末尾。

路由标志
Mikrotik RouterOS 中静态路由的基础知识

  • X - 路由被管理员禁用(disabled=yes)
  • A - 该路由用于发送数据包
  • D - 路由动态添加(BGP、OSPF、RIP、MME、PPP、DHCP、Connected)
  • C - 子网直接连接到路由器
  • S - 静态路由
  • r,b,o,m - 由动态路由协议之一添加的路由
  • B、U、P - 过滤路由(丢弃数据包而不是传输)

在网关中指定什么:IP 地址或接口?

该系统允许您指定两者,同时它不会发誓,如果您做错了什么也不会给出提示。

IP地址
网关地址必须可通过第 2 层访问。 对于以太网,这意味着路由器必须在活动 ip 接口之一上具有来自同一子网的地址,对于 ppp,网关地址在活动接口之一上指定为子网地址。
如果不满足 Layer2 的可达性条件,则认为该路由不活跃,不属于 FIB。

接口
一切都更加复杂,路由器的行为取决于接口类型:

  • PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN *) 连接假设只有两个参与者并且数据包将始终发送到网关进行传输,如果网关检测到接收者是自己,则将数据包传输到它的本地进程。
    Mikrotik RouterOS 中静态路由的基础知识
  • 以太网假定存在许多参与者,并将向带有数据包接收者地址的 arp 接口发送请求,这是预期的并且对于连接的路由来说是非常正常的行为。
    但是当您尝试将该接口用作远程子网的路由时,您会遇到以下情况:路由处于活动状态,ping 网关通过,但未到达指定子网的接收者。 如果通过嗅探器查看接口,您将看到带有来自远程子网地址的 arp 请求。
    Mikrotik RouterOS 中静态路由的基础知识

Mikrotik RouterOS 中静态路由的基础知识

尽可能将 ip 地址指定为网关。 连接路由(自动创建)和 PPP(异步、PPTP、L2TP、SSTP、PPPoE、OpenVPN*)接口除外。

OpenVPN 不包含 PPP 标头,但您可以使用 OpenVPN 接口名称来创建路由。

更具体的路线

基本路由规则。 描述较小子网(具有最大子网掩码)的路由在数据包的路由决策中优先。 条目在路由表中的位置与选择无关——主要规则是更具体。

Mikrotik RouterOS 中静态路由的基础知识

来自指定方案的所有路由都处于活动状态(位于 FIB 中)。 指向不同的子网,互不冲突。

如果其中一个网关变得不可用,则关联的路由将被视为不活动(从 FIB 中删除),并且将从其余路由中搜索数据包。

子网为 0.0.0.0/0 的路由有时被赋予特殊含义,称为“默认路由”或“最后选择的网关”。 事实上,它并没有什么神奇之处,它只是包含所有可能的 IPv4 地址,但这些名称很好地描述了它的任务——它指示网关将数据包转发到哪里,没有其他更准确的路由。

IPv4 的最大可能子网掩码是/32,这个路由指向一个特定的主机并且可以在路由表中使用。

了解更具体的路由是任何 TCP/IP 设备的基础。

距离

需要距离(或度量)来管理过滤到可通过多个网关访问的单个子网的路由。 具有较低度量值的路由被视为优先级,并将包含在 FIB 中。 如果具有较低度量的路由不再处于活动状态,则它将被 FIB 中具有较高度量的路由替换。
Mikrotik RouterOS 中静态路由的基础知识

如果有多条路由到同一个子网具有相同的度量,路由器将根据其内部逻辑仅将其中一条添加到 FIB 表中。

指标可以取 0 到 255 之间的值:
Mikrotik RouterOS 中静态路由的基础知识

  • 0 - 连接路由的指标。 管理员不能设置距离 0
  • 1-254 - 管理员可用于设置路由的指标。 具有较低值的指标具有较高的优先级
  • 255 - 管理员可用于设置路由的指标。 与 1-254 不同,度量为 255 的路由始终处于非活动状态,不会落入 FIB
  • 具体指标。 源自动态路由协议的路由具有标准度量值

检查网关

检查网关是 MikroTik RoutesOS 的扩展,用于通过 icmp 或 arp 检查网关的可用性。 每 10 秒一次(不可更改),向网关发送一个请求,如果两次都没有收到响应,则认为该路由不可用并从 FIB 中删除。 如果检查网关已禁用,检查路由将继续,并且该路由将在一次成功检查后再次激活。
Mikrotik RouterOS 中静态路由的基础知识

检查网关禁用配置它的条目和所有其他条目(在所有路由表和 ecmp 路由中)与指定的网关。

一般情况下,只要网关没有丢包问题,检查网关就可以正常工作。 检查网关不知道被检查网关外部的通信发生了什么,这需要额外的工具:脚本、递归路由、动态路由协议。

大多数 VPN 和隧道协议都包含用于检查连接活动的内置工具,为它们启用检查网关是对网络和设备性能的额外(但非常小)负载。

ECMP路线

Equal-Cost Multi-Path - 使用 Round Robin 算法同时使用多个网关向接收方发送数据包。

ECMP 路由由管理员通过为一个子网指定多个网关来创建(或者自动创建,如果有两个等效的 OSPF 路由)。
Mikrotik RouterOS 中静态路由的基础知识

ECMP 用于两个通道之间的负载平衡,理论上,如果 ecmp 路由中有两个通道,则每个数据包的输出通道应该不同。 但是路由缓存机制沿着第一个数据包所走的路由从连接发送数据包,因此,我们得到了一种基于连接的平衡(每个连接负载平衡)。

如果禁用路由缓存,则 ECMP 路由中的数据包将被正确共享,但 NAT 会出现问题。 NAT 规则只处理来自连接的第一个数据包(其余的自动处理),结果是具有相同源地址的数据包离开不同的接口。
Mikrotik RouterOS 中静态路由的基础知识

检查网关在 ECMP 路由中不起作用(RouterOS 错误)。 但是您可以通过创建额外的验证路由来绕过此限制,这些路由将禁用 ECMP 中的条目。

通过路由过滤

Type 选项决定了如何处理包:

  • 单播 - 发送到指定的网关(接口)
  • blackhole - 丢弃数据包
  • prohibit, unreachable - 丢弃数据包并向发送方发送 icmp 消息

过滤通常在需要保证数据包沿着错误路径发送时使用,当然,你可以通过防火墙过滤。

几个例子

巩固关于路由的基本东西。

典型的家用路由器
Mikrotik RouterOS 中静态路由的基础知识

/ip route
add dst-address=0.0.0.0/0 gateway=10.10.10.1

  1. 到 0.0.0.0/0 的静态路由(默认路由)
  2. 与提供商接口上的连接路由
  3. LAN 接口上的连接路由

带 PPPoE 的典型家用路由器
Mikrotik RouterOS 中静态路由的基础知识

  1. 静态路由到默认路由,自动添加。 它在连接属性中指定
  2. PPP连接的连接路由
  3. LAN 接口上的连接路由

具有两个提供商和冗余的典型家用路由器
Mikrotik RouterOS 中静态路由的基础知识

/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. 静态路由到默认路由,通过第一个提供商,使用度量 1 和网关可用性检查
  2. 静态路由到默认路由,通过度量为 2 的第二个提供商
  3. 连接路线

当此网关可用时,到 0.0.0.0/0 的流量通过 10.10.10.1,否则切换到 10.20.20.1

这样的方案可以被认为是信道预留,但它并非没有缺点。 如果中断发生在提供商的网关之外(例如,在运营商的网络内部),您的路由器将不会知道并继续将路由视为活动路由。

具有两个供应商、冗余和 ECMP 的典型家用路由器
Mikrotik RouterOS 中静态路由的基础知识

/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

  1. 检查chack网关的静态路由
  2. ECMP路线
  3. 连接路线

要检查的路由是蓝色的(非活动路由的颜色),但这不会干扰检查网关。 RoS的当前版本(6.44)自动优先考虑ECMP路由,但最好将测试路由添加到其他路由表(选项 routing-mark)

在 Speedtest 和其他类似站点上,速度不会增加(ECMP 按连接数而不是数据包划分流量),但 p2p 应用程序下载速度应该更快。

通过路由过滤
Mikrotik RouterOS 中静态路由的基础知识

/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

  1. 静态路由到默认路由
  2. 通过 ipip 隧道到 192.168.200.0/24 的静态路由
  3. 禁止通过 ISP 路由器到 192.168.200.0/24 的静态路由

一个过滤选项,当 ipip 接口被禁用时,隧道流量不会进入提供商的路由器。 很少需要这样的方案,因为您可以通过防火墙实施阻止。

路由循环
路由循环 - 数据包在 ttl 到期之前在路由器之间运行的情况。 通常它是配置错误的结果,在大型网络中它通过动态路由协议的实现来处理,在小型网络中 - 小心。

它看起来像这样:
Mikrotik RouterOS 中静态路由的基础知识

如何获得类似结果的示例(最简单):
Mikrotik RouterOS 中静态路由的基础知识

路由循环示例没有实际用处,但它表明路由器不知道其邻居的路由表。

策略基础路由和附加路由表

选择路由时,路由器仅使用数据包标头中的一个字段(Dst.Address)——这是基本路由。 基于其他条件的路由,例如源地址、流量类型 (ToS)、不使用 ECMP 的平衡,属于策略基础路由 (PBR),并使用额外的路由表。

Mikrotik RouterOS 中静态路由的基础知识

更具体的路线 是路由表中的主要路由选择规则。

默认情况下,所有路由规则都添加到主表中。 管理员可以创建任意数量的附加路由表并将数据包路由到它们。 不同表中的规则不会相互冲突。 如果包在指定的表中没有找到合适的规则,它将转到主表。

通过防火墙分发的示例:
Mikrotik RouterOS 中静态路由的基础知识

  • 192.168.100.10年8.8.8.8月XNUMX日-> XNUMX年XNUMX月XNUMX日
    1. 来自 192.168.100.10 的流量被标记 通过-isp1 в [Prerouting|Mangle]
    2. 在表中的路由阶段 通过-isp1 搜索到 8.8.8.8 的路由
    3. 找到路由,流量发送到网关 10.10.10.1
  • 192.168.200.20年8.8.8.8月XNUMX日-> XNUMX年XNUMX月XNUMX日
    1. 来自 192.168.200.20 的流量被标记 通过-isp2 в [Prerouting|Mangle]
    2. 在表中的路由阶段 通过-isp2 搜索到 8.8.8.8 的路由
    3. 找到路由,流量发送到网关 10.20.20.1
  • 如果其中一个网关(10.10.10.1 或 10.20.20.1)变得不可用,则数据包将进入表 并会在那里寻找合适的路线

术语问题

RouterOS 存在某些术语问题。
在使用规则时 [IP]->[Routes] 指示了路由表,尽管标签上写着:
Mikrotik RouterOS 中静态路由的基础知识

В [IP]->[Routes]->[Rule] 一切正确,在表动作中的标签条件中:
Mikrotik RouterOS 中静态路由的基础知识

如何将数据包发送到特定的路由表

RouterOS 提供了几个工具:

  • 规则在 [IP]->[Routes]->[Rules]
  • 路线标记 (action=mark-routing)在 [IP]->[Firewall]->[Mangle]
  • VRF

法规 [IP]->[Route]->[Rules]
规则按顺序处理,如果数据包符合规则的条件,则不会继续通过。

路由规则允许您扩展路由的可能性,不仅依赖于收件人地址,还依赖于源地址和接收数据包的接口。

Mikrotik RouterOS 中静态路由的基础知识

规则由条件和操作组成:

  • 状况。 实际上重复在 FIB 中检查包裹的标志列表,只缺少 ToS。
  • 活动
    • 查找 - 将数据包发送到表
    • lookup only in table - 锁定表中的包,如果找不到路由,包将不会转到主表
    • drop - 丢弃一个数据包
    • 无法到达 - 丢弃带有发件人通知的数据包

在 FIB 中,绕过规则处理到本地进程的流量 [IP]->[Route]->[Rules]:
Mikrotik RouterOS 中静态路由的基础知识

记号 [IP]->[Firewall]->[Mangle]
路由标签允许您使用几乎任何防火墙条件为数据包设置网关:
Mikrotik RouterOS 中静态路由的基础知识

实际上,因为不是所有的都有意义,有些可能工作不稳定。

Mikrotik RouterOS 中静态路由的基础知识

有两种标记包裹的方法:

  • 马上放 路由标记
  • 先放 连接标记,然后基于 连接标记 设置 路由标记

在一篇关于防火墙的文章中,我写道第二个选项更可取。 在标记路线的情况下减少 cpu 的负载 - 这并不完全正确。 这些标记方法并不总是等价的,通常用于解决各种问题。

使用的例子

让我们继续使用 Policy Base Routing 的示例,它们更容易说明为什么需要所有这些。

MultiWAN 和返回传出(输出)流量
MultiWAN 配置的一个常见问题:Mikrotik 只能通过“活跃”提供商从 Internet 获得。
Mikrotik RouterOS 中静态路由的基础知识

路由器不关心请求来自哪个 ip,当生成响应时,它会在路由表中查找通过 isp1 的路由处于活动状态的路由。 此外,这样的数据包很可能会在到达接收者的途中被过滤掉。

另一个有趣的观点。 如果在 ether1 接口上配置了“简单”源 nat: /ip fi nat add out-interface=ether1 action=masquerade 该包将与 src 一起上线。 地址=10.10.10.100,这让事情变得更糟。

有多种方法可以解决此问题,但其中任何一种都需要额外的路由表:
Mikrotik RouterOS 中静态路由的基础知识

/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 的数据包的路由表。
Mikrotik RouterOS 中静态路由的基础知识

/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
  • Routing Decision(2) 步骤检查 [IP]->[Routes]->[Rules] 并将数据包发送到路由表 通过ISP2
  • 根据路由表,数据包必须通过ether10.20.20.1接口发送到网关2

Mikrotik RouterOS 中静态路由的基础知识

与使用 Mangle 表不同,此方法不需要工作连接跟踪器。

使用 [IP]->[Firewall]->[Mangle]
连接以传入数据包开始,因此我们将其标记为 (action=mark-connection),对于来自标记连接的传出数据包,设置路由标签(action=mark-routing).
Mikrotik RouterOS 中静态路由的基础知识

/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] 这表示将来自连接的所有数据包标记为 来自-isp2
  • 系统生成带有 Src 的响应数据包。 地址:10.20.20.200
  • 在 Routing Decision(2) 阶段,根据路由表,数据包通过 ether10.20.20.1 接口发送到网关 1。 您可以通过登录包来验证这一点 [OUTPUT|Filter]
  • 在舞台上 [OUTPUT|Mangle] 已检查连接标签 来自-isp2 数据包收到路由标签 通过ISP2
  • 路由调整 (3) 步骤检查路由标签是否存在并将其发送到适当的路由表
  • 根据路由表,数据包必须通过ether10.20.20.1接口发送到网关2

Mikrotik RouterOS 中静态路由的基础知识

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 选项,只是会使用其他链:
Mikrotik RouterOS 中静态路由的基础知识

/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

Mikrotik RouterOS 中静态路由的基础知识
该图没有显示 NAT,但我认为一切都很清楚。

MultiWAN 和出站连接

您可以使用 PBR 功能从不同的路由器接口创建多个 vpn(示例中的 SSTP)连接。

Mikrotik RouterOS 中静态路由的基础知识

附加路由表:

/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 的接口。 地址:

/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

解析:

  • Router 创建三个 SSTP 进程
  • 在Routing Decision(2)阶段,根据主路由表为这些进程选择一条路由。 从同一路由,数据包收到 Src。 绑定到 ether1 接口的地址
  • В [Output|Mangle] 来自不同连接的数据包接收不同的标签
  • 报文在Routing Adjusment阶段进入标签对应的表,收到一条新的发送报文的路由
  • 但是包仍然有 Src。 来自 ether1 的地址,在舞台上 [Nat|Srcnat] 地址根据接口替换

有趣的是,在路由器上你会看到下面的连接表:
Mikrotik RouterOS 中静态路由的基础知识

连接跟踪器可以更早地工作 [Mangle] и [Srcnat],所以所有连接都来自同一个地址,如果你看得更详细,那么在 Replay Dst. Address NAT之后会有地址:
Mikrotik RouterOS 中静态路由的基础知识

在 VPN 服务器上(我在测试台上有一个),你可以看到所有连接都来自正确的地址:
Mikrotik RouterOS 中静态路由的基础知识

挡路
有一种更简单的方法,您可以简单地为每个地址指定一个特定的网关:

/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]
Mikrotik RouterOS 中静态路由的基础知识

/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,那么当其中一个通道被禁用时,流量将转到主表并通过工作通道。 这是否必要取决于任务。

使用中的标记 [IP]->[Firewall]->[Mangle]
一个带有 IP 地址列表的简单示例。 原则上,几乎可以使用任何条件。 layer7 的唯一警告是,即使与连接标签配对时,看起来一切正常,但部分流量仍会走错路。
Mikrotik RouterOS 中静态路由的基础知识

/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] 没有这样的例外,但流量到达本地进程。 事实是进入标记为 [PREROUTING|Mangle] 具有路由标签并进入除 main 之外的路由表,其中没有本地接口。 在路由规则的情况下,首先检查数据包是否用于本地进程,并且仅在用户 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 Classifier - 是一个更灵活的 ECMP 类比。 与 ECMP 不同,它更严格地按连接数划分流量(ECMP 对连接数一无所知,但与 Routing Cache 配对时,会获得类似的东西)。

PCC需要 指定字段 从 ip 头,将它们转换为 32 位值,并除以 分母. 除法的其余部分与指定的进行比较 如果它们匹配,则应用指定的操作。 详情. 听起来很疯狂,但它确实有效。
Mikrotik RouterOS 中静态路由的基础知识

具有三个地址的示例:

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 动态分配流量的示例:
Mikrotik RouterOS 中静态路由的基础知识

#Таблица маршрутизации
/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 来自 Internet 的响应流量将根据路由表返回到提供商。

切换沟通渠道

检查ping是一个很好的工具,但是它只检查与最近的IP对等点的连接,提供商网络通常由大量路由器组成,并且在最近的对等点之外可能会发生连接中断,然后还有骨干电信运营商也可能有问题,一般检查 ping 并不总是显示有关访问全球网络的最新信息。
如果提供商和大公司有 BGP 动态路由协议,那么家庭和办公室用户就必须自己弄清楚如何通过特定的通信通道检查 Internet 访问。

通常,使用脚本通过特定的通信渠道检查 Internet 上 ip 地址的可用性,同时选择可靠的地址,例如 google dns: 8.8.8.8。 8.8.4.4。 但是在 Mikrotik 社区中,已经为此改编了一个更有趣的工具。

关于递归路由的几句话
递归路由在构建多跳 BGP 对等互连时是必要的,并且进入有关静态路由基础知识的文章只是因为狡猾的 MikroTik 用户想出了如何使用递归路由与检查网关配对来切换通信通道而无需额外的脚本。

现在是时候了解一般术语的范围/目标范围选项以及路由如何绑定到接口:
Mikrotik RouterOS 中静态路由的基础知识

  1. 路由根据其范围值和主表中所有小于或等于目标范围值的条目查找发送数据包的接口
  2. 从找到的接口中,选择可以将数据包发送到指定网关的接口
  3. 选择找到的已连接条目的接口将数据包发送到网关

在存在递归路径的情况下,一切都发生相同,但分为两个阶段:
Mikrotik RouterOS 中静态路由的基础知识

  • 1-3 在已连接的路由中增加一条路由,通过该路由可以到达指定的网关
  • 4-6 为“中间”网关寻找路由连接路由

递归搜索的所有操作都发生在 RIB 中,只有最终结果被传输到 FIB: 0.0.0.0/0 via 10.10.10.1 on ether1.

使用递归路由切换路由的例子
Mikrotik RouterOS 中静态路由的基础知识

配置:
Mikrotik RouterOS 中静态路由的基础知识

/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:
Mikrotik RouterOS 中静态路由的基础知识

检查网关对递归路由一无所知,只是将 ping 发送到 8.8.8.8,它(基于主表)可通过网关 10.10.10.1 访问。

如果 10.10.10.1 和 8.8.8.8 之间的通信丢失,则路由断开,但到 8.8.8.8 的数据包(包括测试 ping)继续通过 10.10.10.1:
Mikrotik RouterOS 中静态路由的基础知识

如果到 ether1 的链接丢失,那么当 8.8.8.8 之前的数据包通过第二个提供商时,会出现不愉快的情况:
Mikrotik RouterOS 中静态路由的基础知识

如果您在 8.8.8.8 不可用时使用 NetWatch 运行脚本,则会出现问题。 如果链接断开,NetWatch 将简单地通过备份通信通道工作并假设一切正常。 通过添加额外的过滤路由解决:

/ip route
add dst-address=8.8.8.8 gateway=10.20.20.1 distance=100 type=blackhole

Mikrotik RouterOS 中静态路由的基础知识

哈布雷上有 文章,其中更详细地考虑了 NetWatch 的情况。

是的,当使用这样的保留时,地址 8.8.8.8 将被硬连线到其中一个提供商,因此选择它作为 dns 源不是一个好主意。

关于虚拟路由和转发 (VRF) 的几句话

VRF 技术旨在在一个物理路由器中创建多个虚拟路由器,该技术被电信运营商广泛使用(通常与 MPLS 结合使用)为具有重叠子网地址的客户端提供 L3VPN 服务:
Mikrotik RouterOS 中静态路由的基础知识

但是 Mikrotik 中的 VRF 是根据路由表组织的,有很多缺点,例如,路由器的本地 ip 地址可从所有 VRF 获得,您可以阅读更多 链接.

vrf配置示例:
Mikrotik RouterOS 中静态路由的基础知识

/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 不转到 Internet:
Mikrotik RouterOS 中静态路由的基础知识

上网需要额外注册一条访问主表的路由(用vrf术语,这叫route leaking):
Mikrotik RouterOS 中静态路由的基础知识

/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

这里有两种路由泄漏的方式:利用路由表: 172.17.0.1@main 并使用接口名称: 172.17.0.1%wlan1.

并为返回流量设置标记 [PREROUTING|Mangle]:
Mikrotik RouterOS 中静态路由的基础知识

/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 

Mikrotik RouterOS 中静态路由的基础知识

具有相同地址的子网
使用 VRF 和 netmap 在同一路由器上组织对具有相同寻址的子网的访问:
Mikrotik RouterOS 中静态路由的基础知识

基本配置:

/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

防火墙规则:

#Маркируем пакеты для отправки в правильную таблицу маршрутизации
/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 接收的路由添加到给定的路由表
如果您需要将动态路由(例如,来自 dhcp 客户端)自动添加到特定路由表,则 VRF 可能会很有趣。

为vrf添加接口:

/ip route vrf
add interface=ether1 routing-mark=over-isp1

通过表发送流量(传出和传输)的规则 通过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

仅需要此路由,以便本地传出数据包可以在之前通过路由决策(2) [OUTPUT|Mangle] 并获取路由标签,如果主表中0.0.0.0/0之前路由器上还有其他活动路由,则不需要。
Mikrotik RouterOS 中静态路由的基础知识

链条 connected-in и dynamic-in в [Routing] -> [Filters]

路由过滤(入站和出站)是一个通常与动态路由协议结合使用的工具(因此仅在安装包后可用 路由), 但传入过滤器中有两个有趣的链:

  • connected-in — 过滤连接的路由
  • dynamic-in - 过滤 PPP 和 DCHP 收到的动态路由

过滤不仅可以让你丢弃路由,还可以改变一些选项:distance, routing-mark, comment, scope, target scope, ...

这是一个非常精确的工具,如果你可以在没有路由过滤器(但不是脚本)的情况下做一些事情,那么就不要使用路由过滤器,不要让你自己和那些在你之后配置路由器的人混淆。 在动态路由的上下文中,路由过滤器将被更频繁、更高效地使用。

为动态路由设置路由标记
家用路由器的示例。 我配置了两个 VPN 连接,其中的流量应根据路由表进行包装。 同时,我希望在激活接口时自动创建路由:

#При создании vpn подключений указываем создание default route и задаем дистанцию
/interface pptp-client
add connect-to=X.X.X.X add-default-route=yes default-route-distance=101 ...
add connect-to=Y.Y.Y.Y  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

我不知道为什么,可能是一个错误,但是如果你为 ppp 接口创建一个 vrf,那么到 0.0.0.0/0 的路由仍然会进入主表。 否则,一切都会更容易。

禁用连接的路由
有时这是必需的:

/route filter
add chain=connected-in prefix=192.168.100.0/24 action=reject

调试工具

RouterOS 提供了许多用于调试路由的工具:

  • [Tool]->[Tourch] - 允许您查看接口上的数据包
  • /ip route check - 允许您查看数据包将发送到哪个网关,不适用于路由表
  • /ping routing-table=<name> и /tool traceroute routing-table=<name> - 使用指定的路由表进行 ping 和跟踪
  • action=log в [IP]->[Firewall] - 一个优秀的工具,允许您沿着数据包流跟踪数据包的路径,此操作在所有链和表中都可用

来源: habr.com

添加评论