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

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

我想捕获 Linux 虚拟接口上的流量,以进行调试。我一直在尝试vethtundummy接口类型;在这三个方面,我很难tcpdump展示任何东西。

以下是我设置虚拟接口的方法:

ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up

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

tcpdump -i dummy10

稍后,用以下命令收听nc

nc -l 99.99.99.1 2048

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

curl http://99.99.99.1:2048/

尽管在终端 2 中我们可以看到请求中的数据curl,但 中没有显示任何内容tcpdump

ATun/Tap 教程澄清了当在本地接口上操作时内核实际上可能不发送任何数据包的一些情况:

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

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

也许tcpdump应该以不同的方式绑定到接口?

答案1

流量通过接口进行lo

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

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

ip route show table local

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

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 

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

答案2

您可以tcpdump与主机上的任何接口一起使用 ( tcpdump -i any ...)

答案3

使用命名空间。 (IMO,命名空间是 ip 命令真正带来的最好的东西。)

例如,我在我的设备上设置了一个客户端-服务器系统:

ip netns add client-ns
ip l add server type veth peer name client netns client-ns
ip l set server up
ip netns exec client-ns ip l set client up
ip netns exec client-ns ping <IPv6 Address of Server>

Ofc为了与IPv4通信,需要添加IPv4地址:

ip a add 10.0.0.1/24 dev server
ip netns exec client-ns ip a add 10.0.0.2/24 dev client

相关内容