我想捕获Linux虚拟接口上的流量,以进行调试。我一直在尝试veth
,tun
而且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
应该以不同的方式绑定到接口?
流量通过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地址是真正不同的接口上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句