विभिन्न प्रक्रियाओं के लिए विभिन्न नेटवर्क इंटरफेस का उपयोग कैसे करें?


59

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

कार्यक्रम (ट्विंकल सॉफ्टफ़ोन) में एक समान विकल्प नहीं है, इसलिए मेरा मानना ​​है कि इसे बाहरी रूप से सेट किया जाना चाहिए।

मैं यह कैसे कर सकता हूं?

संपादित करें: मैं एक सर्वर प्रक्रिया को एक विशिष्ट इंटरफ़ेस से बांधने की कोशिश नहीं कर रहा हूं, बल्कि एक क्लाइंट प्रोग्राम को एक विशिष्ट इंटरफ़ेस का उपयोग करके सर्वर से संपर्क करने के लिए कर रहा हूं।


ग्राहक बाइंड / कनेक्ट का उपयोग करते हैं, एक दिए गए आईपी को ircII (एक irc- क्लाइंट प्रोग्रामम) को बाध्य करने के bind.c.txt दस्तावेज को देखें: 'ircII के लिए अपने आउटगोइंग सॉर्सकेड्रेस के रूप में अपने वर्चुअल आईपी का उपयोग करने के लिए bash में उदाहरण: BIND_ADDR = "your-virt-ip" LD_PRELOAD =। / Bind.so ircII '
अकीरा

मुझे यहां एक अलग दृष्टिकोण मिला, मुझे आशा है कि यह मददगार है (मुझे उम्मीद है कि वर्णित कर्नेल नीति रूटिंग आजकल डिफ़ॉल्ट रूप से सक्षम है): kindlund.wordpress.com/2007/11/19/…
Savvas Radevic

जवाबों:


48

आप के उपयोग के द्वारा कार्यावधि में कोड की जगह ले सकता LD_PRELOAD (@windows आप एक ऐसी ही तकनीक कहा जाता है का उपयोग कर सकते detours , काफी कल्पना)। डायनेमिक लिंकर को सूचित करने के लिए यह करना होगा कि आप जिस प्रक्रिया को चलाना चाहते हैं, उसमें पहले सभी कामों को लोड करें और फिर उसमें कुछ और जोड़ दें। आप सामान्य रूप से इसे इस तरह उपयोग करते हैं:

% LD_PRELOAD=./mylib.so ls

और इसके द्वारा आप जो करते हैं उसे बदल देते हैं ls

आपकी समस्या के लिए मैं कोशिश करूँगा http://www.ryde.net/code/bind.c.txt , जिसे आप उपयोग कर सकते हैं:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

यहाँ है कि आप इसे कैसे बनाते हैं:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

एक लंबी अवधि तक http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

समान हैक्स और उपकरण:


7
वाह, क्या बिल्ली है। +1
sinni800

1
नमस्ते, यह एक बहुत अच्छी चाल है, लेकिन यह मेरे लिए काम नहीं करता है। मेरे पास दो 3G मोडेम हैं, जो कनेक्ट होने पर, दो इंटरफेस खोलें (ppp0 और ppp1)। यदि मैं दो IPs में से एक को मजबूर करने की कोशिश करता हूं, तो मैं हमेशा एक ही इंटरफ़ेस के साथ बाहर जा रहा हूं (मैं इसे देखता हूं क्योंकि मेरे पास वायरशर्क के दो उदाहरण हैं, प्रत्येक इंटरफ़ेस के लिए एक)। मैंने bind.c से डिबग प्रिंट को भी हटा दिया है और वास्तव में मैं देखता हूं कि "अतिभारित" लाइब्रेरी भरी हुई है, इसलिए मुझे नहीं पता कि यह क्यों काम नहीं करता है।
एंड्रिया स्पैडाकासिनी

3
LD_PRELOAD को अनदेखा किया जाता है यदि आपका प्रभावी UID आपके वास्तविक UID के समान नहीं है।
मथायस क्रुल

force_bindकैटलिन एम। बोई की परियोजना IPv6
BurnsBA

महान काम करता है, लेकिन सफल होने के लिए संकलन के लिए #include <arpa / inet.h> जोड़ना पड़ा।
anno

31

आईपी ​​नेटन्स ऐसा कर सकते हैं।

TL; DR: नेटवर्क नेमस्पेस बनाएं, उनके साथ एसोसिएट इंटरफेस करें और फिर "ip netns निष्पादित NAME cmd ..." चलाएं।

बस जांचें कि क्या आपका डिस्ट्रो आईपी नेट का समर्थन करता है ... (बैकट्रैक 5 आर 3 नहीं करता है, जबकि काली करता है;);

अधिक विवरण में:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

यह LD_PRELOAD के माध्यम से आईपी को बाइंड करने से बेहतर क्यों है? क्योंकि LD_PRELOAD उस मार्ग को नियंत्रित नहीं करता है जो प्रक्रियाओं का उपयोग करता है। यह पहले मार्ग का उपयोग करेगा।

और चूंकि यह हमेशा एक ही मार्ग का उपयोग करता है, इसलिए यह मार्ग में पंजीकृत इंटरफ़ेस के लिए डिफ़ॉल्ट होगा। (जो हम चाहते हैं वह नहीं है)


2
कृपया अपने उत्तर में और विवरण जोड़ने का प्रयास करें।
रेनू चंद्रन

4
दूरस्थ सर्वर पर ऐसा न करें अगर eth0 सार्वजनिक नेटवर्क इंटरफ़ेस है ..
ygrek

1
अंतिम पंक्ति होना चाहिएip netns exec myNamespace firefox
meuh

1
जरूरत पड़ने पर नाम स्थान को हटाने के लिए "sudo ip netns del <namespace-name>" का उपयोग करें!
एडुआर्डो लुसियो

