विशिष्ट नेटवर्क इंटरफेस के लिए यूनिक्स यूनिक्स कार्यक्रम


40

प्रश्न: मैं यह सुनिश्चित करने के लिए एक कार्यक्रम कैसे शुरू करूं कि इसकी नेटवर्क एक्सेस एक विशिष्ट नेटवर्क इंटरफेस से बंधी है?

मामला: मैं एक ही आईपी (192.168.1.1) के साथ दो अलग-अलग मशीनों का उपयोग करना चाहता हूं, लेकिन दो अलग-अलग नेटवर्क इंटरफेस (eth1 और eth2) के माध्यम से सुलभ है।

उदाहरण:

net-bind -D eth1 -exec {Program 192.168.1.1}
net-bind -D eth2 -exec {Program 192.168.1.1}

ऊपर मैं क्या चाहूंगा, प्राइमरसून और ऑप्टिरुन के माध्यम से किए गए हार्डवेयर बाइंडिंग से प्रेरित है ।

चुनौती: जैसा कि संबंधित थ्रेड में सुझाया गया है , उपयोग किए गए इंटरफेस को प्रोग्राम द्वारा नहीं चुना जाता है, बल्कि कर्नेल द्वारा (इसलिए उपरोक्त उदाहरण में पूर्व-बाइंडिंग सिंटैक्स)।

मुझे कुछ संबंधित समाधान मिले हैं, जो असंतोषजनक हैं। वे उपयोगकर्ता-विशिष्ट नेटवर्क ब्लैकलिस्टिंग के माध्यम से बाइंडिंग नेटवर्क इंटरफेस पर आधारित हैं; यानी, एक उपयोगकर्ता के रूप में प्रक्रिया को चलाना जो केवल एक विशिष्ट नेटवर्क इंटरफेस तक पहुंच सकता है।


क्या आप यह अनुमान लगा रहे हैं कि आपकी मशीन 192.168.1.0 दोनों, दो अलग-अलग नेटवर्क से जुड़ी है? आपकी रूटिंग टेबल कैसी दिखती है? यदि आप एक प्रक्रिया से दिखाई देने वाले इंटरफेस को प्रतिबंधित करना चाहते हैं, तो सबसे हल्का समाधान cgroups, एक भारी कंटेनर होगा।
लार्जेट

हां, दो अलग-अलग नेटवर्क, दोनों एक ही आईपी रेंज पर। मैं निश्चित नहीं हूं कि मैं दृश्य इंटरफेस को प्रतिबंधित नहीं करना चाहता हूं, बस यह तय करना है कि कौन सा डिफ़ॉल्ट के रूप में उपयोग करना है? :)
स्कीन

3
आप जो पूछते हैं वह एक अच्छे कारण के लिए मुश्किल है: एक ही आईपी डोमेन का उपयोग करके दो नेटवर्क आपस में जुड़े हुए हैं जैसे एक इमारत में एक ही नंबर के साथ दो मंजिलों में एक लिफ्ट होना। IP रेंज वह है जो डोमेन की पहचान करती है आउटपुट आउटपुट नहीं। फिर भी iptables के साथ आपके त्रुटिपूर्ण नेटवर्क डिज़ाइन के आसपास काम करने का एक तरीका होना चाहिए।
लैगगॉर

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

1
NATs के बारे में मेरा तर्क यह था कि पूरे पते के स्थान आमतौर पर NAT के पीछे छिपे होते हैं, और जैसा कि मैं दो NAT'ted बुनियादी ढांचे को जोड़ रहा हूं टकराव होता है। - मैं बुनियादी ढांचे को संशोधित करने की किसी भी स्थिति में नहीं हूं। - मैंने नेटवर्क नेमस्पेस को वर्चुअल नेटवर्क इंटरफेस जोड़े (नेमस्पेस में एक, रूट नेमस्पेस में से एक) का उपयोग करके रूट नेमस्पेस को फिजिकल इंटरफ़ेस से जोड़ने और नेटवर्क नेमस्पेस के भीतर प्रोग्राम चलाने की कोशिश की। - यह काम करने लगता है, लेकिन मैं रूट नेमस्पेस (यानी मशीन के बाहर कोई एक्सेस नहीं) से आगे नहीं निकल पा रहा हूं।
स्कीन

जवाबों:


35

लिनक्स के लिए, यह पहले से ही सुपरयुसर पर उत्तर दिया गया है - विभिन्न प्रक्रियाओं के लिए विभिन्न नेटवर्क इंटरफेस का उपयोग कैसे करें?

सबसे लोकप्रिय उत्तर LD_PRELOADएक प्रोग्राम के लिए नेटवर्क बाइंडिंग को बदलने के लिए एक ट्रिक का उपयोग करता है , लेकिन आधुनिक कर्नेल एक अधिक लचीली सुविधा का समर्थन करते हैं जिसे 'नेटवर्क नेमस्पेस' कहा जाता है जो ipप्रोग्राम के माध्यम से उजागर होता है । यह उत्तर दिखाता है कि इसका उपयोग कैसे करना है। अपने स्वयं के प्रयोगों से मैंने निम्नलिखित (मूल के रूप में) किया है:

