मैं किसी एकल प्रक्रिया के नेटवर्क ट्रैफ़िक को कैसे पकड़ सकता हूं?


92

मैं एक एकल प्रक्रिया द्वारा नियंत्रित किए जा रहे नेटवर्क ट्रैफ़िक की जांच करना चाहूंगा, लेकिन सरल नेटवर्क कैप्चर काम नहीं करेगा क्योंकि मैं इस तरह के व्यस्त सिस्टम (एक ही समय में होने वाले अन्य ट्रैफ़िक के बहुत सारे) के साथ काम कर रहा हूं। क्या एक विशिष्ट प्रक्रिया के नेटवर्किंग ट्रैफ़िक को अलग करने tcpdumpया wiresharkकैप्चर करने का कोई तरीका है ? (प्रयोग netstatअपर्याप्त है।)

जवाबों:


21

वास्तव में एक तरीका है, Wireshark फ़िल्टर का उपयोग करना । लेकिन आप सीधे प्रक्रिया नाम या PID द्वारा फ़िल्टर नहीं कर सकते (क्योंकि वे नेटवर्क मात्रा नहीं हैं)।

आपको पहले प्रोटोकॉल और आपकी प्रक्रिया द्वारा उपयोग किए जाने वाले पोर्ट ( पिछली टिप्पणी में नेटस्टैट कमांड अच्छी तरह से काम करता है) का पता लगाना चाहिए ।

फिर आपके द्वारा अभी प्राप्त किए जाने वाले इनबाउंड (या आउटबाउंड) पोर्ट को फ़िल्टर करने के लिए विंडसर का उपयोग करें। यह आपकी प्रक्रिया के आने वाले और आने वाले यातायात को अलग करना चाहिए।


6
एक साधारण कनेक्शन के लिए, यह संभव है, लेकिन मुझे DNS, HTTP, इत्यादि को ट्रैक करने की आवश्यकता है, जो कि सभी जल्दी अतीत हैं, इसलिए netstatएक व्यस्त मशीन पर सिर्फ और केवल सरल नेटवर्क कैप्चर फ़िल्टर का उपयोग करने का एक सरल तरीका नहीं है ।
कीस कुक

ठीक है, HTTP और DNS सार्वजनिक पोर्ट का उपयोग बहुत सारे अनुप्रयोग द्वारा किया जाता है, लेकिन संबंधित निजी पोर्ट अद्वितीय है। तो आप निजी पोर्ट द्वारा फ़िल्टर करने का प्रयास क्यों नहीं करते हैं?
OpenNingia

