Networking

如何擷取虛擬介面上的流量?

  • April 2, 2014

我想擷取 Linux 虛擬介面上的流量,以進行調試。我一直在試驗veth,tundummy介面類型;在這三個方面,我很難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 的輸出,我們看到……什麼都沒有。沒有流量通過介面。這是正確的:因為我們正在 ping 介面的 IP 地址,作業系統正確地確定不需要“線上”發送數據包,並且核心本身正在回复這些 ping。如果您考慮一下,如果您 p​​ing 另一個介面的 IP 地址(例如 eth0),就會發生這種情況:不會發送任何數據包。這聽起來很明顯,但起初可能會引起混淆(對我來說)。

但是,很難看出這如何適用於 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(redundant) , 172.17.42.1, 或192.168.0.20,流量將通過環回介面路由,即使這些 IP 確實位於不同的介面上。

引用自:https://unix.stackexchange.com/questions/122468