路由协议:我只想看新闻,不想出能看片的钱

这是我参与更文挑战的第9天,活动详情查看:更文挑战

前言

上一篇说了网关和路由相关的知识点,包括数据报在传输的过程中MAC和IP是否要变化等。

今天就来记录一下路由协议,包括如何配置静态路由、什么是动态路由算法等信息。

如何配置路由?

路由器就是一台网络设备,有多张网卡,当一个入口的网络包送到路由器时,会根据一个本地的转发信息库,决定如何正确的转发流量。这个转发信息库就是**「路由表」**。

一张路由表会有多条路由规则,每条规则包括三个信息:

  • 目的网络:包想去哪儿
  • 出口设备:从哪个出口发出
  • 下一跳网关:下一个路由器的地址

按照上述三项配置信息进行配置的路由策略,有一个核心思想就是:根据目的IP地址来配置路由。

通过route和ip route命令都可进行查询路由配置

「添加路由规则」

比如想去10.176.48.0/24这个目标网络,需要从eno16777736出去,经过192.168.197.2这个网关

ip route add 10.176.48.0/24 via 192.168.197.2 dev eno16777736
复制代码

如何配置路由策略

除了可以根据IP地址进行配置,还可以根据多个参数来配置路由,这就是**「策略路由」**

可配置多个路由表,根据源IP、入口设备、TOS等选择路由表,然后再路由表中查询路由,可使来自不同来源的包走不同的路由

「查看路由表」

「查看路由表详细」

例如,设置从192.168.1.0/24这个网段来的,使用table main中的路由表。

ip rule add from 192.168.1.0/24 table main
复制代码

在一条路由规则中,也可以走多条路径

例如:下一跳有两个地方,分别是100.100.100.1和200.200.200.1,权重比是1:2

ip route add default scope global \
nexthop via 100.100.100.1 weight 1 \
nexthop via 200.200.200.1 weight 2
复制代码

例如:

从移动和电信拉了两条网线,移动是千兆光纤、电信是百兆光纤,此时需要可接两个外网的路由器

家用网络的网段就是192.168.1.x/24,有俩租户,分别把线联到路由器上,IP地址为192.168.1.101/24和192.168.1.102/24,网关都是192.168.1.1/24,网关在路由器上。

此时出去的数据包需要经过NAT网关转成公网IP地址,路由器就是一个NAT网关。

此时移动和电信都要为这个网关配置一个公网IP地址,像下图:

运营商里面也有一个IP地址,在运营商网络里面的网关,不同的运营商方法不一样,有的是/32的,也即是一对一连接。

如上图:

移动给路由器分配的地址是183.134.189.34/32,移动网络的网关是183.134.188.1/32

有的是/30的,也即是分了一个特别小的网段。

电信给路由器分配的地址是60.190.27.190/30,电信网络里面的网关是 60.190.27.189/30。

根据此网络拓扑图,可将路由配置如下:

$ ip route list table main 
60.190.27.189/30 dev eth3  proto kernel  scope link  src 60.190.27.190
183.134.188.1 dev eth2  proto kernel  scope link  src 183.134.189.34
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.1
127.0.0.0/8 dev lo  scope link
default via 183.134.188.1 dev eth2
复制代码

此时规则如下:

  • 去电信,走eth3
  • 去移动,走eth2
  • 访问内网,走eth1
  • 如果所有规则都匹配不上,默认走移动,走千兆网络

当有个租户只想简单上网看看新闻,不想出看片的钱,此时可以添加一个table,让他走百兆网络

(1)先新增一个table lsy

echo 200 lsy >> /etc/iproute2/rt_tables
复制代码

文件/etc/iproute2/rt_tables中存放所有的table

(2)添加一条规则,从192.168.1.101来的包都查看lsy这个table

ip rule add from 192.168.1.101 table lsy
复制代码

(3)然后在lsy的路由表中添加规则,默认走百兆网络

ip route add default via 60.190.27.189 dev eth3 table chao
复制代码

(4)最后刷新路由缓存

ip route flush cache
复制代码

上述都是静态的路由,在网络环境较为简单时,可用,但在网络环境复杂并多变的时候,如果总是用静态路由,一旦网络结构发生变化,手工修改路由会非常复杂,所以需要动态路由。

