环回接口如何工作

环回接口如何工作

有一些奇怪的事情:

在我的虚拟机上:
centos7

接口:

enp0s3: 192.168.10.110/24
lo:0 10.0.3.110/24 (ip alias)

路线:

default via 10.0.3.2 dev lo
192.168.10.0/24 dev enp0s3

enp0s3 is plugged in 10.0.3.0/24

我已启用 ip_forward (net.ipv4.ip_forward = 1)


我的问题:

ping 10.0.3.2有效,但为什么呢?

tcpdump无法获取数据包enp0s3,但可以获取数据包lo

默认路由是lo;为什么ping 10.0.3.2有效?为什么我无法获取数据包enp0s3

答案1

Loopback接口是一个虚拟接口。环回接口的唯一目的是返回发送给它的数据包,即您发送给它的任何内容都会在该接口上接收。在环回接口上放置默认路由没有什么意义,因为它可以将数据包发送到的唯一位置是从接口输出到输入循环的假想线路。没有什么可以改变环回接口的这种行为,这就是它被编码的目的。

当您 ping 10.0.3.2 时,回复不是来自某个外部设备,而是来自环回接口本身。当您使用例如在环回接口上添加地址时

sudo ip addr add 10.0.3.1/24 dev lo

10.0.3.0/24添加到的路线。你可以看到这个

ip route show table local

就像是

local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1

应该出现。该路由表条目表明发送到 和 之间任何地址的数据包是通过接口发送的,10.0.3.1并立即从该接口返回。10.0.3.254lo

编辑:澄清作为对下面评论的回应。

当您 ping 10.0.3.2 时,会发生以下情况:内核收到一个目标地址为 10.0.3.2 的 IP 数据包进行传送。就像任何要传递的数据包一样,内核会查阅路由表。在这种情况下,匹配条目是这样的: ,它表示数据包应通过源地址为 10.0.3.1 的接口local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1传送。lo

现在,由于数据包已发送至lo接口,环回接口将执行其通常执行的操作:将数据包从发送队列中取出并将其放入接收队列中。从内核的角度来看,我们现在已经收到了一个传入数据包,可供侦听套接字的服务器进程使用。 (在 ping 的情况下,内核在内部处理它。)我们现在收到了一个目标地址为 10.0.3.2 的“远程”ICMP 数据包,这可以说不是我们的本地地址之一,但它被传递到环回尽管如此接口。

接下来,内核发送对 ping 的响应:一个地址相反的 ICMP 响应数据包:10.0.3.2 作为源地址,10.0.3.1 作为目标地址。这是通过环回接口传递回 ping 程序,这表明我们收到了来自 10.0.3.2 的回复。

答案2

回答您的另一个问题“为什么我无法在 enp0s3 上获取数据包?”

它指向 LAN 192.168.10.0/24

因此,除非您在 LAN 上有一台服务器来响应包裹投递请求,否则您将通过该路线得到无用的信息。

相关内容