关于使用递归路由的最常见问题是:“如果主要提供商通过dhcp为我们分配IP地址,并且默认网关经常更改,该怎么办?”
警告! 本文中的材料和方案都简化为原始的,以给出解决问题方法的总体思路。 没有特别深化。
递归路由有什么用? 监视
提供商网关后面的 Internet可用性。 毕竟,提供商的路由器经常会对回声请求做出完美的响应,但是由于某种原因,提供商的指向全球网络的[up]链接却消失了。
递归路由使您可以评估通过选定提供商的Internet访问的可用性并决定流量的路由。
但是,事实是,使用递归路由假定
存在直接明确指示
的网关IP地址的指示
,该网关在创建的路由的参数中
钉了钉子 。 将广播接口的名称指定为网关是不正确的,并且在许多情况下根本不起作用,因为 需要提供者的代理服务器。 但是,代替提供者,proxy-arp可以打开有关提供者交换机的邻居,并尝试通过安排经典的MITM来以此方式拦截您的流量!
递归路由的魔力隐藏在参数
“ scope”和“ target-scope”的后面。 为了使路由能够递归工作,其“目标范围”必须大于或等于其递归引用的静态路由的“范围”值,并且路由中指定的网关无法通过接口之一直接到达。
考虑最简单的活动/备份方案。 我们的路由器执行NAT,并通过Ether1-isp1和Ether2-isp2接口连接到两个提供商。 主要提供商(ISP-1)使用DHCP协议向其客户端分发IP地址,而没有其他任何操作。 第二个提供商为我们提供了一个静态IP地址,但速度要慢得多。
当无法通过主要提供商访问Internet时,应切换到备份(ISP-2)。

这种方案的提供者的亮点是不仅定期更改客户端的IP地址,而且更改默认网关。
在6.39版之前,我不得不看到
sheduler ,
netwatch和类似机制的各种组合中非常复杂的拐杖。
从版本6.39开始,RouterOS开发人员会见了这些用户,并创建了在设备上触发dhcp客户端时调用特殊
脚本的功能。
实际上,该解决方案包括两个部分:
- 需要从提供者IP地址和网关地址获取dhcp协议以用于递归路由
- 如果可能,请从自动使用中排除从提供商收到的网关地址。
因此,让我们从头开始。
我们将创建一条通过ISP-2的备份路由,其距离值将大于将来的主路由。 在此示例中,我使用了“距离= 2”:
通过ISP-2备份/ip route add dst-address=0.0.0.0/0 gateway=192.0.2.1 distance=2
此外,为了接收来自ISP-1提供者的默认路由,而不是直接使用它,有一个特殊值“ distance = 255”。 具有该距离值的路由将进入系统路由表,
但永远不会变为活动状态 。
代号/ip dhcp-client add comment="ISP-1 dhcp" default-route-distance=255 dhcp-options=hostname,clientid interface=Ether1-isp1
仅在读取提供程序发送的参数并通过脚本在递归路由的设置中实现它们时,才需要这样的路由。
根据收到的参数,我们对变量$ gateway-address最感兴趣。 顾名思义,它包含提供商网络中默认网关的地址。 我们将使用它来更新递归路由。
递归路由本身必须从脚本中正确识别。 为此,在创建它们的阶段,我们将指示一个唯一的“注释”,该注释将用于在表中查找它们。 用于创建递归路由对的代码:
创建一条路线/ip route add dst-address=8.8.4.4 gateway=127.0.0.1 scope=30 target-scope=30 comment=" isp1route " disabled=yes
/ip route add dst-address=0.0.0.0/0 gateway=8.8.4.4 check-gateway=ping
只有在提供商通过dhcp发出参数之后,第一行才应该(并且将要!)指向提供商网络中的真实网关,并且将使用dhcp-client脚本对其进行处理:
简化脚本/ip route set [find comment=" isp1route "] gateway=($"gateway-address") disabled=no
更高级的选择:if ($bound=1) do={ /ip route set [find comment=" isp1route "] gateway=($"gateway-address")disabled=no; :log warning ("New ISP1 gateway: ".($"gateway-address")) }
现在,从ISP-1提供程序接收到IP地址作为默认网关后,它将被包含在路由对中,
而不是127.0.0.1。第二行指出了通往0.0.0.0/0的路线,实际上执行了所有操作。 将精确地通过ISP-1网络检查在那里指定为网关的8.8.4.4节点的响应,并带有“ check-gateway = ping”选项。 如果节点8.8.4.4在20秒内未两次响应回显请求,则路由器将认为通过此路由(ISP-1)到Internet的连接不可用。 在这种情况下,新的连接将通过ISP-2备份提供程序进行路由。
如果一切都正确完成,则在直至8.8.4.4的路由附近的winbox / ip->路由窗口中,将显示“ resursive via ...”。 这意味着路由的构建完全是递归的。
最后,仅作为示例-窗口屏幕winbox:
