linux – loopback接口如何工作
作者:互联网
有奇怪的事情:
在我的虚拟机上:
centos7
接口:
enp0s3: 192.168.10.110/24<br>
lo:0 10.0.3.110/24<br>(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上获得包?
解决方法:
Loopback接口是一个虚拟接口.环回接口的唯一目的是返回发送给它的数据包,即在接口上接收发送给它的任何数据包.在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.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接口,所以loopback接口执行它通常所做的事情:它将数据包从发送队列中取出并将其放在接收队列中.从内核的角度来看,我们现在已经收到一个传入的数据包,可供服务器进程在套接字上侦听使用. (在ping的情况下,内核在内部处理它.)我们现在收到一个目标地址为10.0.3.2的“远程”ICMP数据包,它可能不是我们的本地地址之一,但它被传送到环回尽管如此.
接下来,内核向ping发送响应:ICMP响应数据包,地址反转:10.0.3.2作为源地址,10.0.3.1作为目标.这是通过loopback接口传回ping程序,这表明我们收到了10.0.3.2的回复.
标签:linux,network-interface 来源: https://codeday.me/bug/20190814/1651407.html