Networking
如何擷取虛擬介面上的流量?
我想擷取 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 的輸出,我們看到……什麼都沒有。沒有流量通過介面。這是正確的:因為我們正在 ping 介面的 IP 地址,作業系統正確地確定不需要“線上”發送數據包,並且核心本身正在回复這些 ping。如果您考慮一下,如果您 ping 另一個介面的 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 確實位於不同的介面上。