क्योंकि तेजी से छोटे अनुरोधों को देखा नहीं जाएगा netstat; मैं केवल लंबे समय तक रहने वाले कनेक्शन ही पकड़ पाऊंगा। :(
कीस कुक 18

क्या होगा यदि प्रक्रिया रन समय में डायनेमिक पोर्ट का उपयोग करती है, तो आपका स्थैतिक पोर्ट फिल्टर का उपयोग करने में सक्षम नहीं होने जा रहा है
यूनिक्स जेनरेटर

मुझे लगता है कि आप यहां सबसे अच्छा जवाब दे रहे हैं ... अफसोस की बात है कि एक नेटवर्क सूँघने का उपकरण नेट स्टैक के निम्नतम स्तर पर काम करता है, सब कुछ पकड़ने की कोशिश कर रहा है, यह ओएस पर चलने वाली प्रक्रियाओं से पूरी तरह से अनजान है। यह पता लगाना बेहद मुश्किल होगा कि एक निश्चित कॉल की उत्पत्ति क्या है। एक पैकेट स्निफ़र अंततः (पोर्ट नंबर के माध्यम से) एक प्रोसेस आईडी का पता लगा सकता है, लेकिन यह पता नहीं लगा सकता है कि किस प्रक्रिया ने DNS लुकअप किया है क्योंकि यह पूरी तरह से स्वतंत्र है (यह संभवतः कर्नेल नेट स्टैक है जो कॉल को ट्रिगर करता है)। लेकिन अन्य प्रक्रियाओं को छानने और रोकने के साथ आपको अपने लक्ष्य को प्राप्त करने में सक्षम होना चाहिए।
Huygens

134

एक नई प्रक्रिया शुरू करने और उसकी निगरानी करने के लिए:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

एक ज्ञात PID के साथ मौजूदा प्रक्रिया की निगरानी करने के लिए:

strace -p $PID -f -e trace=network -s 10000
  • -f "नई प्रक्रियाओं का पालन करें" के लिए है
  • -e एक फिल्टर को परिभाषित करता है
  • -s स्ट्रिंग की सीमा को और अधिक करने के लिए तब 32 सेट करता है
  • -p संलग्न करने के लिए प्रक्रिया आईडी लेता है

2
यह उपयोगी है क्योंकि इसका उपयोग रूट एक्सेस या विशेष अनुमतियों के बिना किया जा सकता है (कुछ लिनक्स वितरण पर, वैसे भी - उबंटू पर आपको विशेष अनुमति की आवश्यकता हो सकती है)।
रॉबिन ग्रीन

1
यह भी उपयोगी है, क्योंकि यह पहले से लॉन्च की गई प्रक्रिया के खिलाफ चलाया जा सकता है और वस्तुतः किसी भी लिनक्स बॉक्स पर उपलब्ध है।
जक्कम

53

मुझे पता है कि यह धागा थोड़ा पुराना है, लेकिन मुझे लगता है कि इससे आपको कुछ मदद मिल सकती है:

यदि आपका कर्नेल इसे अनुमति देता है, तो एक एकल प्रक्रिया के नेटवर्क ट्रैफ़िक को कैप्चर करना एक अलग नेटवर्क नेमस्पेस में उक्त प्रक्रिया को चलाकर और वायरस्मार्क (या अन्य मानक नेटवर्किंग टूल्स) का उपयोग करके भी किया है।

सेटअप थोड़ा जटिल लग सकता है, लेकिन एक बार जब आप इसे समझ लेते हैं और इससे परिचित हो जाते हैं, तो यह आपके काम को बहुत आसान कर देगा।

तो ऐसा करने के लिए:

  • एक परीक्षण नेटवर्क नेमस्पेस बनाएं:

    ip netns add test
    
  • वर्चुअल नेटवर्क इंटरफेस (वीथ-ए और वीथ-बी) की एक जोड़ी बनाएं:

    ip link add veth-a type veth peer name veth-b
    
  • एक इंटरफ़ेस के सक्रिय नाम स्थान को बदलें:

    ip link set veth-a netns test
    
  • वर्चुअल इंटरफ़ेस के IP पते कॉन्फ़िगर करें:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • परीक्षण नामस्थान में रूटिंग कॉन्फ़िगर करें:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • ip_forward को सक्रिय करें और आपके द्वारा बनाए गए नेमस्पेस से आने वाले ट्रैफ़िक को आगे बढ़ाने के लिए NAT नियम स्थापित करें (आपको नेटवर्क इंटरफ़ेस और SNAT ip एड्रेस को एडजस्ट करना होगा):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (आप चाहें तो MASQUERADE नियम का उपयोग भी कर सकते हैं)

  • अंत में, आप उस प्रक्रिया को चला सकते हैं जिसे आप नए नामस्थान, और वायरशार्क में भी विश्लेषण करना चाहते हैं:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    आपको veth-a इंटरफ़ेस की निगरानी करनी होगी।


4
महान विचार है, लेकिन "सीमाओं" से सावधान रहें। चूंकि यह एक अलग नामस्थान है, आप लूपबैक पते (एसके) या यूनिक्स डोमेन सॉकेट्स का उपयोग करके डिफ़ॉल्ट नेमस्पेस में स्थानीय प्रक्रियाओं के साथ संवाद नहीं कर सकते हैं। उत्तरार्द्ध डी-बस पर संचार को प्रभावित करता है।
लेकेन्स्टाइन

@Lekensteyn आप अभी भी नेटवर्क नेमस्पेस afaik में यूनिक्स डोमेन सॉकेट का उपयोग कर सकते हैं। फ़ाइल सिस्टम उनके द्वारा पृथक नहीं है।
रैंडमनेल

1
@ वृंदेल मुझे उस पर और अधिक सटीक होना चाहिए। मेरे कहने का मतलब यह है कि यूनिक्स डोमेन सॉकेट "अमूर्त सॉकेट नेमस्पेस" (जो फाइल सिस्टम का उपयोग नहीं करता है) में सीधे नेटवर्क नेमस्पेस के बीच नहीं पहुँचा जा सकता है। वर्कअराउंड के रूप में, आप एक प्रॉक्सी का उपयोगsocat कर सकते हैं जैसे
लेकेनस्टेन

आप किस आईपी पते का उपयोग --to-sourceतर्क के साथ करते हैं iptables? क्या यह आपके द्वारा चुने गए इंटरफ़ेस -oका आईपी पता है, एक आईपी पता जिसे आप बनाते हैं, या ??? मैंने कहा कि संस्करण की कोशिश की जरूरत नहीं है --to-source, यहाँ वर्णित है , और कहा कि काम किया!
ntc2

3
यह सब रूट एक्सेस की आवश्यकता लगता है।
साधारण डमरू

15
netstat -taucp | grep <pid or process name>

यह दिखाएगा कि कनेक्शन एक अनुप्रयोग बना रहा है जिसमें पोर्ट का उपयोग किया जा रहा है।


8
यह उन कनेक्शनों को दिखाएगा जो उस पल के लिए मौजूद हैं, लेकिन यह ट्रैफ़िक का लॉग प्रदान नहीं करेगा।
कीस कुक

1
Kees Cook टिप्पणी के बारे में निश्चित नहीं है। एक साधारण नेटस्टैट एक पल के लिए कनेक्शन के बारे में जानकारी दिखाता है, लेकिन फ्लैग -c के साथ आपको हर सेकंड उस स्थिति का एक स्नैपशॉट मिलता है ('मैन नेटस्टैट' देखें)। हो सकता है कि इसमें सभी ट्रैफ़िक न हों, लेकिन कनेक्शन का एक अनूठा स्नैपशॉट नहीं है।
tremendows

3
खैर, मुझे यकीन है। यह एक प्रक्रिया के सभी नेटवर्क ट्रैफ़िक को कैप्चर नहीं करेगा ।
रीनियर पोस्ट

यह पता लगाने के लिए उपयोगी था कि आंतरिक फ़ायरवॉल द्वारा किस पोर्ट संख्या को अवरुद्ध किया जा रहा है। यह टीसीपी SYNs (गंतव्य पते और पोर्ट नंबर के साथ) दिखाया गया था जिसे मैं चला रहा था।
एंथोनी जोगेगन

11

बस एक विचार: क्या आपके आवेदन को एक अलग आईपी पते से बांधना संभव है? यदि ऐसा है, तो आप सामान्य संदिग्धों ( tcpdump , आदि) का उपयोग कर सकते हैं

उन अनुप्रयोगों के लिए उपकरण जो किसी अन्य IP पते के लिए बाध्य करने में सक्षम नहीं हैं:

http://freshmeat.net/projects/fixsrcip

fixsrcipआउटगोइंग टीसीपी और यूडीपी क्लाइंट सॉकेट ( IPv4 ) को विशिष्ट स्रोत आईपी पते के लिए एक उपकरण है जो मल्टी-होमडेड होस्ट्स पर आईपी पते

http://freshmeat.net/projects/force_bind

force_bindआपको एक विशिष्ट आईपी और / या पोर्ट पर बाध्यकारी बाध्य करने की अनुमति देता है। यह IPv4 और IPv6 दोनों के साथ काम करता है ।


अधिकांश एप्लिकेशन अपने स्रोत आईपी को निर्दिष्ट करने का समर्थन नहीं करते हैं, लेकिन यह वास्तव में CLONE_NEWNET के साथ एक कंटेनर का उपयोग करके संभव हो सकता है लेकिन CLONE_NEWNS नहीं।
कीस कुक

वैकल्पिक रूप से, आप एक नेटवर्क नेमस्पेस बना सकते हैं और इसके अंदर अपना ऐप चला सकते हैं www.evolware.org/?p=293
Flint

9

मैं एक ऐसे ही मुद्दे पर आया हूं और मैं ioerror के इस जवाब के आधार पर इसे छांटने में सक्षम था , जिसका वर्णन NFLOG द्वारा किया गया है :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

फिर आप एक उपयोगकर्ता खाते से प्रश्न में प्रक्रिया को बना सकते हैं जो कुछ और नहीं करता है - और वॉइला, आपने एक ही प्रक्रिया से बस अलग-थलग और कब्जा कर लिया ट्रैफ़िक है।

बस वापस मामले में पोस्ट करना चाहता था यह किसी को भी मदद करता है।


6

मैंने एक सी एप्लीकेशन लिखी है जो फलादहब के ऊपर दिए गए शानदार उत्तर में वर्णित है!

यहाँ देखें: nsntrace github repo


यह अच्छा है, लेकिन मुझे लगता है कि इसे प्राप्त करने और इसका उपयोग करने के लिए कुछ और विवरणों को शामिल करना अच्छा होगा :)
Zanna

धन्यवाद! मैंने जीथब रेपो को एक लिंक प्रदान किया जो एक README.md फ़ाइल रखता है जिसमें उपयोग और उदाहरण हैं, और निर्देश डाउनलोड करें!
जोनास डेनियलसन

5

यह एक गंदी हैक है, लेकिन मैं किसी डायवर्ट या किसी दिए गए UID के लिए iptables के साथ लॉग लक्ष्य का सुझाव दूंगा। उदाहरण के लिए:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

उस लॉग लक्ष्य के लिए '--log-tcp- अनुक्रम', '--log-tcp-options', '--log-ip-options', '--log-uid' जैसे कुछ देखने लायक हो सकते हैं। । हालांकि मुझे संदेह है कि आपको केवल एक पेज को पोस्ट करने में मदद मिलेगी जिसमें एक टन अन्य डेटा शामिल है।

यदि आप पैकेट को फ़्लैग करना चाहते हैं तो NFLOG टारगेट उपयोगी हो सकता है और फिर कुछ टैग किए गए पैकेटों को आपके चयन की प्रक्रिया के लिए एक नेटलिंक सॉकेट के ऊपर भेजा जाएगा। मुझे आश्चर्य है कि क्या वायरशर्क और आपके विशिष्ट उपयोगकर्ता के रूप में चल रहे एप्लिकेशन के साथ कुछ हैक करने के लिए यह उपयोगी होगा?


