मैं कभी-कभी नल इंटरफेस के साथ मशीन पर आता हूं (उदाहरण के लिए, जब केवीएम चल रहा है)। मैं कैसे जान सकता हूं कि TAP इंटरफ़ेस किस प्रक्रिया से जुड़ा हुआ है?
मैं कभी-कभी नल इंटरफेस के साथ मशीन पर आता हूं (उदाहरण के लिए, जब केवीएम चल रहा है)। मैं कैसे जान सकता हूं कि TAP इंटरफ़ेस किस प्रक्रिया से जुड़ा हुआ है?
जवाबों:
यह मुझे आश्चर्यचकित कर गया और मैंने लिनक्स कर्नेल स्रोत पर एक नज़र डाली (मैं मान रहा हूं कि आपका सवाल लिनक्स के बारे में है)।
ऐसा प्रतीत होता है कि आपकी अपेक्षा से अधिक कठिन उत्तर है। यह TUN / TAP API ट्यूटोरियल पेज कुछ जानकारी प्रदान करता है । असल में, आपके प्रोग्राम को खोलने /dev/net/tun
और भेजने के द्वारा एक नया TUN / TAP डिवाइस आवंटित किया जाता है TUNSETIFF
ioctl
। यदि सब कुछ ठीक हो जाता है, तो एक इंटरफ़ेस बनाया जाता है, कर्नेल आपको अपना नाम और एक फाइल डिस्क्रिप्टर देता है, और यही आप इसे प्रबंधित करते हैं।
यहाँ दो कैच हैं:
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
% sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3'
4143
% pgrep qemu
4143
इस तथ्य को देखते हुए कि ps -ef
क्यूमू प्रक्रियाओं के आउटपुट में एक नाम पैरामीटर दिखाया गया है, उदाहरण के लिए qemu-system-x86_64 -enable-kvm -name debian-8
यह पता लगाना आसान होना चाहिए कि वीएम एक पीआईडी और एक इंटरफ़ेस से मेल खाती है।
FreeBSD या किसी अन्य BSD व्युत्पन्न पर:
ifconfig tap0
आपको यह दिखाना चाहिए कि इंटरफ़ेस किस प्रक्रिया से जुड़ा है:
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 58:9c:fc:10:8f:2b
groups: tap
media: Ethernet autoselect
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
Opened by PID 2672
ifconfig
इसे नहीं दिखाता है। ध्यान रहे, ये tap
OpenVPN द्वारा बनाए गए उपकरण हैं - हालांकि मुझे नहीं लगता कि इसमें अंतर क्यों होना चाहिए।
nmap
, लेकिन मुझे यकीन नहीं है कि ईमानदार कैसे होना चाहिए।