मैं कभी-कभी नल इंटरफेस के साथ मशीन पर आता हूं (उदाहरण के लिए, जब केवीएम चल रहा है)। मैं कैसे जान सकता हूं कि 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इसे नहीं दिखाता है। ध्यान रहे, ये tapOpenVPN द्वारा बनाए गए उपकरण हैं - हालांकि मुझे नहीं लगता कि इसमें अंतर क्यों होना चाहिए।
nmap, लेकिन मुझे यकीन नहीं है कि ईमानदार कैसे होना चाहिए।