当前位置: 首页 > news >正文

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景

在实际的组网中,可能会遇到这样一个场景:在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备,使用 EIGRP 协议将网络的路由打通。但是后来网络扩容,增加了一批华为的设备,而华为的设备是不支持 EIGRP 的,因此可能就在扩容的网络中跑一个 OSPF,但是这两部分网络依然是需要路由互通的,这就面临一个问题。因为这毕竟是两个不同的路由协议域,在两个域的边界,路由信息是相互独立和隔离的。那么如何将全网的路由打通呢?这就需要用到路由重发布(Route Redistribution,又被称为路由重分发)。
在这里插入图片描述

看上图,R1 与 R2 之间运行 RIP 来交互路由信息,R2 通过 RIP 学习到了 R1 发布过来的 192.168.1.0/24 及 2.0/24 的 RIP 路由,装载进路由表并标记为 R(RIP)。同时 R2 与 R3 又运行 OSPF,建立起 OSPF 邻接关系,R2 也从 R3、通过 OSPF 学习到了两条路由:192.168.3.0 及 192.168.4.0/24,也装载进了路由表,标记为 O(OSPF 区域内部路由)。

那么这样一来,对于 R2 而言,它自己就有了去往全网的路由,但是在 R2 内部,可以这么形象的理解:它不会将从 RIP 学习过来的路由,“变成” OSPF 路由告诉给 R3,也不会将从 OSPF 学习来的路由,变成 RIP 路由告诉给 R1。对于 R2 而言,虽然它自己的路由表里有完整的路由信息,但是,就 R 和 O 的条目之间有道鸿沟,无法逾越。而 R2 就也就成了 RIP 及 OSPF 域的分界点,称之为 ASBR(AS Boundary Routers,AS 边界路由器)。

那么如何能够让 R1 学习到 OSPF 域中的路由,让 R3 学习到 RIP 域中的路由呢?关键点在于 R2 上,通过在 R2 上部署路由重发布,可以实现路由信息在不同路由选择域间的传递。

在这里插入图片描述

上图是初始状态。R2 同时运行两个路由协议进程:RIP 及 OSPF。它通过 RIP 进程学习到 RIP 路由,又通过 OSPF 进程学习到 OSPF 域内的路由,但是这两个路由协议进程是完全独立的,其路由信息是相互隔离的。

在这里插入图片描述

现在开始在 R2 上执行重发布的动作,将 OSPF 的路由 “注入” 到了 RIP 路由协议进程之中,如此一来 R2 就会将 192.168.3.0/24 及 192.168.4.0/24 这两条 OSPF 路由 “翻译” 成 RIP 路由,然后通过 RIP 通告给 R1。R1 也就能够学习到 192.168.3.0/24 及 192.168.4.0/24 路由了。

注意重发布的执行点,是在 R2 上,也就是在路由域的分界点(ASBR)上执行的,另外,路由重发布是有方向的,例如刚才执行完相关动作后,OSPF 路由被注入到了 RIP,但是 R3 还是没有 RIP 域的路由,需要进一步在 R2 上将 RIP 路由重发布进 OSPF,才能让 R3 学习到 192.168.1.0/24 及 192.168.2.0/24 路由。

路由重发布是一种非常重要的技术,在实际的项目中时常能够见到。由于网络规模比较大,为了使得整体路由的设计层次化,并且适应不同业务逻辑的路由需求,会在整个网络中设计多个路由协议域,而为了实现路由的全网互通,就需要在特定设备上部署路由重发布。另外在执行路由重发布的过程中,又可以搭配工具来部署路由策略,或者执行路由汇总,如此一来路由重发布带来一个对路由极富弹性和想象力的操作手柄。

二、实施要点

2.1 管理距离问题

在这里插入图片描述

如上图所示,R5 将 192.168.1.0 宣告进了 RIP,R3 及 R4 都能够学习到这条路由,并且装载进自己的路由表。为了让 OSPF 域能够学习到 RIP 域内的路由,在 R3 及 R4 上都部署 RIP 到 OSPF 的重发布。理想中的情况是,OSPF 域内的路由器能同时从 R3 及 R4 学习到注入进来的路由。但是情况却没有那么如人意。

假设在 R3 上先完成的重发布配置,192.168.1.0 这条路由将被 R3 注入到 OSPF 中,并被更新给 R1,再由 R2 更新给 R4,此刻,R4 同时从 OSPF 及 RIP 都学习到了这条路由,它会作何优选?当然是优选 OSPF 的,因为 AD 小,所以它的路由表里,关于 192.168.1.0 的路由是 OSPF 的下一跳 R2。这样一来,对于 R4 而言,它去往 192.168.1.0 网络,就存在次优路径,也就是说,绕远路了,走的是 R2-R1-R3-R5 这条路径。

并且由于 R4 路由表里没了关于 192.168.1.0 的 RIP 路由,自然 RIP 向 OSPF 的重发布就失败了。因为,只有当路由存在于路由表中时,才能够将该路由注入到其他路由协议中

以上就是双点路由重发布的模型中,最容易出现的一个问题:次优路径问题,根本原因还是出在管理距离上。

几种常见的路由协议其 AD 值列举如下:

在这里插入图片描述

解决次优路径的方法有不少,例如可以在 R4 上,将 OSPF 外部路由的管理距离从缺省的 110 修改为 130,比 RIP 的管理距离 120 更大,这样一来,关于 192.168.1.0 的路由,R4 一方面是从 R2 学习到,类型为 OSPF 外部路由,另一方面又从 RIP 学习到,而此时在 R4 上 OSPF 外部路由的管理距离被修改为 130 比 RIP 要大,因此 R4 优选来自 RIP 的 192.168.1.0 路由,并将 RIP 路由装载到路由表,次优路径问题即可解决,而且一旦 192.168.1.0 的 RIP 路由出现在路由表后,R4 的 RIP 到 OSPF 重发布就能够成功。

2.2 路由 feedback

在这里插入图片描述

路由的 feedback(倒灌)是一个在部署路由重发布时需要非常注意的一个现象。如上图所示,R5 将 192.168.1.0 宣告进了 RIP,R3 及 R4 都能够学习到这条路由,并且装载进自己的路由表。如果在 R3 就 R4 上部署 RIP 到 OSPF 的双向重发布,会发生什么事情呢?

假设在 R3 上先完成的配置,192.168.1.0 这条路由将被 R3 注入到 OSPF 中,并被更新给 R1,再由 R2 更新给 R4,到此 R4 就出现次优路径了,这个上面已经介绍过了,并且由于 R4 路由表里没了关于 192.168.1.0 的 RIP 路由,自然 RIP 向 OSPF 的重发布就失败了,更糟糕的是,由于在 R3 及 R4 上部署的是双向重发布,也就是 RIP 向 OSPF 及 OSPF 向 RIP 都做了重发布,这就导致 R4 上关于 192.168.1.0 的 OSPF 路由被倒灌回 RIP,这就是路由 Feedback,路由被灌回来了:

在这里插入图片描述

这是有极大隐患的,非常容易引发路由环路问题。

在上面这个场景中,在 R3 及 R4 两个点上,部署了 RIP 到 OSPF、OSPF 到 RIP 的双向路由重发布,这种组网被称之为:“双点双向路由重发布”。双点双向重发布的模型在不少组网中被应用,这里头蕴含了许多细节和许多技巧,而且稍微操作不当,就容易引发次优路径或路由环路的问题。

2.3 Metric 问题

在这里插入图片描述

要知道,每一种路由协议,对路由 Metric(度量值)的定义是不同的,OSPF 是用 cost(开销)来衡量一条路由的优劣,RIP 是用跳数,EIGRP 是用混合的各种元素,那么当将一些路由,从某一中路由协议重发布到另一种路由协议中,这些路由的 metric 会作何变化呢?

