路由表中的下一跳是如何定义的?

路由表中的下一跳是如何定义的?

路由表包含什么?只有目标 LAN 地址和下一跳?但这个下一跳是什么意思?因为看看这个例子

在此处输入图片描述

我没有看到定义下一跳的一般规则。(对于网络目标 10.0.0.0、11.0.0.0、13.0.0.0 我理解,但对于其他的我不明白)

我还使用命令 'ip route add <> src <> via <> ,<> 中应该是什么?我在 virtualbox 中使用 Linux Ubuntu 作为虚拟机

答案1

我的猜测是,“rtnetlink reply: invalid param”错误是因为 IP 地址、掩码和网关不属于同一类(A 类、B 类或 C 类);或者是因为“静态”地址与某些 DHCP 地址范围冲突。

您的架构中 R8 的表不是路由表,而是描述 R8 将如何处理地址。例如,10.0.0.0 应理解为 10.0.0.0/24 网段,而不是 IP 地址。

对于不能从 R8 直接访问的子网(例如 16.0.0.0/24),路由表会将消息定向到距离目标网络最近的路由器,然后该路由器将根据自己的路由表传递消息。在这种情况下,发往 16.0.0.X 的消息将传递到网关 10.0.0.2(即 R7 的地址),然后 R7 会将消息转发给正确的收件人。

R8 中执行的路由命令应类似于:

ip route add 16.0.0.0/24 via 10.0.0.2 src 10.0.0.1

在向多宿主主机添加路由时,使用 src 参数来控制主机发送的源 IP 地址。在简单情况下可以省略该参数。这将确保返回消息将通过 10.0.0.0/24 子网返回,但如果出于某种原因我们更喜欢 R7 不通过该子网返回消息,则可以使用其他值。

请注意,您提供的 src 只会影响源自您这一端的流量。如果路由的是外部数据包,它显然已经有一个源 IP 地址,因此通常会不加改变地传递它(除非使用 NAT,这也可以覆盖)。

我注意到,一般来说,不需要为每个目的地提供路由。就像计算机可以在其路由表中指定默认网关一样,这是一个接收所有发往它不知道的地址的消息的万能地址,路由器也有自己的路由表,其中可以包含网关。路由器的网关地址由默认路由表示0.0.0.0

请注意,完全可以在网络中设置网关电路,例如:
R1 ➝ R4 ➝ R8 ➝ R7 ➝ R6 ➝ R2 ➝ R1。
此处的跳数未优化,但消息仍会从每个子网络发送到每个其他子网络。良好的网络设计通常会包含一个或多个集中式路由器,以尽量减少跳数。

答案2

其他路由器距离不止一跳(路由器)。就路由器 R8 而言,它只想知道要使用的接口和下一个路由器的 IP,以便到达目标网络,然后它转到下一个路由器,该路由器使用自己的路由表来确定下一跳。因此,为了到达 15.0.0.0 网络,路由表定义接口 3,即 13.0.0.4,而下一跳是它要去的下一个路由器,即 13.0.0.2。一旦 R2 收到流量,R2 将使用自己的路由表来确定到 15.0.0.0 网络的最佳路由,该路由将从 15.0.0.1 接口出发。

答案3

我不确定您的设计和路由表从何而来。无论如何,在像您这样的环境中,到远程网络的路由通常是通过路由协议(即动态路由)定义的;使用静态路由(由用户/管理员定义)以及您拥有的所有冗余路径最终会导致路由循环或黑洞。

换句话说,您图表中的每个子网实际上都可以通过 R8 的每个接口访问,这取决于其他路由器的配置。

例如:如果您将 R8 的接口 1 定义为 14.0.0.0 的下一跳(这意味着发往 14.0.0.0/? 子网的任何 IP 的数据包都将从接口 1 发出),并且如果 R4(R8 接口 1 的实际下一跳)具有另一个通过 R1 到 14.0.0.0 的静态,则您的数据包将穿过 R8->R4->R1->目的地。另一方面,如果在此示例中您仍将 14.0.0.0 的数据包发送到 R4,但 R4 配置了指向 R8 的 14.0.0.0 的不同静态,则您将出现路由循环,并且您的数据包将在 R8 和 R4 之间来回跳转,直到其 TTL 到期。

同样的理论也适用于任何其他远程网络,例如 12.0.0.0,其中 R8 是否应该将其数据包转发到 R2 或 R4 并不那么明显。

要记住的是IP 数据包没有记忆,它们只是通过评估其目的地来转发(即路由器不关心接收数据包的接口 - 除非您使用诸如源路由之类的东西,但这里并非如此)。

您发布的表格未显示是否使用静态或动态路由(它也遗漏了这些网络的子网),但除非这是特定的理论练习,否则动态路由就是您所需要的。

动态路由可以使用不同的参数(如跳数、带宽、延迟等,具体取决于特定的动态路由协议)来定义从路由器到目标网络的最佳路径。此外,它们还可以妥善管理冗余链路的故障。

再举一个例子,如果您决定将 12.0.0.0 的静态路由指向 R3,并且 R3 路由器崩溃,那么您将继续将发往 12.0.0.5(例如)的数据包转发到黑洞。如果您决定使用通过 R3 和 R4 的 2 条路由(具有相同的度量)将负载平衡到 12.0.0.0,如果 R4 发生故障(或其某个接口损坏),R8 将继续将数据包 1 转发到 R3,将数据包 2 转发到 R4,将数据包 3 转发到 R3,依此类推。这显然会导致随机事件,因为如果数据包使用 TCP,则丢失的数据包将被重新传输,从而使一半流量被丢弃(例如某些服务间歇性断线、速度缓慢等)变得不那么明显。

如果您使用 Linux,Quagga 可以作为用于动态路由的软件,但假设其他路由器正在运行动态路由协议。

但是,如果您的目标是设置静态路由,则这些命令应该可以工作(我假设是 /24,但如果有分类,则可能是 /8):

ip route add 14.0.0.0/24 dev eth3

相同:

ip route add 14.0.0.0/24 via 13.0.0.2

无论如何,在多路访问网络中通常优先选择第二种(不需要多播/广播流量,不需要大量的 ARP 请求等)。

相关内容