1
@EduardoLucio इसे निष्पादित करना संभव होना चाहिए: sudo ip netns exec myNamespace su -u someUser -c firefox
olivervbk

2

मुझे नहीं लगता कि एक निश्चित इंटरफ़ेस का उपयोग करने के लिए एक प्रक्रिया को मजबूर करना संभव है।

हालाँकि, मुझे लगता है कि आप ipchain / iptables के साथ खेलने में सक्षम हो सकते हैं और यह सुनिश्चित कर सकते हैं कि एक निश्चित पोर्ट जो आपकी प्रक्रिया को सुन रहा है उसे केवल एक विशेष इंटरफ़ेस के माध्यम से आने वाले पैकेट मिलेंगे।

उपयोगी HOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html


2
दो उच्च मत वाले पद अन्यथा सिद्ध होते हैं।
पॉल गियर

2

नीचे @olivervbk उत्तर के आधार पर मेरी है!

सभी कमांड को "रूट" के रूप में चलाएं।

कमांड का उपयोग करें ...

ip a

... नेटवर्क इंटरफ़ेस का नाम जानने के लिए जिसे आप उपयोग करना चाहते हैं।

टेम्पलेट के रूप में नीचे दिए गए कमांड चलाएं ...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] - चुने हुए नेटवर्क इंटरफ़ेस के नाम के साथ बदलें।
  • [Your_USER] - अपने उपयोगकर्ता नाम के साथ बदलें।
  • [APP_NAME] - उस एप्लिकेशन का नाम जो नामस्थान में निष्पादित किया जाएगा "[INTERFACE_NAME] _ns"। जैसे: "फ़ायरफ़ॉक्स"।

नोट I: "sudo" कमांड में "-b -u" झंडे आपके उपयोगकर्ता ("रूट") का उपयोग करके चलाने की अनुमति देता है और टर्मिनल को जारी करने वाली पृष्ठभूमि में। 2> /dev/null 1> /dev/null &टुकड़ा से "[APP_NAME] को" टर्मिनल पर मुद्रित किया जा रहा आउटपुट को रोकने के लिए है।
नोट II: आईपी ​​"10.1.1.10" और "10.1.1.1" के मान मनमानी हैं।
नोट III: मेरे लिए काम करने के लिए मुझे dhcpcd [INTERFACE_NAME]कमांड चलाना था ।

नाम स्थान का उपयोग हटाने के लिए ...

ip netns del [INTERFACE_NAME]_ns

... और ...

ip -all netns delete

... जो मौजूद है उसे दूर करने के लिए।


1

आमतौर पर अगर किसी प्रोग्राम में सुनने के इंटरफ़ेस को सेट करने का कोई विकल्प नहीं है, तो यह सभी इंटरफेस पर सुन रहा है। (आप इसे सत्यापित कर सकते हैं lsof -i)।

आने वाले ट्रैफ़िक को ड्रॉप करने वाले iptables फ़ायरवॉल नियम बनाना, इंटरफेस पर इसके पोर्ट्स की ओर इशारा करते हुए आप यह नहीं चाहते कि यह सबसे आसान काम है।


1

वैकल्पिक I:

इंटरफ़ेस गेटवे https://github.com/Intika-Linux-Network/App-Route-Jail को बाध्य करने के लिए ld_preload का उपयोग करना

किसी विशिष्ट नेटवर्क इंटरफ़ेस का उपयोग करने के लिए एप्लिकेशन को बाध्य करें

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

  • इंटरफ़ेस गेटवे को कैसे खोजें (गेटवे खोजने के लिए कई समाधान हैं यहां कुछ कमांड हैं जो उपयोग किए गए गेटवे को खोजने की अनुमति देते हैं)
$ 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

वैकल्पिक II:

Firejail https://firejail.wordpress.com/ किसी एप्लिकेशन को एक विशिष्ट नेटवर्क का उपयोग करने के लिए मजबूर कर सकता है, लेकिन संगतता सीमित है।

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1

ध्यान दें कि सामान्य उपयोगकर्ताओं के लिए निशान संभव नहीं है, आपको रूट के रूप में चलना चाहिए।
12

-2

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

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

इसलिए यदि उनके पास अलग-अलग आईपी पते हैं, तो सही इंटरफ़ेस का चयन करने के लिए मार्गों का उपयोग करें। यदि उनके पास समान आईपी पता है, तो आपको NAT का उपयोग करने की आवश्यकता है ताकि वे सिस्टम में अलग-अलग आईपी पते दिखाई दें।


3
सबसे पहले, क्लाइंट और सर्वर के बीच कई वैध मार्ग हो सकते हैं, लेकिन विभिन्न ट्रैफ़िक प्रकारों के लिए उपयुक्त विभिन्न विशेषताओं के साथ; उदाहरण के लिए, UMTS (सेलुलर डेटा) में पैसे खर्च हो सकते हैं, लेकिन इसमें वाईफाई की तुलना में अधिक रेंज होती है, लेकिन दोनों फाइबर कनेक्शन की तुलना में धीमी होती हैं। यदि अपस्ट्रीम प्रदाता स्रोत फ़िल्टरिंग (या NAT) करते हैं, तो आपके पास 'सही' इंटरफ़ेस भेजने के अलावा कोई विकल्प नहीं है। दूसरे, रूटिंग को प्रभावित करना स्रोत पते का चयन करने का एकमात्र कारण नहीं है। यहां तक ​​कि जब दोनों पते एक ही इंटरफ़ेस पर होते हैं, तो यह नियंत्रित करने के लिए उपयोगी हो सकता है जो कनेक्शन शुरू करने के लिए बाध्य है, सर्वर के रूप में

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