方式一是,你可以在执行重发布的动作的时候,手工指定重发布后的 Metric 值,具体改成什么值,要看实际的环境需求。

方式二是,采用缺省的动作,也就是在路由协议之间重发布时使用的种子度量值。所谓种子度量值,指的是当将一条路由从外部路由选择协议重发布到本路由选择协议中时,所使用的缺省 Metric 值

看下表(下表是 Cisco IOS 平台上的种子度量值,可在路由协议进程中使用 default-metric 修改,有可能的一个情况是,不同网络设备厂商,种子度量值有所不同):
在这里插入图片描述

注意,以上是从其他动态路由协议重发布进该路由协议时的默认 metric。而如果是重发布本地直连路由或静态路由到该路由协议,情况就不是这样,例如重发布直连或静态到如下路由协议时:

- EIGRP 请见红茶三杯 EIGRP 笔记(访问 ccietea.com)【访问异常】20240717

- RIP 重发布直连如果没有设置 metric,则默认 1 跳传给邻居(邻居直接使用这个 1 跳作为 metric);重发布静态路由默认 metric=1,使用 default-metric 可以修改这个默认值,这条命令对重发布直连接口的 metric 无影响。

- OSPF 重发布直连接口默认 cost=20;重发布静态路由默认 cost=20;使用 default-metric 可以修改重发布静态路由以及其他路由协议的路由进 OSPF 后的默认 cost,这条命令对重发布直连接口无效。

三、 配置实现

3.1 配置命令

路由重发布是有方向的,将路由从 A 路由协议注入到 B 路由协议中,要在 B 路由协议的进程中进行配置,例如,要将其他路由协议重发布到 RIP,那么配置如下(重发布到其他路由协议大同小异):

Router (config)#router rip
Router (config-router)#redistribute ?
bgp   Border Gateway Protocol (BGP)
connected Connected
eigrp   Enhanced Interior Gateway Routing Protocol (EIGRP)
isis    ISO IS-IS
iso-igrp  IGRP for OSI networks
metric  Metric for redistributed routes
mobile  Mobile routes
odr   On Demand stub Routes
ospf   Open Shortest Path First (OSPF)
rip    Routing Information Protocol (RIP)
route-map  Route map reference
static    Static routes

3.2 配置示例

1. OSPF 与 RIP 的重发布

在这里插入图片描述

R1 与 R2 运行 RIPv2;R2 与 R3 建立 OSPF 邻接关系。初始化情况下 R2 的路由表中有四个条目,如上图所示,而 R1 的路由表中,只有 2 个条目,也就是两个直连链路。现在在 R2 上做重发布动作,将 OSPF 路由重发布到 RIP,配置如下:

R2 (config)# router rip
R2 (config-router)# redistribute ospf 1 metric 3

上面的命令中 ospf 1 也就是指的进程 1。是 R2 用于和 R3 形成邻接关系的 OSPF 进程号。而 metric 3 则是将 OSPF 路由注入到 RIP 所形成的 RIP 路由的 metric 值。

如此一来,R2 的路由表中 OSPF 路由 3.3.3.0/24,以及激活 OSPF 的直连接口所在网段 192.168.23.0/24,都被注入到 RIP,而 R1 通过 RIP 就能够学习到这两条路由,如下图示红色粗体部分。
在这里插入图片描述

当然,这个时候 1.1.1.0 是无法访问 3.3.3.0 的,因为 R3 并没有 RIP 路由选择域中的路由(也就是说回程路由有问题,数据通信永远要考虑来回路径),所以如果要实现全网互通,那么需在 R2 上,将 RIP 路由注入到 OSPF:

R2 (config)#router ospf 1
R2 (config-router)#redistribute rip subnets

在这里插入图片描述

如此一来,就实现了全网互通。注意,当重发布路由到 OSPF 时,redistribute rip subnets,subnets 关键字要加上,否则只有主类路由会被注入到 OSPF 中,如果不加关键字 subnets,则本例中的子网路由 1.1.1.0/24 就无法被顺利的注入到 OSPF。因此在配置其他路由协议到 OSPF 的重发布时,这个关键字一般都是要加上的

2. OSPF 与 EIGRP 的重发布

在这里插入图片描述

初始情况同上一个实验,接下去先看看将 OSPF 路由重发布进 EIGRP AS 100,配置当然还是在 R2 上进行,进入 R2 的 EIGRP 路由进程:

R2 (config)# router eigrp 100
R2 (config-router)# redistribute ospf 1 metric 100000 100 255 1 1500

注意,EIGRP 的 metric 是混合型的,metric 100000 100 255 1 1500 这里指定的参数,从左至右依次是带宽、延迟、负载、可靠性、MTU。可根据实际需要灵活的进行设定。上述配置完成后,R2 就会将路由表中 OSPF 的路由:包括 3.3.3.0,以及宣告进 OSPF 的直连网段 192.168.23.0/24 注入到 EIGRP 进程。这样 R1 就能够学习到这两条外部路由。

接下去是 EIGRP 到 OSPF 的重发布:

R2 (config)# router ospf 1
R2 (config-router)# redistribute eigrp 100 subnets

3. 重发布直连路由

在这里插入图片描述

在上图中,R1 的 Fa1/0 口并没有在 OSPF 进程中使用 network 命令激活 OSPF。也就是说 R2 及 R3 是无法通过 OSPF 学习这个接口的直连路由。对于目前的整个 OSPF 域而言,1.1.1.0/24 这条 R1 的直连路由就是域外路由,整个域内并不知晓。

现在可以在 R1 上部署重发布,将 R1 的直连路由注入到 OSPF 域中,形成 OSPF 外部路由,然后通告给域内的其他路由器。在这里要注意区分使用 network 命令激活接口,与使用重发布直连将接口路由注入 OSPF 的区别。

当在 R1 上使用 OSPF 的 network 命令将 Fa1/0 接口激活 OSPF 时,实际上是触发了两个事情,一是这个接口会激活 OSPF 于是开始尝试发送组播的 Hello 消息去发现链路上的其他 OSPF 路由器,二是这个接口会参与 OSPF 计算和操作,R1 会将描述这个接口的相关信息通过 OSPF 扩散给其他的路由器,以便他们能够学习到 1.1.1.0/24 的路由,而且这些路由是 OSPF 内部路由。

而当在 R1 上不用 network 命令去激活 Fa1/0 口,而是直接用 redistribute connected subnets 命令将直连路由注入到 OSPF,情况就不一样了。一是这个接口的直连路由会被以外部路由的形式注入到 OSPF 中,这将联动地产生许多细节上的不同;另外,这个接口并不激活 OSPF,也就是说接口不会收发 HELLO 包。另一个有意思的地方是,redistribute connected subnets 一旦在 R1 上被部署,则 R1 上所有未被 OSPF network 命令激活 OSPF 的接口的直连路由都会被注入到 OSPF 中
在这里插入图片描述

R2 (config)# router ospf 1
R2 (config-router)# redistribute connected subnets

上面这条命令就是将本地所有直连路由(除了已经被 network 宣告的路由)注入到 OSPF 中。所有的动态路由协议都支持将直连路由重发布进路由域,命令都是类似的:redistribute connected。

4. 重发布静态路由

在这里插入图片描述

在上图所示的场景中,R2 与 R3 建立 OSPF 邻接关系,而 R1 可能由于不支持 OSPF 或者其他原因,没有运行 OSPF。为了让 R2 能够访问 1.1.1.0/24 网络,给 R2 配置了一条静态路由:

R2 (config)# ip route 1.1.1.0 255.255.255.0 192.168.12.1