लेकिन यह केवल आउटगोइंग के लिए काम करता है, इनओमिंग के बारे में क्या?
परिणाम

5

आप ट्रैडंपंप की कोशिश कर सकते हैं - http://mutrics.iitis.pl/tracedump

यह वही करता है जो आप चाहते हैं, आप या तो इसे एक प्रक्रिया आईडी या चलाने के लिए एक कार्यक्रम दे सकते हैं।


1
अच्छी परियोजना है, लेकिन ... "ट्रेंडपम्प वर्तमान में 32-बिट लिनक्स होस्ट पर ही चलता है" यह मेरे लिए दुर्भाग्य से मारता है।
gertvdijk

4

उस प्रक्रिया को चलाने का प्रयास करें जिसमें आप स्ट्रेस के तहत रुचि रखते हैं :

strace ping www.askubuntu.com

यह आपको कुछ विस्तृत जानकारी देगा कि आपकी प्रक्रिया क्या कर रही है। एक प्रक्रिया के रूप में किसी भी बंदरगाहों को कहीं भी खोल सकता है, पूर्वनिर्धारित फ़िल्टर का उपयोग करके आप कुछ याद कर सकते हैं।

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


एक "-ई ट्रेस = नेटवर्क" में जोड़ने से कुछ आउटपुट का अनुमान लगाया जाता है, डेटा को खोने की कीमत पर जो वास्तव में नेटवर्क को लिखा जाता है। यदि आप केवल "खोले गए सॉकेट की संख्या" या इसी तरह की परवाह करते हैं, तो इससे चीजें आसान हो जाती हैं।
dannysauer

3

Ioerror द्वारा उत्तर पर निर्माण मुझे संदेह है कि आप iptables --uid-ownerट्रैफ़िक पर एक मार्कर सेट करने के लिए उपयोग कर सकते हैं , और फिर आप उस मार्कर के साथ केवल ट्रैफ़िक कैप्चर करने के लिए वायरशर्क पूछ सकते हैं। आप DSCP (अंतर सेवा मार्कर), प्रवाह आईडी या qos मार्कर का उपयोग करने में सक्षम हो सकते हैं।

या वास्तव में आप इसका उपयोग उन पैकेटों को एक अलग इंटरफ़ेस भेजने के लिए कर सकते हैं, और फिर उस इंटरफ़ेस पर ही कब्जा कर सकते हैं।



-1

शायद iptables और ulog काम कर सकते हैं? ऐसा नहीं है कि मेरे पास एक सटीक नुस्खा है, लेकिन मुझे लगता है कि iptables प्रक्रियाओं से मेल खा सकते हैं, एक बार मिलान करने पर आप ulog का उपयोग कर सकते हैं।


3
दुर्भाग्य से, iptables -m owner --pid-owner $PIDलिनक्स 2.6.14 में हटा दिया गया था: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Cook

-1

मुझे लगता है कि आप नेटस्टैट को निष्पादित करने और एक पाठ फ़ाइल में लॉग इन करने के माध्यम से लूप के लिए एक शेल स्क्रिप्ट बना सकते हैं। कुछ ऐसा (बहुत मोटा कदम):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

मैं एक प्रोग्रामर नहीं हूं, इसलिए मैं इसे परिष्कृत नहीं कर सकता। लेकिन यहां कोई व्यक्ति वहां से शुरू कर सकता है जहां से मैंने छोड़ा था और आपके लिए एक काम करने वाली स्क्रिप्ट तैयार कर रहा हूं।


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