god*_*ing 6 linux network-interface
有一些奇怪的事情:
在我的虚拟机上?
centos7
接口?
enp0s3: 192.168.10.110/24
lo:0 10.0.3.110/24 (ip alias)
Run Code Online (Sandbox Code Playgroud)
路线?
default via 10.0.3.2 dev lo
192.168.10.0/24 dev enp0s3
enp0s3 is plugged in 10.0.3.0/24
Run Code Online (Sandbox Code Playgroud)
我启用了 ip_forward (net.ipv4.ip_forward = 1)
我的问题?
ping 10.0.3.2 有效?但为什么呢?
tcpdump无法获取数据包enp0s3?但确实获取数据包lo。
默认路由是lo; 为什么ping 10.0.3.2有效?为什么我收不到数据包enp0s3?
Joh*_*éen 16
环回接口是一个虚拟接口。环回接口的唯一目的是返回发送给它的数据包,即无论您发送给它什么,都会在该接口上收到。在环回接口上放置默认路由几乎没有意义,因为它可以将数据包发送到的唯一位置是从接口输出到输入环回的假想线路。没有什么可以改变环回接口的这种行为,这就是它的编码目的。
当您ping 10.0.3.2 时,回复不是来自某个外部设备,而是来自环回接口本身。当您在环回接口上添加地址时,例如
sudo ip addr add 10.0.3.1/24 dev lo
Run Code Online (Sandbox Code Playgroud)
10.0.3.0/24添加一个路由到。你可以看到这个
ip route show table local
Run Code Online (Sandbox Code Playgroud)
就像是
local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1
Run Code Online (Sandbox Code Playgroud)
应该出现。该路由表项告诉一个数据包发送到之间的任何地址10.0.3.1,并10.0.3.254通过发送lo接口,从它立即返回。
编辑:澄清作为对下面评论的回应。
当您 ping 10.0.3.2 时会发生以下情况:内核获得一个 IP 数据包,用于传送目标地址为 10.0.3.2。就像任何要传递的数据包一样,内核会查阅路由表。在这种情况下,匹配条目是这样的:local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1,它表示数据包应该通过lo源地址为 10.0.3.1的接口传送。
现在,由于数据包已提供给lo接口,因此环回接口会执行其通常的操作:它将数据包从发送队列中取出并将其放入接收队列中。从内核的角度来看,我们现在已经收到了一个传入的数据包,准备好由侦听套接字的服务器进程使用。(在 ping 的情况下,内核在内部处理它。)我们现在收到了一个目标地址为 10.0.3.2 的“远程”ICMP 数据包,它可以说不是我们的本地地址之一,但它被传递到环回界面不过如此。
接下来,内核向 ping 发送响应:一个 ICMP 响应数据包,地址颠倒:10.0.3.2 作为源地址,10.0.3.1 作为目标。这是通过环回接口传送回 ping 程序,这表明我们收到了来自 10.0.3.2 的回复。