लिनक्स पर एक बच्चे की प्रक्रिया "ऑफ़लाइन" (कोई बाहरी नेटवर्क) चलाने की आज्ञा


15

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

लेकिन रिमोट मशीन से कनेक्ट करने का प्रयास विफल होना चाहिए।

मैं एक उपयोगिता है जो strace/ unshare/ की तरह काम करता है sudoऔर बस इंटरनेट के साथ एक कमांड चलाता है (और LAN) छुपा है और बाकी सब काम कर रहा है:

$ offline my-program-to-test

इस प्रश्न के उत्तर में संकेत हैं: किसी प्रक्रिया का नेटवर्क एक्सेस?

वहाँ कुछ सुझाव हैं, जैसे कि किसी अन्य उपयोगकर्ता के रूप में चलाएं, फिर iptables में हेरफेर करें, या unshare -n। लेकिन दोनों ही मामलों में मुझे पता नहीं है कि यूनिक्स डोमेन सॉकेट और लूपबैक प्राप्त करने के लिए मुख्य प्रणाली के साथ साझा किया जा रहा है - उस प्रश्न के उत्तर केवल मुझे बताएंगे कि पूरे नेटवर्क को कैसे अनसुना किया जाए ।

मैं जिस प्रोग्राम का परीक्षण कर रहा हूं उसे अभी भी मेरे एक्स सर्वर और डब से कनेक्ट करने की आवश्यकता है और यहां तक ​​कि सिस्टम के अन्य ऐप से कनेक्शन के लिए लूपबैक पर सुनने में सक्षम हो।

आदर्श रूप से मैं chroots या उपयोगकर्ताओं या VMs या पसंद को बनाने से बचना चाहूंगा, क्योंकि यह नेटवर्क केबल को अनप्लग करने जैसा ही कष्टप्रद है। यानी सवाल का मुद्दा यह है कि मैं इसे सरल कैसे बना सकता हूं sudo

मैं सामान्य रूप से 100% चलाने की प्रक्रिया को पसंद करूंगा, सिवाय इसके कि नेटवर्क कॉल एक गैर-स्थानीय पते को निर्दिष्ट करने में विफल होगा। आदर्श रूप से एक ही यूडी, एक ही होमडियर, एक ही pwd, एक ही सब कुछ छोड़कर ... ऑफ़लाइन।

मैं फेडोरा 18 का उपयोग कर रहा हूं, इसलिए अस्थिर लिनक्स उत्तर ठीक हैं (उम्मीद है, यहां तक ​​कि)।

मैं सी प्रोग्राम लिखकर इसे हल करने में बहुत खुश हूं, अगर वह इसमें शामिल है, तो जवाब है कि सी लिखना ठीक है। मुझे नहीं पता है कि स्थानीय नेटवर्क को रखते हुए बाह्य नेटवर्क पहुंच को रद्द करने के लिए सी प्रोग्राम को क्या सीक्लास की आवश्यकता होगी।

"ऑफ़लाइन मोड" का समर्थन करने का प्रयास करने वाला कोई भी डेवलपर शायद इस उपयोगिता की सराहना करेगा!

जवाबों:


9

पारंपरिक उत्तर प्रोग्राम को किसी अन्य उपयोगकर्ता के रूप में चलाना और उपयोग करना है iptables -m owner। इस तरह, नेटवर्क कॉन्फ़िगरेशन साझा किया जाता है। हालांकि, नामस्थानों के आगमन के साथ, एक आसान तरीका है।

नेमस्पेस के साथ, आप नेटवर्क को अनशेयर करते हैं, फिर सीमित नेटवर्क एक्सेस की आवश्यकता होने पर वर्चुअल नेटवर्क लिंक बनाते हैं।

यूनिक्स डोमेन सॉकेट्स को साझा करने के लिए, आपको 2010 के पैच के बाद, हाल ही में पर्याप्त कर्नेल होना आवश्यक है, इसलिए 2.6.36 या इसके बाद के संस्करण (जो कि RHEL / CentOS को छोड़कर लेखन के समय सभी मौजूदा वितरण पर मामला है)।