动态路由算法

使用动态路由路由器,可根据路由协议算法生成动态路由表,随网络运行状况的变化而变化。

无论是一个网络内部还是网络之间,都可以将复杂的路径,抽象为一种叫作图的数据结构。

求最短路径常用的有两种方法,一种是 Bellman-Ford 算法,一种是 Dijkstra 算法。

1、距离矢量路由算法

距离矢量路由(distance vector routing)。它是基于 Bellman-Ford 算法的。

此种算法,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是目标路由器,另一个是到目标路由器的距离。

每个路由器都知道全局信息

「信息如何更新?」

每个路由器都知道自身和邻居之间的距离,每过几秒,每个路由器都将自身所知的到达所有路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。

每个路由器根据新收集的信息,计算和其他路由器的距离,比如自己的一个邻居距离目标路由器的距离是 M,而自己距离邻居是 x,则自己距离目标路由器是 x+M。

「缺点:」

(1)好消息传得快,坏消息传得慢

如果有个路由器加入了这个网络,它的邻居就能很快发现它,然后将消息广播出去。

要不了多久,整个网络就都知道了。

但是一旦一个路由器挂了,挂的消息是没有广播的。

当每个路由器发现原来的道路到不了这个路由器的时候,感觉不到它已经挂了,而是试图通过其他的路径访问,直到试过了所有的路径,才发现这个路由器是真的挂了。

(2)每次发送时,要发送整个全局路由表

2、链路状态路由算法

链路状态路由(link state routing),基于 Dijkstra 算法。

当一个路由器启动时,首先是发现邻居,向邻居say hello,邻居都回复,

然后计算与邻居的距离,发送一个echo,要求马上返回,除以2就是距离。

然后将自身和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器,

这样每个路由器都能收到它和邻居之间关系的信息,

因此,每个路由器都能在本地构建一个完整的图,

然后针对此图使用Dijkstra算法,找到两点之间的最短路径。

链路状态路由协议只广播更新或改变的网络拓扑,使得更新信息更小,节省了带宽和CPU利用率,而且一旦一个路由器挂了,他的邻居都会广播这个消息。

动态路由协议

1、基于链路状态路由算法的OSPF

OSPF(Open Shortest Path First,开放式最短路径优先)就是这样一个基于链路状态路由协议,广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway Protocol,简称 IGP)。

内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候 OSPF 可以发现多个最短的路径,可以在这多个路径中进行负载均衡,这常常被称为**「等价路由」**。

有了等价路由,到一个地方去可以有相同的两个路线,可以分摊流量,还可以当一条路不通的时候,

2、基于距离矢量路由算法的BGP

对于网络包,每个数据中心都设置自己的 Policy。

例如,哪些外部的 IP 可以让内部知晓,

哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过。

在网络世界,这一个个局域网称为**「自治系统 AS(Autonomous System)」**。

自治系统分几种类型:

  1. Stub AS:对外只有一个连接。这类 AS 不会传输其他 AS 的包。例如,个人或者小公司的网络。
  2. Multihomed AS:可能有多个连接连到其他的 AS,但是大多拒绝帮其他的 AS 传输包。例如一些大公司的网络。
  3. Transit AS:有多个连接连到其他的 AS,并且可以帮助其他的 AS 传输包。例如主干网。

每个自治系统都有边界路由器,通过它和外面的世界建立联系。

BGP 又分为两类,eBGP 和 iBGP。

自治系统间,边界路由器之间使用 eBGP 广播路由。

内部网络也需要访问其他的自治系统。

「边界路由器如何将 BGP 学习到的路由导入到内部网络呢?」

就是通过运行 iBGP,使得内部的路由器能够找到到达外网目的地的最好的边界路由器。

BGP 协议使用的算法是路径矢量路由协议(path-vector protocol)。它是距离矢量路由协议的升级版。

===============================

我是Liusy,一个喜欢健身的程序员。

获取更多干货以及最新消息,请关注公众号:上古伪神

如果对您有帮助,点个关注、转发就是对我最大的支持!!!谢谢

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享