वर्चुअल इंटरफेस पर ट्रैफ़िक कैसे कैप्चर करता है?


12

मैं डिबगिंग उद्देश्यों के लिए लिनक्स वर्चुअल इंटरफेस पर ट्रैफ़िक कैप्चर करना चाहूंगा। मैं के साथ प्रयोग कर रहा है veth, tunऔर dummyइंटरफ़ेस प्रकार; तीनों पर, मुझे tcpdumpकुछ भी दिखाने के लिए परेशानी हो रही है।

यहां बताया गया है कि मैंने डमी इंटरफ़ेस कैसे सेट किया है:

ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up

एक टर्मिनल में, इसे देखें tcpdump:

tcpdump -i dummy10

एक दूसरे में, इस पर सुनो nc:

nc -l 99.99.99.1 2048

एक तिहाई में, इसके साथ एक HTTP अनुरोध करें curl:

curl http://99.99.99.1:2048/

यद्यपि टर्मिनल 2 में हम curlअनुरोध से डेटा देख सकते हैं , कुछ भी नहीं दिखाता है tcpdump

एक ट्यून / टैप ट्यूटोरियल कुछ स्थितियों को स्पष्ट करता है जहां कर्नेल वास्तव में कोई पैकेट नहीं भेज सकता है जब कोई स्थानीय इंटरफ़ेस पर काम कर रहा हो:

Tshark के उत्पादन को देखते हुए, हम देखते हैं ... कुछ भी नहीं। इंटरफ़ेस के माध्यम से जाने वाला कोई ट्रैफ़िक नहीं है। यह सही है: चूंकि हम इंटरफ़ेस के आईपी पते को पिंग कर रहे हैं, ऑपरेटिंग सिस्टम सही ढंग से तय करता है कि किसी भी पैकेट को "तार पर" भेजने की आवश्यकता नहीं है, और कर्नेल खुद इन पिंग्स का जवाब दे रहा है। यदि आप इसके बारे में सोचते हैं, तो ठीक यही होगा कि यदि आप किसी अन्य इंटरफ़ेस के आईपी पते (उदाहरण के लिए eth0) को पिंग करते हैं: तो कोई पैकेट बाहर नहीं भेजा जाएगा। यह स्पष्ट लग सकता है, लेकिन पहले यह भ्रम का स्रोत हो सकता है (यह मेरे लिए था)।

हालांकि, यह देखना मुश्किल है कि यह टीसीपी डेटा पैकेट पर कैसे लागू हो सकता है।

शायद tcpdumpइंटरफ़ेस के लिए एक अलग तरीके से बाध्य होना चाहिए?


यह निश्चित नहीं है कि टीसीपी पैकेट के लिए यह देखना मुश्किल क्यों है। पिंग की तरह, जिन्हें कर्नेल में संसाधित किया जाता है। एक ही बात हो रही है।
व्युत्पन्न

@derobert पिंग के मामले में, कर्नेल जवाब दे सकता है। डेटा पैकेट के मामले में, मैंने सोचा था कि उन्हें इंटरफ़ेस को "ओवर" करना होगा ताकि एप्लिकेशन उन्हें जवाब दे सके।
सोलिडसनैक

1
एप्लिकेशन पढ़ने, लिखने आदि का उपयोग करके कर्नेल से बात करते हैं, कई नेटवर्क ऐप्स को यह भी पता नहीं होना चाहिए कि इंटरफेस मौजूद हैं। उनमें से किसी एक पर जाने के लिए ट्रैफ़िक प्राप्त करने के लिए, कर्नेल को गैर-स्थानीय के रूप में देखना होगा। उदाहरण के लिए, एक OpenVPN सुरंग स्थापित करें, फिर आप tun0 पर जाने वाले ट्रैफ़िक को पकड़ सकते हैं। (बेशक, tun0 क्षुधा, गिरी से बात करने userland में एक नेटवर्क इंटरफेस है, जो है क्या OpenVPN करता है को लागू करने के लिए एक विशेष तरीका है।)
derobert

जवाबों:


8

loइंटरफ़ेस पर ट्रैफ़िक जा रहा है।

जब एक बॉक्स में एक आईपी जोड़ा जाता है, तो उस पते के लिए एक मार्ग 'स्थानीय' तालिका में जोड़ा जाता है। इस तालिका के सभी मार्ग ट्रैफ़िक लूपबैक इंटरफ़ेस पर हैं।

आप निम्न के साथ 'स्थानीय' तालिका की सामग्री देख सकते हैं:

ip route show table local

जो मेरे सिस्टम पर इस तरह दिखता है:

local 10.230.134.38 dev tun0  proto kernel  scope host  src 10.230.134.38 
broadcast 10.230.134.38 dev tun0  proto kernel  scope link  src 10.230.134.38 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 172.17.0.0 dev docker0  proto kernel  scope link  src 172.17.42.1 
local 172.17.42.1 dev docker0  proto kernel  scope host  src 172.17.42.1 
broadcast 172.17.255.255 dev docker0  proto kernel  scope link  src 172.17.42.1 
broadcast 192.168.0.0 dev enp6s0  proto kernel  scope link  src 192.168.0.20 
local 192.168.0.20 dev enp6s0  proto kernel  scope host  src 192.168.0.20 
broadcast 192.168.0.255 dev enp6s0  proto kernel  scope link  src 192.168.0.20 

तो बुनियादी तौर पर अगर मैं के लिए किसी भी यातायात भेजने 10.230.134.38, 127.0.0.0/8, 127.0.0.1(अनावश्यक) , 172.17.42.1या 192.168.0.20, यातायात लूपबैक इंटरफ़ेस पर कराई जाएगी, भले ही उन IP एक अलग इंटरफेस पर वास्तव में कर रहे हैं।



0

यह दूसरी प्रणाली को लागू करके संभव हो सकता है (उस मेजबान पर एक वीएम भी हो सकता है)।

आप तालिका DNATकी OUTGOINGश्रृंखला में उपयोग कर सकते हैं natऔर पैकेट को एक इंटरफ़ेस पर पुनर्निर्देशित कर सकते हैं जिसे कर्नेल नियंत्रित नहीं करता है। आपको उन्हें वहां प्रतिबिंबित करना होगा:

iptables -t nat -A OUTPUT -p tcp -d 99.99.99.1 --dport 2048 \
  -j DNAT --to-destination 1.2.3.4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.