这样 R2 确实是能够访问 1.1.1.0/24 网络了,但是 R3,以及整个 OSPF 域内的其他路由器依然是无法访问的,总不能给所有的 OSPF 路由器们都配置一条静态路由去往 1.1.1.0/24 吧。

解决的办法很简单,就是在 R2 上部署静态路由重发布。命令如下:

R2 (config)# router ospf 1R2 (config-router)# redistribute static subnets

上面这条命令的结果是,R2 的路由表中,所有的静态路由都会被注入到 OSPF 中形成 OSPF 外部路由,并且通过 OSPF 动态地传递到整个 OSPF 域。

3.3 重发布的几个小问题

1. 关联出接口的静态路由 在被 network 时的问题

在这里插入图片描述

R2、R3 跑 RIP,在 R2 上配置静态路由(使用关联出接口的方式进行配置):

R2 (config)# ip route 1.1.1.0 255.255.255.0 serial 0/0

在 R2 上查看路由表,会发现刚才配置的这条路由在路由表中的显示很诡异,“directly connected” 的意思是,路由器将 1.1.1.0/24 网络视为本地的直连网络,这是因为它认为,1.1.1.0/24 这个网络就在家门口 “Serial0/0“。

R2#show ip route
S  1.1.1.0 is directly connected, Serial0/0

接下去,R2 在 RIP 进程中增加如下配置:

R2 (config)# router rip
R2 (config-router)# version 2
R2 (config-router)# no auto-summary
R2 (config-router)# network 192.168.23.0
R2 (config-router)# network 1.0.0.0

则 R2 会将路由 1.1.1.0/24 宣告进 RIP 并将路由通告给 R3。对于 IGP 而言,无论是 RIP、EIGRP 还是 OSPF,要想使用关键字 network 来通告某条路由,这条路由都必须是本地直连的,但是这里是个特例,正是因为采用出接口的方式配置的静态路由,被认为是本地直连,所以才能够使用 network 命令通告。当然,如果将上面的静态路由修改为采用下一跳 IP 地址的方式配置,例如 ip route 1.1.1.0 255.255.255.0 192.168.12.1,那就不行了。

如果环境中,R2 及 R3 换成 EIGRP,则现象与 RIP 一样,R2 会将 1.1.1.0 宣告进 EIGRP
如果换成 OSPF,则无效,即关联出接口的静态路由,在 OSPF 中 network 该路由的网络号时,并不会被宣告进 OSPF。

2. 关联出接口的静态路由 在重发布时的问题

在这里插入图片描述

R2、R3 跑 RIP,在 R2 上配置静态路由(使用关联出接口的方式进行配置):

R2 (config)# ip route 1.1.1.0 255.255.255.0 serial 0/0

此时在 R2 上:

R2 (config)# router ripR2 (config-router)# redistribute connected

结果是 R3 无法学习到 1.1.1.0/24 的路由,换成 EIGRP、OSPF,现象也一样,R2 不会将 1.1.1.0/24 这条路由注入到动态路由协议中。

3. 只有在路由表中存在的路由才能够被重发布

在这里插入图片描述

在 R2 上进行双向重发布,也就是配置 RIP 到 OSPF,以及 OSPF 到 RIP 的重发布。则正常情况下 R1 能够学习到 3.3.3.0/24 路由、R3 能学到 1.1.1.0/24 路由。

如果在 R2 上增加一条静态路由的配置:ip route 1.1.1.0 255.255.255.0 null0,这个时候 R2 路由表中原有的 RIP 的 1.1.1.0 路由因为管理距离的原因,会被静态路由 1.1.1.0/24 覆盖掉,也就是说 R2 的路由表中,关于 1.1.1.0/24 路由现在是 Static 的了。

因此 R2 在将 RIP 重发布到 OSPF 时,路由 1.1.1.0/24 重发布不成功(在路由表中并没有 RIP 路由 1.1.1.0/24),所以 R3 无法学习到 1.1.1.0/24 的路由;

同样,如果 R2 增加配置:ip route 3.3.3.3 255.255.255.0 null0 也是一样的道理。

重发布是看路由表的,例如将 OSPF 重发布到 EIGRP,那么首先目标路由必须得在路由表里有,而且必须是 OSPF 的路由,才能够被注入到 EIGRP。

另外,这里有个小注意事项,回到上面这个图,R2 上部署 RIP 到 OSPF 的重发布,注意 R2 左边这个接口(与 R1 对接的接口)的直连路由也会自动重发布到了 OSPF 中,这是因为该接口是直连并且已经通过 network 的方式通告进了 RIP,因此能够被自动重发布到 OSPF,而无需满足上文提到的条件。


注:原文所有图防盗链不能直接被 csdn 转存,全部重传。

via:

  • 路由重发布 Route Redistribution 红茶三杯新浪博客 红茶三杯 2014-09-06 10:19:34)

    https://blog.sina.com.cn/s/blog_5ec353710102v23a.html


路由协议的迁移 路由Redistribute —— cisco

<路由协议的迁移>

当网络中原有的路由协议不能再很好的满足需求的时候,就需要转换为另一种路由协议,这就需要进行路由协议的迁移。

路由迁移的原则:

1、尽可能少的减少网络的停工时间
2、一旦在迁移过程中出了问题,要能迅速回退到初始状态
3、在迁移过程中要避免出现路由黑洞和环路
在路由迁移过程中还有可能要改变原有的 IP 地址,使用新的编址方案,这就需要进行地址的迁移。
地址迁移过程:
1、配置第二地址
2、将第二地址 network 进路由协议中
3、如果第二地址路由正常,将第二地址改为第一地址

int s1/0
ip address address mask secondary  // 配置辅助地址

路由迁移过程:

1、将原有协议的 AD 值改小
2、在现在网络上配置新的路由协议
3、将原有协议的 AD 值再改大,让新协议的路由起作用
4、如果路由正常,删除原有协议

router eigrp 90
distance eigrp 150 170  // 修改路由协议的管理距离

注:OSPF 不能用 Secondary 地址建邻居。Eigrp 能用 Secondary 地址建邻居。

<路由协议的重分布>

定义:重分布是指连接到不同路由选择域的边界路由器在不同自主系统之间交换和通告路由选择信息的能力。
重分布原则:路由必须位于路由选择表中才能被重分发
在重分发时设定种子 metric
协议 Seed Metric
RIP 无限大 必须手工指定
EIGRP 无限大 也必须手工指定
OSPF 20 如果重分布进来的是 BGP 的话,Metric 是 1,这是个特例
IS-IS 0
BGP 携带原来的 Metric 值
R1 (config-router)#default-metric 1 // 使用此命令来设定种子 metric 值

重分布分两种:

1、单向重分布
2、双向重分布

1)OSPF -> RIP:

将其它路由协议重分布进 RIP,要注意加 metric 值

R1 (config)#router rip
R1 (config-router)#redistribute ospf 110 metric 1 // 优于 default-metric 命令 

也可用以下方法指定 Metric 值

R1 (config-router)#default-metric 3 // 默认 Seed Metric=infinity 无限大,修改 Seed Metric=3
R1 (config-router)#redistribute connected //(可不加 Metric,默认=1)重分布直连  (在这个 TOP 中,OSPF 自动把 13.1.1.0  重分布进 RIP)
R1 (config-router)#redistribute static  //(可不加 Metric,默认=1)重分布静态

2)RIP -> OSPF:

将其它路由协议重分布进 OSPF,要注意加 subnets 参数

R1 (config)#router ospf 110
R1 (config-router)#redistribute rip subnets // 如不加 Subnets,默认只有主类地址能被重分布
默认的 metric 值为 20,也可用以下命令指定:
R1 (config-router)#default-metric 8
R1 (config-router)#redistribute rip subnets metric 10 
R1 (config-router)#redistribute rip subnets metric 10 metric-type 1 // 改动 metric 类型
R1 (config-router)#redistribute connected subnets
R1 (config-router)#redistribute static subnets  // 还可在后面加 router-map 来过滤路由