# Add a new namespace called test_ns
ip netns add test_ns

# Set test to use eth0, after this point eth0 is not usable by programs
# outside the namespace
ip link set eth0 netns test_ns

# Bring up eth0 inside test_ns
ip netns exec test_ns ip link set eth0 up

# Use dhcp to get an ipv4 address for eth0
ip netns exec test_ns dhclient eth0

# Ping google from inside the namespace
ip netns exec test_ns ping www.google.co.uk

यह भी संभव है कि नेटवर्क नेमस्पेस को कुछ हद तक कमांड unshareऔर nsenterकमांड के साथ प्रबंधित किया जाए । यह आपको PID, उपयोगकर्ताओं और माउंट बिंदुओं के लिए अलग-अलग स्थान बनाने की अनुमति देता है। कुछ और जानकारी के लिए देखें:


"इस बिंदु के बाद eth0 नेमस्पेस के बाहर कार्यक्रमों द्वारा उपयोग करने योग्य नहीं है" - इसलिए मैं ऐसा करने में अन्य सभी समस्याओं के लिए कनेक्शन नीचे खींच रहा हूं?
स्कीन

1
@ देखें, हाँ, तो संभवतः आप एक इंटरफ़ेस को धक्का देंगे जिसका कोई अन्य प्रोग्राम नामस्थान में उपयोग नहीं कर रहा है और सामान्य रूप से आपके मुख्य का उपयोग करता है।
ग्रीम

1
@Graerne; दोनों इंटरफेस सक्रिय रूप से उपयोग किए जा रहे हैं; मैं इंटरफेस को लेने का जोखिम नहीं उठा सकता।
स्कीन

और डिफ़ॉल्ट गेटवे के साथ क्या? wvdialउदाहरण के लिए इसे बिल्कुल सेट करने के लिए प्रतीत नहीं होता है ... इसलिए इसे स्वयं नामस्थान में परिभाषित किया जाना है
फ्लैश थंडर

क्या आप इसे पूर्ववत करने के निर्देश शामिल कर सकते हैं? क्या आप ip netns remove test_nsसामान्य स्थिति में वापस जाना चाहते हैं? या आपको कुछ खास करना है?
मल्टीहंटर

17

मैं ग्रीम का जवाब स्वीकार कर रहा हूं; यह केवल मेरे द्वारा अपने मुद्दे को हल करने के लिए उनके सुझाव के लिए किए गए परिवर्तनों की व्याख्या करने के लिए एक अनुवर्ती है।

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

# Create the eth0 network namespace
ip netns add eth0_ns

# Create the virtual network pair
ip link add v_eth0a type veth peer name v_eth0b

# Move v_eth0a to the eth0_ns namespace, the virtual pair is now split
# between two network namespaces.
ip link set v_eth0a netns eth0_ns

# Configure the ends of the virtual network pairs
ip netns exec eth0_ns ifconfig v_eth0a up {{NAMESPACE_IP}} netmask {{NAMESPACE_NETMASK}}
ifconfig v_eth0b up {{ROOT_NS_IP}} netmask {{ROOT_NS_NETMASK}}

# Setup routing from namespace to root
ip netns exec eth0_ns route add default gw {{ROOT_NS_IP}} dev v_eth0a

# Setup IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s {{ROUTE_SOURCE}}/24 -o {{NETWORK_INTERFACE}} -j SNAT --to-source {{ROUTE_TARGET}}

एक बार eth0 और eth1 के लिए इंटरफेस सेट किए जाने के बाद, उनके संबंधित नेमस्पेस eth0_ns और eth1_ns के साथ, प्रोग्राम निर्दिष्ट इंटरफ़ेस पर निष्पादित किए जा सकते हैं;

ip netns exec eth0_ns fish
ip netns exec eth1_ns fish

4
बहुत बढ़िया! मुझे लगता है कि आप एक पुल डिवाइस भी बना सकते हैं और डिफ़ॉल्ट नेमस्पेस और एक भौतिक उपकरणों के साथ आभासी जोड़ी को पाट सकते हैं। हालांकि यह बराबर दिखता है।
ग्रीम

1
मैंने वर्चुअल और फिजिकल डिवाइस को ब्रिज करने की कोशिश की; मैं उस समाधान का उपयोग करके बाहरी नेटवर्क तक पहुंचने में सक्षम नहीं था।
स्कीन

2
मैंने किया, लेकिन केवल नए नामस्थान से। मुझे लगता है कि जो समस्या मुझे हो रही थी वह नेटवर्क मैनेजर से संबंधित थी, मैंने इसका पता नहीं लगाया था या फिर मैंने अपना उत्तर अपडेट किया होगा।
ग्रीम

