了解Linux中的基本IP路由

了解Linux中的基本IP路由
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.24    0.0.0.0         255.255.255.252 U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.25.0    0.0.0.0         255.255.255.0   U     0      0        0 eth2
0.0.0.0         192.168.1.25    0.0.0.0         UG    0      0        0 eth0

我想了解Linux 路由是如何工作的。

数据包从设备/接口进出,在本例中为, eth0, eth1eth2因此,Ip 数据包来自这些设备,也可能来自其他设备(例如tun设备)。

假设一个 IP 数据包到达eth1。 IP源:192.168.1.1,IP目的地:199.178.167.431。由于该地址位于 的 Genmask 之外eth1,因此 linux 将尝试通过默认网关发送它。

假设一个 IP 数据包到达eth1。 IP源:192.168.1.1,IP目的地:192.168.1.2。由于这个地址位于 的 genmask 上eth1,那么 linux 会将这个数据包发送到哪里?从哪个设备?

假设一个 IP 数据包到达eth0。有两个eth0条目,那么 Linux 使用哪一个来路由该数据包呢?另外,我不知道该数据包可能具有的源和目的地。谁能举个例子吗?

答案1

首先,我建议您阅读有关 TCP/IP 和路由表的基础文本。

假设一个 IP 数据包到达 eth1。 IP源:192.168.1.1,IP目的地:199.178.167.431。由于该地址位于 eth1 的 Genmask 之外,因此 linux 将尝试通过默认网关发送它。

由于目的IP与接口的定义不匹配,数据包被丢弃;

假设一个 IP 数据包到达 eth1。 IP源:192.168.1.1,IP目的地:192.168.1.2。由于这个地址位于 eth1 的 genmask 上,那么 linux 会将这个数据包发送到哪里?从哪个设备?

由于目的IP与接口的定义不匹配,数据包被丢弃;

假设一个 IP 数据包到达 eth0。有两个 eth0 条目,那么 Linux 使用哪一个来路由该数据包呢?另外,我不知道该数据包可能具有的源和目的地。谁能举个例子吗?

只有一个条目定义了接口的第 3 层配置 ( 192.168.1.24 0.0.0.0 255.255.255.252 U 0 0 0 eth0),因此不会出现歧义。您还看到的是,默认网关映射到接口本地的 IP 地址eth0,但这是在所有其他路由失败时使用的路由,因此它与您的问题不太匹配。

在路由过程中,内核总是从更具体到不太具体的路由定义进行匹配。因此,如果数据包要转发到,10.1.2.3并且您有 2 个路由定义10.1.0.0/16toeth310.1.2.0/24to eth4,则数据包将离开 via,eth4因为这是与目的地匹配的最具体的路由。

答案2

它不是特定于linux的,它只是IP路由规则

我从最简单的情况 eth1 和 eth2 开始。

使用为 eth1 提供的内核路由表,目标是192.168.0.0和 网络掩码255.255.255.0。这意味着 eth1 位于地址为 的网络中192.168.0,网络上的每台计算机的地址为 1 到 254; 0和255有特殊含义:网络的第一个地址是网络地址,最后一个是广播地址。因此,每台计算机都有一个完整的地址“网络地址”。“计算机地址”:例如,192.168.0.45 和 255.255.255.0 网络掩码是 192.168.0 网络中的计算机地址 45。如果此接口上没有网关,则该接口仅接受这种形式的 ip 数据包。因此,不存在源 ip 192.168.1.1 的数据包路由:该地址不在 192.168.0.0 网络中,并且 ip 数据包被丢弃。

与eth2相同,不同之处在于网络地址为192.168.25.0

对于 eth0,有 2 条路由。第一个(目标 192.168.1.24,掩码 255.255.255.252,无网关)用于本地网络,第二个(目标 0.0.0.0,掩码 0.0.0.0,网关 192.168.1.25)是“默认”路由。该路由的意思是“如果您不知道如何处理特定数据包,请通过 192.168.1.25 发送”。该网络的掩码为 255.255.255.252。 252是二进制11111100,这个网络有4个地址:192.168.1.24(网络地址)、192.168.1.25(网关地址,我们在路由表中看到这个)、192.168.1.26(空闲地址)、192.168.1.27(广播地址) 。不难猜测 eth0 的 IP 地址是 192.168.1.26。

无论如何,这些路由在内部用于回答“我将该数据包发送到哪里”的问题。假设您的内核启用了路由(/proc/sys/net/ipv4/ip_forward设置为 1),我们可以看到以下不同的情况:

  • 具有 ip 源的数据包192.168.1.1到达 eth1(网络 192.168.0.0);数据包被丢弃
  • 带有 ip 源的数据包192.168.0.45到达 eth1(网络 192.168.0.0),带有 ip 目的地192.168.25.32。数据包被内核接受,并根据路由表,通过eth2输出
  • 带有 ip 源的数据包192.168.0.45到达 eth1(网络 192.168.0.0),带有 ip 目的地97.67.25.49。该数据包被内核接受,但内核不知道这个特定的网络,并根据路由表,通过 eth0 发送 192.168.1.25(网关)的 ip 数据包。
  • 带有 ip 源的数据包192.168.0.45到达 eth1(网络 192.168.0.0),带有 ip 目的地192.168.1.1。该数据包被内核接受,但内核不知道这个特定的网络(他知道192.168.1.24/30,其中不包含192.168.1.1),并根据路由表,通过eth0发送192.168.1.25(网关)ip 数据包。

答案3

路由数据包不依赖于它进入哪个接口(好吧,至少不使用正常的“非高级”路由)。该数据包可能是由主机上的进程生成的,在这种情况下,根本不会从网络接收到该数据包。只有充当路由器的主机才会转发数据包,即,如果传入数据包的目的地不是它们,则重新发送这些数据包。服务器和工作站通常禁用转发,在这种情况下,它们会丢弃不是发往它们的传入数据包。

无论数据包是本地生成的还是转发的,传出数据包的路由方式都是相同的:查阅路由表,并选择最佳路由(具有“最长前缀匹配”)。如果目的主机在直连网络上,则将数据包直接发送到目的主机,否则将数据包发送到本地网络上的路由器。该路由器的地址可在路由表匹配行的“网关”列中找到。

假设一个 IP 数据包到达 eth1。 IP源:192.168.1.1,IP目的地:199.178.167.431。由于该地址位于 eth1 的 Genmask 之外,因此 linux 将尝试通过默认网关发送它。

你的例子有点做作;在现实世界中,具有此源地址的数据包不会进入接口eth1,因为该地址属于连接到接口的网络eth0。如果发生这种情况,则说明某些配置严重错误。这也是数据包被丢弃的原因。

传入接口上的网络网络掩码(eth1在您的示例中)也不会影响数据包的路由方式,只有路由表在其中起作用。一般来说,在“经典”路由中,下一跳的选择始终基于向前展望,而不是基于数据包的过去历史记录(例如数据包进入哪个接口(如果有))。

相关内容