3)ISIS -> EIGRP:

将其它路由协议重分布进 EIGRP 时也要指定 Metric 值

R1 (config)#router eigrp 90
R1 (config-router)#default-metric 1500 100 255 1 1500
R1 (config-router)#redistribute isis (level2) metric 1500  100  255  1  1500 (不加 Metric, 默认 Seed Metric=infinity)       BW  DLY  R  Lo  MTU
带宽 延迟 可靠性 负载 MTU
R2#show ip ei topology 3.3.3.0/24
R1 (config-router)#redistribute connected  // 不加 Metric 也可根据直连接口的不同计算 Metric
R1 (config-router)#redistribute static  // 不加 Metric 也可根据下一跳接口计算 Metric
・当把 ISIS 重分布进其他路由协议时,运行 ISIS 的直连接口不能重分布进去,这是 ISIS 本身的 BUG。只能通过重分布直连解决。

4)EIGRP -> ISIS:

R1 (config)#router isis
R1 (config-router)#redistribute eigrp 90 (默认 Seed Metric=0 ,默认以 L2 路由进入 ISIS)
R1 (config-router)#redistribute eigrp 90 metric 8 
R1 (config-router)#redistribute ei 90 level-1 (以 L1 的路由进入 ISIS, 不做修改的话,L1 路由器就收不到外部重分布进来的路由,因为默认是 L2)
R1 (config-router)#redistribute ei 90 level-1-2 
R3#show isis database detail/verbose

经典的重分布试验:

如果一个地址不在路由表,即使它存在于 OSPF 的 LSA 数据库中,(可能通过 distribute-list 过滤掉已节省资源)路由器也不会把它重分配到其他路由选择协议。” — 摘自 《tcpip 路由 卷一》

R1# sh ip route ospf 
3.0.0.0/24 is subnetted, 1 subnets
O    3.3.3.0 [110/65] via 13.1.1.3, 00:37:25, Serial1/1
R1#sh ip route eigrp 
4.0.0.0/24 is subnetted, 1 subnets
D    4.4.4.0 [90/156160] via 14.1.1.4, 00:39:41, FastEthernet0/0
R1#sh ip route rip
2.0.0.0/24 is subnetted, 1 subnets
R    2.2.2.0 [120/1] via 12.1.1.2, 00:00:23, Serial1/0

试验题:

在 R1 上做三次重分布,先将 OSPF 重分布进 EIGRP,然后将 EIGRP 重分布进 RIP,再将 RIP 重分布进 OSPF,完成后,看看能否实现全网互通。也就是说,3.3.3.3 和 4.4.4.4,以及 2.2.2.2 能否互相 Ping 通。
・重分布-在 Router 上,将 A 协议重分布到 B 协议中:

Router 上所有运行 A 协议的接口(除 ISIS/ODR),以及 Router 路由表中所有从 A 协议学到的路由,都会被重分布到 B 协议中。

<单点双向重分布时的汇总路由回馈问题>

实验:

1、在 R1 上将 OSPF 重分布进 EIGRP
2、在 R1 的 S1/0 接口做 EIGRP 的手动汇总,汇总出一条 172.16.0.0/16 路由。这时 R2 将只收到一条汇总路由。
3、再在 R1 上将 EIGRP 重分布进 OSPF
这时你会发现,R3 上除了正常收到 12.1.1.0 的路由之外,还多了一条汇总路由,因为在 R1 上做了汇总之后,生成了一条指向 NULL0 接口的汇总路由,这样,在把 EIGRP 重分布进 OSPF 时,把这条路由也带进去了。
<双向双出口重分布>
试验:在 R1 和 R4 上先将 OSPF 重分布进 RIP,看看网络会不会出问题,每个路由器的路由表正不正常。
再在 R1 和 R4 上将 RIP 重分布进 OSPF,看看有没有问题。
通过试验,我们总结出:
・做双点双向重分布时,把 AD 值低的路由协议重分布进 AD 值高的路由协议,没啥问题。
・当把 AD 高的协议重分布到 AD 低的协议中时,就有可能出现问题。

解决方法:

1、不好的方法 – 改所有路由的 AD

R1 (config)#router ospf 110
R1 (config-router)#distance 171 (将此协议的路由的 AD 改为 171,对本协议所有路由都有效,改动范围太大,通常不建议这样做,而且是有问题的。)

2、好的方法 – 缩小范围

R1 (config-router)#distance 171 4.4.4.4(在 OSPF 中,这是 RID) 0.0.0.0  (只将路由器 4.4.4.4 通告的 OSPF 路由 AD 改为 171)

3、最好的方法 – 进一步缩小范围

R1 (config)#access-list 2 permit 2.2.2.0
R1 (config-router)#distance 171 4.4.4.4 0.0.0.0 2 (只针对 4.4.4.4 通告的 2.2.2.0 路由将 AD 改为 171,对 4.4.4.4 通告的其它路由 AD 不变)
R1 (config-router)#distance 171  0.0.0.0 255.255.255.255 2 g

上面这条命令针对所有路由器通告的指定路由来改 AD,在这一定要注意通告路由器的概念,在 OSPF 中和 EIGRP 中通告的路由器的区别,要注意所要更改的路由是由哪一个路由器通告的。

4、还可以通过为 OSPF 设置外部路由的管理距离来解决,只要将外部路由的管理距离增大到超过重分布进来的协议的 AD 就可以了

R4 (config-router)#distance ospf external 99 inter-area 88 intra-area 77

在 EIGRP 中的修改:

R4 (config)#router eigrp 90
R4 (config-router)#distance 109 24.1.1.2  0.0.0.0 (只对 D 路由有效,对 D EX 路由无效,因为 EX 路由是边界路由器通告的)
(Next-hop)(Wildcard)
R4 (config)#access-list 2 permit 1.1.1.0
R4 (config-router)#distance 109 24.1.1.2 0.0.0.0 2 (只针对 1.1.1.0 路由将 AD 改为 109, 只对 D 路由有效)
R4 (config-router)#distance eigrp   89    169
(internal)(external)

访问列表的分类:

1、标准访问列表

只能基于源 IP 地址来进行分类
可以使用列表号:1-99、1300-1999
标准的访问列表通常要求放置在靠近目标的地方

2、扩展访问列表

可以根据源 IP 地址、目的 IP 地址、源端口号、目的端口号,协议来进行分类
可以使用列表号:100-199、2000-2699
扩展访问列表通常要求放置在靠近源的地方

3、命名的访问列表

只是将标准访问列表或扩展访问列表取个名字
优点:可以对访问列表进行增加、删除操作。

访问列表的比较规则:

1、如果一个访问列表有多行语句,通常按顺序从第一条开始比较,然后再往下一条条比较。
2、一个数据包如果与访问列表的一行匹配,则按规定进行操作,不再进行后续的比较。
3、在每个访问列表的最后一行是隐含的 deny any 语句 – 意味着如果数据包与所有行都不配的话,将被丢弃。

访问列表的配置规则:

1、你在访问列表中可以写多条比较语句,它们是按你输入的顺序来进行放置的。
2、在标准访问列表扩展访问列表中,你不能单独删除其中的一行,只能删除整个列表。
3、每个列表应当至少有一个 permit 语句,否则将拒绝所有流量。
4、访问列表可以用在接口的出方向,也可以用在入方向,但是要注意在一个接口在一个方向上只能有一个访问列表
5、访问列表可以过滤通过路由器的流量,对自已产生的流量不起作用。
6、将标准访问列表要尽可能放置在靠近目的地址的地方
7、将扩展访问列表要尽量放置在靠近源地址的地方

