कैसे पता चलेगा कि कोई प्रक्रिया टैप इंटरफ़ेस से जुड़ी है?


9

मैं कभी-कभी नल इंटरफेस के साथ मशीन पर आता हूं (उदाहरण के लिए, जब केवीएम चल रहा है)। मैं कैसे जान सकता हूं कि TAP इंटरफ़ेस किस प्रक्रिया से जुड़ा हुआ है?


मुझे संदेह है कि आप ऐसा कर सकते हैं nmap, लेकिन मुझे यकीन नहीं है कि ईमानदार कैसे होना चाहिए।
एलेक्स चेम्बरलेन

जवाबों:


2

यह मुझे आश्चर्यचकित कर गया और मैंने लिनक्स कर्नेल स्रोत पर एक नज़र डाली (मैं मान रहा हूं कि आपका सवाल लिनक्स के बारे में है)।

ऐसा प्रतीत होता है कि आपकी अपेक्षा से अधिक कठिन उत्तर है। यह TUN / TAP API ट्यूटोरियल पेज कुछ जानकारी प्रदान करता है । असल में, आपके प्रोग्राम को खोलने /dev/net/tunऔर भेजने के द्वारा एक नया TUN / TAP डिवाइस आवंटित किया जाता है TUNSETIFF ioctl। यदि सब कुछ ठीक हो जाता है, तो एक इंटरफ़ेस बनाया जाता है, कर्नेल आपको अपना नाम और एक फाइल डिस्क्रिप्टर देता है, और यही आप इसे प्रबंधित करते हैं।

यहाँ दो कैच हैं:

  1. कर्नेल उस प्रक्रिया की PID को संग्रहीत नहीं करता है जो ioctl को 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 के साथ ऐसा नहीं करना था, हालांकि।


ठीक है। मुझे यह भी संदेह था कि "मल्टीप्लेक्सिंग" / डेव / नेट / ट्यून हमें यह जानने के लिए रोक देगा कि टैप इंटरफ़ेस वास्तव में एक प्रक्रिया भी जुड़ी हुई है।
user368507

5

प्रत्येक फ़ाइल डिस्क्रिप्टर में / 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यह पता लगाना आसान होना चाहिए कि वीएम एक पीआईडी ​​और एक इंटरफ़ेस से मेल खाती है।
दिमित्री एस

1

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 द्वारा बनाए गए उपकरण हैं - हालांकि मुझे नहीं लगता कि इसमें अंतर क्यों होना चाहिए।
एलेक्सिस

यह FreeBSD या किसी अन्य BSD व्युत्पन्न के बारे में है।
kworr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.