Networking

如何知道一個程序是否附加到一個tap介面?

  • February 18, 2020

我有時會遇到帶有 Tap 介面的機器(例如,當 KVM 執行時)。如何知道 TAP 介面附加了哪個程序?

這讓我想知道,我查看了 Linux 核心原始碼(我假設你的問題是關於 Linux 的)。

看起來答案比你想像的要難。這個TUN/TAP API 教程頁面提供了一些見解。基本上,您的程序通過打開/dev/net/tun並發送TUNSETIFF ioctl. 如果一切順利,就會創建一個介面,核心給你它的名字和一個文件描述符,這就是你管理它的方式。

這裡有兩個問題:

  1. 核心不儲存發送 ioctl 的程序的 PID struct tun_struct(TUN 和 TAP 在很大程度上共享相同的資料結構)。
  2. 程序可以將介面標記為持久,關閉其文件描述符,然後將其用作普通網路介面。

在實踐中,我懷疑 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

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