ACL 的运算符:

1、eq 等于
2、neq 不等于 o3、gt 大于
4、lt 小于
5、range 范围

重点:ACL 本身只是一个用来匹配的工具,它具体是过滤数据包还是路由,是由调用它的工具来决定的。

举例:

1、在路由器上,允许来自 172.16.1.0 网段的流量通过

access-list 1 permit 172.16.1.0 0.0.0.255

2、允许来自于 172.16.1.0 网段的流量去访问 192.168.1.0 网段

access-list 100 permit ip 172.16.1.0 0.0.0.255 192.168.1.0 0.0.0.255

3、拒绝来自于 172.16.1.0 网段的流量通过,允许其它任意的流量通过

access-list 1 deny 172.16.1.0 0.0.0.255
access-list 1 permit any

4、允许 172.16.1.1 telnet 192.168.1.1 的流量通过,其它拒绝

access-list 1 permit tcp host 172.16.1.1 host 192.168.1.1 eq telnet

5、抓出 172.16.1.0 的路由

access-list 1 permit 172.16.1.0 0.0.0.0

6、用一条 ACL 抓出 172.16.0.0、172.16.1.0、172.16.2.0、172.16.3.0 四个子网

access-list 1 permit 172.16.0.0 0.0.3.0

7、用一条语句抓出 172.16.0.0—172.16.255.0/24 之间所有子网号为奇数的路由

access-list 1 permit 172.16.1.0 0.0.254.0

8、用一条语句抓出前两个字节为 172.16.0.0、掩码为 255.255.255.0 的所有路由

access-list 100 permit ip 172.16.0.0 0.0.255.255 host 255.255.255.0

注意: 用 ACL 抓掩码,只能用在 route-map 中,在分布列表中无效

9、阻止外部发起的 TCP 会话,但允许内部发起的连接到外部的 TCP 会话。

access-list 100 permit tcp any any established

established – 允许 ACK/RST=1 的 TCP 报文通过,通常用于只允许内部的主机向外部发起 TCP 连接,不允许外部的主机向本网发起 TCP 连接

时间访问列表:

使用基于时间的访问列表,可以根据一天中的不同时间,或者一周中的某天,或者两者结合,来控制对网络资源的访问。
第一步:定义时间段名字

R1 (config)#time-range NP   定义一个名字

第二步:定义时间段
设定绝对时间:

R1 (config-time-range)#absolute start 8:00 1 jan 2008 end 15:00 2 feb 2008 

设定周期时间:

R1 (config-time-range)#periodic sunday 12:00 to 23:00  // 只在星期日上午允许
R1 (config-time-range)#periodic daily 8:00 to 12:00   // 一周中每天上午允许

几个主要周期时间参数:

Daily-- 从星期一到星期日
Weekday-- 从星期一到星期五
Weekend-- 从星期六到星期日

注意: 一个 time-range 下只能有一个 absolute 语句,但可以有多条 periodic 语句,如果在一个 time-range 下即有 absolute 语句,又有 periodic 语句,则先匹配 absolute 语句。

第三步:调用

access-list 100 permit ip any any time-range NP 

例:为 ACL 定义一个时间范围,在 2008 年 1 月 1 日到 2008 年 12 月 31 日之间的每个周末起作用

time-range NP
absolute start 8:00 1 jan 2008 end 24:00 31 dec 2008
periodic weekends 8:00 to 24:00

自反访问列表:

自反访问列表在路由器的接口下创建 IP 流量的动态开启放行 ACL 条目,这些开启表项的创建是基于源于设备的可信方的会话进行的,在自反访问列表中的每个语句,当语句中的条件得到满足时,就会在已存在的访问表中创建一个镜像表项。
简单来讲,自反访问列表能在路由器接口上根据出去的流量来自动放行返回的流量。

临时表项的特点:

1、表项总是一个 permit 表项
2、表项所指定的协议与原来向外报文的协议相同
3、新的表项互换了源目 IP 地址
4、新的表项互换了源目端口号
5、表项会一直存在,直到会话结束(TCP)或者 time-out 值到时(UDP)才会被删除
6、当会话的最后一个报文流过接口时,表项就到期。(对 TCP 而言)

注意:自反访问列表只能和命名的扩展访问列表结合使用

例:如下图所示,在路由器上做配置,要求外部网络不能访问内部网络,但是内部的主机 172.16.1.1 能够 telnet 到外部网络,也能访问外部网络的 www 服务。

ip access-list extended IN-FLOW
evaluate WOLF
int s1/0
ip access-group IN-FLOW in
ip access-list extended OUT-FLOW
permit tcp host 172.16.1.1 any eq telnet reflect WOLF
int s1/0
ip access-group OUT-FLOW out
permit tcp host 172.16.1.1 any eq www reflect WOLF timeout 180  // 还可以指定有效时间
ip reflexive-list timeout 300
<Distribute-List>用来过滤路由

分布列表通过调用 ACL 来对路由进行过滤,可以在一个单独的路由区域内过滤,也可在路由协议之间做重分布的时候进行过滤。

注意: 分布列表只能用于距离矢量协议,在链路状态协议中是没有意义的

例一:

R1 (config)#access-list 2 permit 2.2.2.0
R1 (config-router)#distribute-list 2 in serial 0 (只允许 2.2.2.0 路由从 S0 进)

例二:

R1 (config)#access-list 2 deny 2.2.2.0
R1 (config)#access-list 2 permit any 
R1 (config-router)#distribute-list 2 out serial 1 (不允许 2.2.2.0 路由从 S1 接口出去)

例三:协议间重分布时过滤

R1 (config)#access-list 1 permit 2.2.2.0 
R1 (config)#router ospf 110
R1 (config-router)#distribute-list 1 out eigrp 90

注意: 当在重分布时进行过滤,仅允许使用关键字 out,后面可以跟上协议名,但不能跟接口,因为无意义,详见卷一 496 页(注意: in 后面不能跟协议,只有 out 后能跟)

例四:在 OSPF 中使用分布列表:(没啥意义)

试验:
1、在 R1 上写一个访问列表

access-list 1 permit 172.16.1.1

2、在 R1 的 OSPF 进程下调用

distribute-list 1 in s1

3、查看 R1 和 R3 的路由表,比较有啥不同

总结:实际上并不能对 LSA 进行过滤,只能对自已的路由条目进行过滤。

<Prefix-List>前缀列表
和 ACL 类似的东东,设计用于专抓路由的工具,不仅可以匹配网络号,还可以匹配掩码

R4 (config)#ip prefix-list 2(用名字也行) permit 2.2.2.0/24
R4 (config-router)#distribute-list prefix 2 in serial 1

例一:

ip prefix-list 2 permit 2.2.2.0/24       //(匹配前 24 位:2.2.2.* ,掩码必须为 24 位)

例二:

ip prefix-list 2 permit 2.2.2.0/24 ge 25 le 30 //(匹配前 24 位:2.2.2.* ,掩码必须为 25-30 位)

例三:

ip prefix-list 2 permit 2.2.2.0/24 le 32    //(匹配前 24 位:2.2.2.* ,掩码必须为 24-32 位)

例四:
ip prefix-list 2 permit 2.2.2.0/24 ge 26    //(匹配前 24 位:2.2.2.* ,掩码必须为 26-32 位)

例五:

ip prefix-list 3 permit 0.0.0.0/0 le 32     //(匹配所有)不能像 access-list 哪样用 any 参数

ge 必须大于前面的数字,小或等于 le ,len<ge-value<=le-value
sh ip prefix-list 用于查看
用前缀列表过滤 A、B、C 类路由

A 类路由:ip prefix-list 1 permit 0.0.0.0/1 le 32
B 类路由:ip prefix-list 1 permit 128.0.0.0/2 le 32
C 类路由:ip prefix-list 1 permit 192.0.0.0/3 le 32

