环回设备是如何实现的?

Sky*_*ede 9 kernel networking routing interface

环回网络接口

是一种完全用软件实现的虚拟网络设备。

但是这个实现实际上是如何完成的,你如何操作它呢?

据我所知,IP在本地路由表中被标记为本地:

ip route show table local  
Run Code Online (Sandbox Code Playgroud)

发送到标记为本地的 IP 将触发环回设备。 但是这种检测是完全由路由表完成的还是由其他一些内核操作完成的?

编辑:我的最终目标是操纵循环设备配置,以便在我的笔记本电脑上的接口(两个 wlan 适配器)之间发送数据报将导致网络中的真实流量/数据报,而不是本地循环。接口 1 -> WLAN -> 接口 2 而不是:接口 1 -> LOOP -> 接口 2

小智 7

它完全通过路由表处理。

如果您想玩得开心,在虚拟机中试用非常容易。对于您尝试此操作的机器上可能发生的任何事情,我概不负责。

首先让我们将网络掩码更改lo为 255.255.0.0:

sudo ip addr del 127.0.0.1/8 dev lo; sudo ip addr add 127.0.0.1/16 dev lo
Run Code Online (Sandbox Code Playgroud)

现在让我们看看我们的lo

$ ip -4 addr show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    inet 127.0.0.1/16 scope host lo
Run Code Online (Sandbox Code Playgroud)

到 127.1.1.1 的数据包会去哪里?

$ sudo ip route get 127.1.1.1
127.1.1.1 via 172.16.22.2 dev eth0  src 172.16.22.130 
    cache  mtu 1500 advmss 1460 hoplimit 64
Run Code Online (Sandbox Code Playgroud)

我们开始在另一个终端上 ping:

$ ping 127.1.1.1
Run Code Online (Sandbox Code Playgroud)

让我们监控 eth0 上的 ICMP 流量:

$ sudo tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
07:28:42.060077 IP 172.16.22.130 > 127.1.1.1: ICMP echo request, id 5665, seq 4, length 64
07:28:43.059920 IP 172.16.22.130 > 127.1.1.1: ICMP echo request, id 5665, seq 5, length 64
Run Code Online (Sandbox Code Playgroud)

我将留给您练习lo将远程机器上的网络掩码更改为 255.255.0.0 并将 IP 地址 127.1.1.1 添加到他们的网络接口。您可以看到返回的 ICMP 回复。请注意,路由器可能无法正常运行。