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
, eth1
。eth2
因此,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/16
toeth3
和10.1.2.0/24
to 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
在您的示例中)也不会影响数据包的路由方式,只有路由表在其中起作用。一般来说,在“经典”路由中,下一跳的选择始终基于向前展望,而不是基于数据包的过去历史记录(例如数据包进入哪个接口(如果有))。