利用前缀列表过滤 OSPF
在这里插入图片描述

要求:在如上图所示的拓朴中,在 R1 上利用前缀列表做过滤,不要向 AREA0 区域传递 172.16.1.1 的路由。
R1:

ip prefix-list 1 seq 5 deny 172.16.1.1/32
ip prefix-list 1 seq 10 permit 0.0.0.0/0 le 32
router ospf 110
area 1 filter-list prefix 1 out

<Route-Map>
也叫路由图或者路由映射表,是对路由进行加工处理的工具。

1、route-map 可以调用 ACL 或 prefix 抓出一部分路由进行加工处理
2、每一个 route-map 可以有多条语句,每条语句都有一个序号
3、每条语句都有两种动作:match 和 set
4、每条语句对抓出来的路由都有两种处理方式:permit 或 deny

route-map 的使用分三步操作:

1、定义 ACL 或 prefix 抓出路由
2、定义 route-map 说明对匹配的路由所采取的处理方式
3、调用 route-map
route-map 的匹配逻辑:
route-map NAME permit 10
match ip address x y z
-------> OR
match ip address a ¦
match ip address b ¦ AND
match ip address c ↓
如不写 match/set, 默认: match any
set nothing

例一:

要求在 R1 上将 EIGRP 重分布进 OSPF,其中 172.16.1.0 路由要以 OE1 重分布,172.16.2.0 路由重分布时 metric 值要改为 100,172.16.3.0 的路由不允许重分布,其它路由不改动,默认重分布。

R1 (config)#access-list 1 permit 172.16.1.0 0.0.0.0
R1 (config)#access-list 2 permit 172.16.2.0 0.0.0.0
R1 (config)#access-list 3 permit 172.16.3.0 0.0.0.0
R1 (config)#route-map WOLF permit 10
R1 (config-route-map)#match ip address 1
R1 (config-route-map)#set metric-type type-1
R1 (config)#route-map WOLF permit 20
R1 (config-route-map)#match ip address 2
R1 (config-route-map)#set metric 100
R1 (config)#route-map WOLF deny 30
R1 (config-route-map)#match ip address 3
R1 (config)#route-map WOLF permit 40
R1 (config-route-map)#exit
R1 (config)#router ospf 110
R1 (config-router)#redistribute eigrp 90 subnets route-map WOLF  // 调用 route-map

注意:
・在 route-map 的最后隐含了一条 deny any 的语句
・如果不写一句空 Route-map 去允许其它路由通过,则没有匹配的路由直接被丢弃。

例二:match 接口

还可以在重分布直连的时候 match 一个接口,直接写 route-map 就可以,不用定义访问列表。

R1 (config)#route-map WOLF permit 10
R1 (config-route-map)#match interface e0

例三:使用 route-map 打 tag

作用:可以对一些路由打上 tag,好让后面的路由器根据 tag 找出这些路由并进行相应的策略
如上图所示,要求:
1、在 R3 上将 RIP 重分布进 OSPF
2、在 R1 上将 OSPF 重分布进 EIGRP,但不能将从 RIP 学到的路由带过去
可以用 tag 解决:
1、在 R3 上将 RIP 重分布进 OSPF 时,利用 route-map 打上 tag 标记
2、在 R1 上将 OSPF 重分布进 EIGRP 时,找出打了 tag 标记的路由再 deny 掉就行了

R3 (config)#route-map WOLF permit 10
R3 (config-route-map)#set tag 20
R3 (config)#router ospf 110
R3 (config-router)#redistribute rip subnets route-map WOLF

到了 R1 之后,对打 tag 的路由丢弃

R1 (config)#route-map CCNP deny 10
R1 (config-route-map)#match tag 20
R1 (config)#route-map CCNP permit 20   // 一定要写一条空语句放行其它的路由
R1 (config-route-map)#exit
R1 (config)#router eigrp 90
R1 (config-router)#redistribute ospf 110 metric 1500 100 255 1 1500 route-map CCNP
<Policy-Based Routing>

PBR 就是使用 route-map 这一工具对某个接口进来的数据流做一些策略,符合条件的按相应的策略进行路由,不符合条件的按正常情况进行转发。

PBR 的规则:

・PBR allows for source-based routing.
・PBR 优于路由表 ----- 如果路由器上设置了 PBR,当数据包到达路由器时,是先匹配 PBR,如果匹配上了,直接按 PBR 进行转发,如果没匹配上,再去找路由表进行转发,所以说 PBR 覆盖了正常的路由选择进程。
・PBR 中不匹配的数据包不会 DENY(丢弃),而是 normal forwarding (正常转发)

注意: Applied to incoming packets PBR 只针对于入项接口

例一:

第一步:

R1 (config)#access-list 1 permit 1.1.1.0 0.0.0.255
R1 (config)#access-list 2 permit 2.2.2.0 0.0.0.255

第二步:

R1 (config)#route-map WOLF permit 10
R1 (config-route-map)#match ip address 1
R1 (config-route-map)#set ip next-hop 12.1.1.2 发给与本机直连的下一跳路由器
R1 (config)#route-map WOLF permit 20
R1 (config-route-map)#match ip address 2
R1 (config-route-map)#set ip next-hop 13.1.1.3 

第三步:

R1 (config)#int e0/0  (入口调用策略)
R1 (config-if)#ip policy route-map WOLF

PBR 其它用途:

R1 (config)#route-map PBR per 10
R1 (config-route-map)#match ip address 9
R1 (config-route-map)#set ip precedence 2 对数据分组设置优先级
R3#debug ip policy 

本地策略路由:
                    
・PBR 默认对本地产生的数据流量不起效。也就是对自已产生的包不执行策略。

R3 (config)#ip local policy route-map PBR (使 PBR 对本地数据流量有效)加上这一条命令才会对自已产生的包也做策略

===========================
代老师:
信任源路由 ,不能忘本 RIP 120 --> OSPF 110 ,R1 不会 刷掉 RIP 路由。==》因为 信任路由源。
重分布的内容:
学习来的路由
宣告的直连的路由
重分布进 RIP 时要注意 METRIC 的问题
ROUTER RIP
redistribute eigrp 100 metric 6
default-metric 3
redistribule connected 不需要指定 metric ,默认为 1
redistribule static 不需要指定 metric ,默认为 1
default-metric 会影响重分布静态的 metric
default-metric 不影响重分布直连的 metric
重分布进 EIGRP 时要注意的问题

ROUTE EIGRP 100
redistribute rip metric 1544 2000  255 1 1500
default-metric 1000 2000 255 1 1500

redistribute connected 不需要指定 metric , 不调用 default-metric ;计算 metric 时 ,带宽,延时,参照相应直连接口。
redistribute static 不需要指定 metric , default-metric 会影响到重分布静态。不指定 default-metric , 按静态路由出接口的 带宽、延时计算。
重分布 OSPF
ROUTE OSPF 100
redistribute RIP SUBNET
如果没有 subnet , 只能有 主网 和 超网 CIDR 能进。
IP prefix-list 前缀列表
抓以类开头:

ip prefix-list CLASS-A seq 5 permit  0.0.0.0/1 le 32    //ge8  le 8
ip prefix-list CLASS-B seq 5 permit 128.0.0.0/2 le 32   //ge16 le 16
ip prefix-list CLASS-C seq 5 permit 192.0.0.0/3 le 32   //ge24 le 24

/x 固定前缀 x < ge <= le
/5 ge 8 le 20 => 抓 前面 5 个数固定不变的, 掩码为 /8 到 /20 的 路由.