कार्यक्रम को अपने आईपी नामस्थान में चलाएं। प्रोग्राम शुरू करने से पहले, एक वर्चुअल ईथरनेट इंटरफेस स्थापित करें। वहाँ बहुत प्रलेखन नहीं लगता है; मैंने कुछ ब्लॉगों में सही झुकाव पाया:

नीचे दिए गए स्निपेट में, मैं प्रतिबंधित रैम्पस्पेस में चल रही प्रक्रिया से नेटवर्क लिंक के मेजबान पक्ष को लाने के लिए मैन पेज में सूचीबद्ध इस रैपरns_exec का उपयोग करता हूं । आपको वास्तव में इसकी आवश्यकता नहीं है: आप प्रतिबंधित नाम स्थान के बाहर से लिंक का होस्ट पक्ष सेट कर सकते हैं। इसे अंदर से करने से केवल प्रवाह नियंत्रण की सुविधा होती है, अन्यथा लिंक स्थापित करने के बाद आपको अपने प्रोग्राम शुरू करने से पहले कुछ सिंक्रनाइज़ेशन की आवश्यकता होती है।setns

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "$@"
' /path/to/program --argument

आपको यह सब जड़ के रूप में करने की आवश्यकता है। कर्नेल 3.8 में उपयोगकर्ता नामस्थानों की शुरूआत नेटवर्क लिंक के वैश्विक सिरे को स्थापित करने के अलावा कोई विशेष अनुमति नहीं है।

मुझे नहीं पता कि दो नामस्थानों के बीच लोकलहोस्ट को कैसे साझा किया जाए। वर्चुअल ईथरनेट इंटरफेस एक बिंदु-से-बिंदु पुल बनाते हैं। आप यदि वांछित है iptables/ से यातायात को पुनर्निर्देशित करने के लिए अग्रेषण नियमों का उपयोग कर सकते हैं lo


अच्छी अतिरिक्त जानकारी, धन्यवाद। मुझे लगता है कि वीथ मुझे नेमस्पेस से "बाहर" का लिंक देता है, लेकिन मेरा नया नेमस्पेस अभी भी एक अलग नेटवर्क नोड के बराबर है, बजाय एक ही नेटवर्क नोड के जो गैर-स्थानीय इंटरफेस को घटाता है। निहितार्थ (?) हैं: यूनिक्स डोमेन / अमूर्त सॉकेट्स अभी भी विफल रहेंगे, और लूपबैक को iptables के माध्यम से आगे बढ़ाया जा सकता है, लेकिन अग्रेषण साझाकरण को प्राप्त नहीं करता है - अर्थात, मूल और प्रतिबंधित नाम स्थान दोनों लूपबैक पर सुन सकते हैं और दोनों सेट (गतिशील रूप से) (परिवर्तित) बंदरगाहों को दोनों नामस्थानों में दिखाई देने की आवश्यकता होगी ... यह अनुमान लगाने के लिए कि मैं जो चाहता हूं वह यहां असंभव है: - /
हैवॉक पी

1

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

https://github.com/quitesimpleorg/qsni


0

/ !! \ यह शायद एक वैध जवाब नहीं है क्योंकि यह आपके सभी ट्रैफ़िक को आपके साथ ले जाएगा, न कि केवल एक पिड का ट्रैफ़िक।

मैंने इसका उपयोग नहीं किया है, लेकिन मुझे लगता है कि आप संभवतः Comcast का उपयोग कर सकते हैं:

https://github.com/tylertreat/Comcast

100% पैकेट नुकसान के लिए सेट

फिर, मैंने यह परीक्षण नहीं किया है, लेकिन सैद्धांतिक रूप से, उनके रीडमी से संशोधित आप कर सकते हैं:


लिनक्स

लिनक्स पर, आप iptablesइनकमिंग और आउटगोइंग पैकेट को छोड़ने के लिए उपयोग कर सकते हैं ।

$ iptables -A INPUT -m statistic --mode random --probability 1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 1 -j DROP

वैकल्पिक रूप से, आप उपयोग कर सकते हैं tcजो कुछ अतिरिक्त विकल्पों का समर्थन करता है।

$ tc qdisc change dev eth0 root netem reorder 0 duplicate 0 corrupt 1

दुबारा सेट करने के लिए:

$ tc qdisc del dev eth0 root netem
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.