Networking
如何知道一個程序是否附加到一個tap介面?
我有時會遇到帶有 Tap 介面的機器(例如,當 KVM 執行時)。如何知道 TAP 介面附加了哪個程序?
這讓我想知道,我查看了 Linux 核心原始碼(我假設你的問題是關於 Linux 的)。
看起來答案比你想像的要難。這個TUN/TAP API 教程頁面提供了一些見解。基本上,您的程序通過打開
/dev/net/tun
並發送TUNSETIFF
ioctl
. 如果一切順利,就會創建一個介面,核心給你它的名字和一個文件描述符,這就是你管理它的方式。這裡有兩個問題:
- 核心不儲存發送 ioctl 的程序的 PID
struct tun_struct
(TUN 和 TAP 在很大程度上共享相同的資料結構)。- 程序可以將介面標記為持久,關閉其文件描述符,然後將其用作普通網路介面。
在實踐中,我懷疑 2 不會發生太多。檢查一個
openvpn
程序lsof
顯示它仍然打開了 TAP 設備的文件描述符並顯然正在使用它,但由於它/dev/net/tun
是一種多路復用設備/dev/ptmx
,因此您可以使用它lsof
來找出目前正在使用 TUN/TAP 設備的程序,但是你不知道什麼程序正在使用什麼設備。有一些間接的方法可以解決根本問題。對於 OpenVPN,我使用了一個隧道設置腳本,該腳本將
tunX
/tapX
設備命名為更具描述性的名稱,其中包括 OpenVPN 配置文件的基本名稱。因此,/etc/openvpn/foo.conf
導致vpn-foo
設備。然後我可以將 OpenvVPN 程序與它使用的介面相關聯。不過,還沒有必要用 QEmu/KVM 來做這件事。
每個文件描述符都有一個 /proc/ pid /fdinfo/ num條目,例如:
# cat /proc/24332/fdinfo/28 pos: 0 flags: 0104002 mnt_id: 18 iff: tap0123acdc-66
因此,使用介面名稱,您可以通過以下方式獲取 pid:
# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3 24332