注:本文只从 51cto 找到有一张图片的一段,补上一张图,其他大量转载有文无图,原始出处已无处可寻,其他缺失的图无从补全。
via:
Redistribute-CSDN博客 ghv587 于 2016-06-27 10:51:33 发布
https://blog.csdn.net/ghv587/article/details/51767011

相关文章:

Cisco 路由重发布 —— 实现路由信息在不同路由域间的传递

一、技术背景 在实际的组网中&#xff0c;可能会遇到这样一个场景&#xff1a;在一个网络中同时存在两种或者两种以上的路由协议。例如客户的网络原先是纯 Cisco 的设备&#xff0c;使用 EIGRP 协议将网络的路由打通。但是后来网络扩容&#xff0c;增加了一批华为的设备&#…...

mysql8和mysql5版本在使用mybatis框架时的注意事项

mysql8和mysql5版本在使用mybatis框架时有些注意事项&#xff0c;两者的区别在于两处地方的设置。有一处未设置好&#xff0c;就会出现以下错误&#xff1a;java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Can…...

为什么要有指针和引用类型?

简单说&#xff0c;是为了必要的&#xff0c;且很基础的表达能力 &#xff08;描述能力&#xff09;。 0. 数据四要素&#xff1a;名、值、址、型 指针、引用的基础&#xff0c;就是在描述一个数据时&#xff0c;除了这个数据的“值”以外&#xff0c;引入了这个数据的“地址…...

vivado INTERNAL_VREF

内部 具有差分输入缓冲器的单端I/O标准需要输入参考 电压&#xff08;VREF&#xff09;。当I/O组中需要VREF时&#xff0c;您可以使用专用VREF 引脚作为外部VREF电源&#xff0c;或使用INTERNAL_VREF内部生成的VREF 属性&#xff0c;或者对于UltraScale设备上的HP I/O组&#x…...

VScode通过Graphviz插件和dot文件绘制层次图,导出svg

1、安装插件 在VScode中安装Graphviz Interactive Preview插件&#xff0c;参考。 2、创建dot文件 在本地创建一个后缀为dot的文件&#xff0c;如test.dot&#xff0c;并写入以下内容&#xff1a; digraph testGraph {label "层次图";node [shape square; widt…...

MMCV 核心组件分析(一):整体概述

概述 MMCV 是计算机视觉研究的基础库&#xff0c;并提供以下功能。...

阵列信号处理学习笔记(一)--阵列信号处理定义

阵列信号 阵列信号处理学习笔记&#xff08;一&#xff09;–阵列信号处理定义 阵列信号处理学习笔记&#xff08;二&#xff09;–空域滤波基本原理 文章目录 阵列信号前言一、阵列信号处理定义1.1 信号1.2 阵列 二、雷达数据中哪些属于空间采样总结 前言 MOOC 阵列信号处理…...

[HTML]一文掌握

背景知识 主流浏览器 浏览器是展示和运行网页的平台&#xff0c; 常见的五大浏览器有 IE浏览器、火狐浏览器&#xff08;Firefox&#xff09;、谷歌浏览器&#xff08;Chrome&#xff09;、Safari浏览器、欧朋浏览器&#xff08;Opera&#xff09; 渲染引擎 浏览器解析代码渲…...

ABAP使用SQL直接更新数据库与使用IN UPDATE TASK的区别

1. 背景 刚接触ABAP的小伙伴常常会有这样的疑问&#xff0c;为什么不直接使用Open SQL直接更新数据库&#xff0c;而要把对DB的操作封装到IN UPDATE TASK中呢&#xff1f; 对于这个问题&#xff0c;比较常见的解释是&#xff0c;IN UPDATE TASK的方式会保证数据更新的一致性。…...

Android GWP-Asan使用与实现原理

目录 一、 背景 二、GWP-Asan介绍 2.1 什么是GWP-ASan 2.2 GWP-Asan与其他几类工具对比 2.3 GWP-ASan与其它内存分配器的兼容性 三、GWP-Asan如何使用 3.1 app进程 3.2 native进程 四、GWP-Asan实现原理 4.1 进程启用GWP-Asan 4.2 初始化 4.3 内存分配 4.3.1 内存…...

SpringBoot 跨域请求处理全攻略:从原理到实践

文章目录 SpringBoot 如何处理跨域请求&#xff1f;你能说出几种方法&#xff1f;跨域请求概述跨域解决方案1. 使用CrossOrigin注解2. 使用WebMvcConfigurer配置类3. 使用过滤器&#xff08;Filter&#xff09;4. 使用Spring Security处理CORS5.使用Spring Cloud Gateway处理CO…...

vulnhub——Ai-Web1靶机渗透

Ai-Web1靶机渗透 靶机下载&#xff1a; 官网地址&#xff1a;https://www.vulnhub.com/entry/ai-web-1,353/ 攻击机&#xff1a;kali2024 一、信息收集 发下目标主机的IP为&#xff1a;192.168.201.141 用nmap工具扫描一下对方主机和服务 发现他打开了80端口 发现搜不到于是…...

sqlalchemy事件监听

sqlalchemy事件监听 SQLAlchemy 中的事件监听允许您在特定事件发生时执行自定义的 Python 代码。这些事件可以是与ORM(对象关系映射)或核心组件相关的操作,比如表、类、会话或事务的插入、更新、删除等操作。通过事件监听,您可以实现日志记录、审计或执行业务规则等功能。…...

【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

文章目录 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6;一、Celery⭐1.基本概念及介绍:✨2.使用步骤&#x1f4ab; 二、订单超时 取消订单&#xff08;Celery&#xff09;&#x1f525;具体实现流程&#x1f4d6; 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6; 在构建复…...

CSS3 教程

CSS3 教程 引言 CSS3&#xff0c;即层叠样式表的第三代&#xff0c;是网页设计和开发中不可或缺的技术之一。它为HTML元素提供了丰富的样式定义&#xff0c;使得网页不仅内容丰富&#xff0c;而且外观美观、交互性强。本教程将详细介绍CSS3的基础知识、高级特性以及最佳实践&…...

树与二叉树学习笔记

树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树&#xff1a;定义与特点二叉树&#xff1a;前序、中序、后序遍历二叉树&#xff1a;深度、广度优先遍历二叉树&#xff1a;线索化二叉树&#xff1a;序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…...

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有&#xff1a;账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单&#xff0c;在支付系统侧就是要记录清楚&#xff0c;谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…...

org.springframework.context.ApplicationContext发送消息

1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…...

Java8-21新特性

简介 由于Java官方最近更新越来越频繁&#xff0c;而长期支持维护的版本LTS版每隔几年才推出一个&#xff0c;大规模商用的JDK只可能选择LTS版&#xff0c;因此这里只简单记录JDK8&#xff0c;11&#xff0c;17&#xff0c;21。 jdk8 Lambda表达式&#xff1a; Lambda表达式…...

NodeJS系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 有没有写过Koa中间件&#xff0c;说一下中间件原理&#xff0c;介绍下自己写过的中间件 koa本来就是一个轻量级框架&#xff0c;本身支持的功能并不多&#xff0c;功能都是通过中间件来实现不同的需求。开发者可以通…...

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API&#xff0c;可以…...

昇思25天学习打卡营第13天 | mindspore 实现 ShuffleNet 图像分类

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第 13 天&#xff1b;主要内容也依据 mindspore 的学习记录。 2. 迁移学习介绍&#xff1a; mindspore 实现 ShuffleNet 图像分类&#xff1b; ShuffleNet 基本介绍&#xff1a; ShuffleNetV1 是旷视科技提…...

C语言超市管理系统UI界面

以下是部分代码。需要源码的私信 #include<easyx.h> #include<stdio.h> #include<stdlib.h>#define width 1280 #define height 840 #define font_w 35 //字体宽度 #define font_h 90 //字体高度typedef struct node {char name[100];//名字char number[1…...