मेरे पास एक ही मुद्दा है, लेकिन मैं उस समाधान का उपयोग करने में विफल रहा। अंतिम चरण में मुझे {{ROUTE_SOURCE}} और {{ROUTE_TARGET}} में वास्तव में क्या दर्ज करना चाहिए?
litov

@Graeme, उबंटू मैं पर कम से कम जारी करके दोनों नाम स्थान के साथ-साथ वैश्विक नामस्थान में कनेक्टिविटी वापस पाने के लिए कर रहा था dhclient <bridge>प्रति यहाँ
क्रिस हंट

4

समाधान I: एक विशिष्ट पुस्तकालय को लोड करना

  • ऐप-रूट-जेल : इंटरफ़ेस गेटवे को मजबूर करने के लिए ld_preload का उपयोग करें (महान विचार लेकिन रूट या अंक क्षमताओं की आवश्यकता होती है) का उपयोग नोटों पर विस्तृत है

  • प्रॉक्सी : एक विशेष एप्लिकेशन के लिए प्रॉक्सी को बाध्य करने के लिए ld_preload का उपयोग करें (यह इंटरफ़ेस के बजाय प्रॉक्सी का उपयोग कर रहा है)

  • फोर्स-बिंद : सुविधाओं की एक बहुत कुछ है लेकिन बाइंड लीक (विश्वसनीय नहीं)

  • बाइंड-इंटरफ़ेस-आईपी : बहुत सरल और लीक कनेक्शन (विश्वसनीय नहीं)

  • Bind-IP : बहुत सरल और रिसाव कनेक्शन (विश्वसनीय नहीं)

समाधान II: लिनक्स उपयोक्ता

  • क्लासिक लिनक्स उपयोगकर्ता अंतरिक्ष आईपी-नेटन्स : महान समाधान लेकिन रूट और इंटरफ़ेस की आवश्यकता होती है केवल एक ही उपयोगकर्ता स्थान पर मौजूद हो सकता है

  • फायरजेल : फायरजेल एक एप्लिकेशन को एक विशिष्ट नेटवर्क का उपयोग करने के लिए मजबूर कर सकता है, लेकिन संगतता सीमित है (उदाहरण के लिए यह ट्यून इंटरफेस के साथ संगत नहीं है)। फायरजेल को रूट की आवश्यकता नहीं हैfirejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command

  • नेटजेल के साथ फायरजेल : फायरजेल एक एप्लिकेशन को एक विशिष्ट उपयोगकर्ता स्थान का उपयोग करने के लिए मजबूर कर सकता है जो अलग से बनाया गया था, यह हमें बिना रूट के नाम देता हैfirejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command

  • मस्कारे और पुल के साथ फायरजेल : फायरजेल एक एप्लिकेशन को iptables मस्कारा के साथ एक विशिष्ट इंटरफ़ेस का उपयोग करने के लिए मजबूर कर सकती है , यह बहुत अच्छा है और इसे रूट की आवश्यकता नहीं है लेकिन इसके लिए ip_forward की आवश्यकता होती है और सुरक्षा प्रभाव को प्रभावित कर सकता हैfirejail --net=br0 firefox

समाधान III: लिनक्स iptables

Iptables का उपयोग इस उद्देश्य के लिए किया जा सकता है, लेकिन इसके लिए ip_forward की आवश्यकता होती है और यदि यह सही ढंग से कॉन्फ़िगर नहीं किया गया है, तो सुरक्षा प्रभाव को प्रभावित कर सकता है, उदाहरण 1 , उदाहरण 2 , उदाहरण 3 , उदाहरण 4

समाधान (I, II और III) नोट:

Wireguard

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

इंटरफ़ेस गेटवे कैसे खोजें

गेटवे खोजने के लिए कई समाधान हैं यहां कुछ कमांड हैं जो उपयोग किए गए गेटवे को खोजने की अनुमति देते हैं

$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

ऐप-रूट-जेल का उपयोग कैसे करें

  • ऐप-रूट-जेल बनाएँ
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
  • भविष्य के चिह्नित पैकेट के लिए एक मार्ग जोड़ें (जेल आवेदन के लिए) इस उदाहरण 192.168.1.1में मजबूर गेटवे के रूप में उपयोग किया जाता है, यह मार्ग नियम अन्य अनुप्रयोगों को प्रभावित नहीं करेगा, इस हेरफेर को उदाहरण के लिए सिस्टम बूट पर केवल एक बार किया जाना चाहिए यदि आप चाहते हैं इस घोल को रोजाना इस्तेमाल करें
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • वह एप्लिकेशन प्रारंभ करें जिसे आप जेल करना चाहते हैं
MARK=10 LD_PRELOAD=./mark.so firefox
  • वान आईपी पते का परीक्षण
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.