如何捕获虚拟接口上的流量?

sol*_*ack 12 networking ip kernel tcp tcpdump

我想捕获 Linux 虚拟接口上的流量,用于调试目的。我一直在试验veth,tundummy接口类型;在所有三个方面,我都无法tcpdump展示任何东西。

这是我设置虚拟界面的方法:

ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up
Run Code Online (Sandbox Code Playgroud)

在一个终端中,使用以下命令观看tcpdump

tcpdump -i dummy10
Run Code Online (Sandbox Code Playgroud)

在一秒钟内,听听它nc

nc -l 99.99.99.1 2048
Run Code Online (Sandbox Code Playgroud)

第三步,使用以下命令发出 HTTP 请求curl

curl http://99.99.99.1:2048/
Run Code Online (Sandbox Code Playgroud)

尽管在终端 2 中我们可以看到来自curl请求的数据,但从tcpdump.

一个TUN / TAP教程澄清某些情况下,内核可能不会实际发送当一个本地接口上运行的任何数据包:

查看 tshark 的输出,我们看到......什么也没有。没有流量通过接口。这是正确的:由于我们正在 ping 接口的 IP 地址,操作系统正确地决定不需要“在线”发送数据包,并且内核本身正在回复这些 ping。如果您考虑一下,这正是您 ping 另一个接口的 IP 地址(例如 eth0)时会发生的情况:不会发送任何数据包。这听起来可能很明显,但起初可能会造成混乱(对我来说)。

然而,很难看出这如何适用于 TCP 数据包。

也许tcpdump应该以不同的方式绑定到界面?

phe*_*mer 8

流量正在通过lo接口。

当一个 IP 被添加到一个盒子时,该地址的路由被添加到“本地”表中。此表中的所有路由都通过环回接口路由流量。

您可以使用以下内容查看“本地”表的内容:

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

在我的系统上看起来像这样:

local 10.230.134.38 dev tun0  proto kernel  scope host  src 10.230.134.38 
broadcast 10.230.134.38 dev tun0  proto kernel  scope link  src 10.230.134.38 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 172.17.0.0 dev docker0  proto kernel  scope link  src 172.17.42.1 
local 172.17.42.1 dev docker0  proto kernel  scope host  src 172.17.42.1 
broadcast 172.17.255.255 dev docker0  proto kernel  scope link  src 172.17.42.1 
broadcast 192.168.0.0 dev enp6s0  proto kernel  scope link  src 192.168.0.20 
local 192.168.0.20 dev enp6s0  proto kernel  scope host  src 192.168.0.20 
broadcast 192.168.0.255 dev enp6s0  proto kernel  scope link  src 192.168.0.20 
Run Code Online (Sandbox Code Playgroud)

所以基本上,如果我将任何流量发送到10.230.134.38, 127.0.0.0/8, 127.0.0.1(redundant) , 172.17.42.1, or 192.168.0.20,流量将通过环回接口路由,即使这些 IP 确实在不同的接口上。