BUUCTF逆向wp [MRCTF2020]Xor

第一步 查壳&#xff0c;该题是32位&#xff0c;无壳。 第二步 跟进main&#xff0c;发现反汇编不了 通过下图我们可以发现一串类似字符串的东西 第三步 我们看一下汇编 我们可以得到这些信息&#xff1a;flag的长度为27&#xff08;下面是对本条指令cmp edx 27指令的应用…...

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185...

详解数据结构之二叉树(堆)

详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构&#xff0c;它是由 n(n>0)个有限节点组成的一个具有层次关系的集合&#xff0c;它的外观形似一颗倒挂着的树&#xff0c;根朝上&#xff0c;叶朝下&#xff0c;所以称呼为树。每颗子树的根节点有且只…...

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件&#xff1a;(从官网获取或者网上) 1、zlib-1.2.3.tar.gz &#xff1a;通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…...

STM32测测速---编码电机读取速度的计算

1、首先先了解一下计算的公式 速度计算&#xff1a; 轮胎每转一圈的脉冲数取决于编码器的分辨率&#xff0c;可由下面公式进行计算&#xff1a; PPR是电机的线数 以GA25-370电机为例。 图片来源&#xff1a;第四节&#xff1a;STM32定时器&#xff08;4.JGA25-370霍尔编码器…...

【已解决】服务器无法联网与更换镜像源

目录 问题描述&#xff1a; 1.修改网卡的 DNS1 和 DNS2 2.修改DNS列表 3.重启网络服务 4.切换镜像源 4.1备份原镜像源 4.2下载阿里云镜像源 4.3替换无法使用的域名 4.4刷新软件包缓存 4.5其他镜像源 5.阿里云镜像源开发者社区说明 6.阿里云DNS网址 7.DNS域名服务器…...

android11 屏蔽usb通过otg转接口外接鼠标设备

硬件平台&#xff1a;QCS6125 软件平台&#xff1a;Android11 需求&#xff1a;Android设备通过接usb转接线连接鼠标功能屏蔽。 考虑到屏蔽的层面可以从两个层面去做&#xff0c;一个是驱动层面不识别&#xff0c;一个就是Android系统层面不识别加载&#xff0c;本篇只讲后者。…...

HAL库源码移植与使用之RTC时钟

实时时钟(Real Time Clock&#xff0c;RTC)&#xff0c;本质是一个计数器&#xff0c;计数频率常为秒&#xff0c;专门用来记录时间。 普通定时器无法掉电运行&#xff01;但RTC可由VBAT备用电源供电&#xff0c;断电不断时 这里讲F1系列的RTC 可以产生三个中断信号&#xff…...

GIT命令学习 一

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…...

VS+QT 打包可执行文件.exe

切换成release版本&#xff0c;同时更改项目属性中release配置下的各个属性&#xff0c;确保匹配 重新生成解决方案&#xff0c;将生成的.exe复制到一个空白文件夹中 执行&#xff1a; cd D:\QT\5.12.10\msvc2015_64\binwindeployqt C:\Users\DELL\Desktop\serials\MainWind…...

Android笔试面试题AI答之Activity(2)

答案仅供参考&#xff0c;大部分为文心一言AI作答 目录 1. 请介绍一下Activity 生命周期&#xff1f;1. 完全生命周期2. 可见生命周期3. 前台生命周期4. 配置更改5. 特殊场景 2. 请介绍一下横竖屏切换时Activity的生命周期变化&#xff1f;1.默认行为&#xff08;未设置androi…...

来自Transformers的双向编码器表示(BERT) 通俗解释

来自Transformers的双向编码器表示&#xff08;BERT&#xff09; 目录 1. 从上下文无关到上下文敏感2. 从特定于任务到不可知任务3. BERT&#xff1a;把两个最好的结合起来4. BERT的输入表示5. 掩蔽语言模型&#xff08;Masked Language Modeling&#xff09;6. 下一句预测&am…...

代码随想录第十六天|贪心算法(2)

目录 LeetCode 134. 加油站 LeetCode 135. 分发糖果 LeetCode 860. 柠檬水找零 LeetCode 406. 根据身高重建队列 LeetCode 452. 用最少数量的箭引爆气球 LeetCode 435. 无重叠区间 LeetCode 763. 划分字母区间 LeetCode 56. 合并区间 LeetCode 738. 单调递增的数字 总…...

花几千上万学习Java,真没必要!(二十二)

1、final关键字&#xff1a; 测试代码1&#xff1a; package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值&#xff0c;这将导致编译错误// number 10; // …...

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址&#xff1a;https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码&#xff1a;hm30 烧录过程&#xff1a; 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录&#xff0c;双击运行RKDevInfo…...

1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)

1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下&#xff0c;我们可以通过构建一个卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;来实现该任务。以下…...

Windows如何使用Python的sphinx

在Windows上使用Python的Sphinx进行文档渲染和呈现&#xff0c;‌可以遵循以下步骤进行操作&#xff1a;‌ 安装Python&#xff1a;‌首先&#xff0c;‌确保你的Windows系统上已经安装了Python。‌你可以从Python的官方网站下载并安装适合你系统&#xff08;‌32位或64位&…...

C++ STL nth_element 用法

一&#xff1a;功能 将一个序列分为两组&#xff0c;前一组元素都小于*nth&#xff0c;后一组元素都大于*nth&#xff0c; 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二&#xff1a;用法 #include <vector> #include <a…...

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

C# —— HashTable

集合collections命名空间&#xff0c;专门进行一系列的数据存储和检索的类&#xff0c;主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定&#xff0c; 类型固定 通过索引值来进行访问 ArrayList动态数组&#xff0c…...

LeetCode 第407场周赛个人题解

目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…...

使用Django框架实现音频上传功能

数据库设计&#xff08;models.py&#xff09; class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…...

[路由器]IP-MAC的绑定与取消

背景&#xff1a;当公司的网络不想与外部人员进行共享&#xff0c;可以在路由器页面配置IP-MAC的绑定&#xff0c;让公司内部人员的手机和电脑的mac&#xff0c;才能接入到公司。第一步&#xff1a;在ARP防护中&#xff0c;启动IP-MAC绑定选项&#xff0c;必须启动仅允许IP-MAC…...

Idea配置远程开发

Idea配置远程开发 本篇博客介绍使用idea通过ssh连接ubuntu服务器进行开发 目录 Idea配置远程开发1.idae上点击file->Remote Development2.点击New Connection3.填写相关信息4.输入密码5.选择IDE版本和项目路径5.1 点击open an SSH terminal打开控制台5.2 依次执行命令 6.成…...

lua 实现 函数 判断两个时间戳是否在同一天

函数用于判断两个时间戳是否在同一天。下面是对代码的详细解释&#xff1a; ### 函数参数 - stampA 和 stampB&#xff1a;两个时间戳&#xff0c;用于比较。- resetInfo&#xff1a;一个可选参数&#xff0c;包含小时、分钟和秒数&#xff0c;用于调整时间戳。 ### 函数实现…...

工作纪实53-log4j日志打印文件隔离

在项目中&#xff0c;我有一堆业务日志需要打印&#xff0c;另一部分的日志&#xff0c;是没有格式的&#xff0c;需要被云平台离线解析并收集到kafka或者hdfs、hive等&#xff0c;需要将日志隔离打印到不同的文件 正常的log4j配置是下面这样的&#xff0c;配合Sl4j直接使用默认…...

7月21日,贪心练习

大家好呀&#xff0c;今天带来一些贪心算法的应用解题、 一&#xff0c;柠檬水找零 . - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 本题的贪心体现在对于20美元的处理上&#xff0c;我们总是优先把功能较少的10元作为找零&#xff0c;这样可以让5元用处更大 …...