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


12

我想捕获Linux虚拟接口上的流量,以进行调试。我一直在尝试vethtun而且dummy接口类型; 在这三个方面,我都很难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

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

查看tshark的输出,我们什么都没看到。没有流量通过该接口。这是正确的:由于我们要对接口的IP地址执行ping操作,因此操作系统正确地确定不需要“在线”发送任何数据包,并且内核本身正在答复这些ping操作。如果您考虑一下,这就是您对另一个接口的IP地址(例如eth0)执行ping操作时将发生的情况:不会发送任何数据包。这听起来似乎很明显,但一开始可能会引起混乱(对我而言)。

但是,很难看到这如何适用于TCP数据包。

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


不知道为什么很难看到TCP数据包发生了什么。像ping一样,它们在内核中处理。同样的事情正在发生。
derobert

@derobert对于ping,内核可以响应。对于数据包,我宁愿想象它们必须“通过”接口,以便应用程序可以响应它们。
solidsnack 2014年

1
应用程序使用读,写等与内核对话。许多网络应用程序甚至不必知道接口的存在。为了使流量通过其中之一,内核需要将其视为非本地流量。例如,设置一个OpenVPN隧道,然后您可以捕获通过tun0的流量。(当然,tun0是应用程序与内核对话,在用户区中实现网络接口的一种特殊方式,这是OpenVPN所做的。)
derobert 2014年

Answers:


8

流量通过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.38127.0.0.0/8127.0.0.1(冗余)172.17.42.1或者192.168.0.20,流量将被路由通过回环接口,即使这些IP地址是真正不同的接口上。



0

这可以通过调用第二个系统(甚至可以是该主机上的VM)来实现。

您可以DNATOUTGOING表链中使用nat并将数据包重定向到内核无法控制的接口。您必须在此处反映它们:

iptables -t nat -A OUTPUT -p tcp -d 99.99.99.1 --dport 2048 \
  -j DNAT --to-destination 1.2.3.4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.