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


20

क्या विशिष्ट इंटरफ़ेस पर प्रक्रिया द्वारा उपयोग किए गए ट्रैफ़िक को रूट करना संभव है?

उदाहरण के लिए, डाउनलोड एप्लिकेशन द्वारा नेटवर्क ट्रैफ़िक को हमेशा इंटरफ़ेस का उपयोग करना चाहिए wlan0जबकि मशीन पर अन्य सभी अनुप्रयोगों का उपयोग करना चाहिए eth0

क्या लिनक्स में इस तरह का नियम होना संभव है?

जवाबों:


22

यह लिनक्स नेटवर्क नेमस्पेस का उपयोग करके किया जा सकता है।

यहाँ एक लेख है जो बताता है कि कैसे। मूल रूप से आप एक अलग डिफ़ॉल्ट मार्ग के साथ एक नेटवर्क नेमस्पेस बनाते हैं और वहां चलने वाली प्रक्रियाओं को चलाते हैं। आप नए एडॉप्टर नेटवर्क नेमस्पेस को एक पुल के साथ भौतिक एडेप्टर से कनेक्ट करते हैं (लेकिन अन्य समाधान निश्चित रूप से संभव हैं)।

अद्यतन: कर्नेल 3.14 से यह नियंत्रण समूहों का उपयोग करना और भी आसान है, जैसा कि इस लेख में वर्णित है । आपको करना होगा:

1) एक दिए गए प्रक्रिया से पैकेट को एनोटिड (या प्रक्रिया के समूह) के साथ पैकेट को एनोटेट करने के लिए एक net_cls नियंत्रण समूह को परिभाषित करें, ध्यान दें कि उनके बीच कोई अभिभावक-बच्चा संबंध नहीं है)

2) पैकेटों को चिह्नित करने के लिए iptables cgroup मॉड्यूल (लिनक्स 3.14 में जोड़ा गया) का उपयोग करें

3) चिह्नित पैकेट के लिए एक नया रूटिंग टेबल बनाने के लिए पॉलिसी रूटिंग (ip रूल ऐड्वर्टमार्क ...) का उपयोग करें

फायदा यह है कि हमें ब्रिडिंग बात नहीं करनी है और सब कुछ बहुत अधिक गतिशील धन्यवाद है cgroups करने के लिए।


14

मैं sooo के साथ संघर्ष किया है तो यहाँ एक पूर्ण समाधान है। यह Ubuntu 15 और 16 पर परीक्षण किया गया है। आप विशेष रूप से वीपीएन सुरंग इंटरफ़ेस के बाहर कुछ एप्लिकेशन को रूट करने के लिए OpenVPN के साथ इसका उपयोग कर सकते हैं।

पूर्ण "cgroup" समाधान

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

  • लिनक्स कर्नेल ऐप को एक कंट्रोल ग्रुप में डाल देगा । इस cgroup के ऐप्स से नेटवर्क ट्रैफ़िक की पहचान नेटवर्क कंट्रोलर स्तर पर उनकी क्लास आईडी द्वारा की जाएगी।
  • iptables इस ट्रैफ़िक को चिह्नित करेगा और इसे सही IP के साथ बाहर निकलने के लिए मजबूर करेगा
  • आईपी ​​मार्ग एक अलग मार्ग तालिका में चिह्नित ट्रैफ़िक को संसाधित करेगा, जो भी आप चाहते हैं, गेटवे आईपी के लिए एक डिफ़ॉल्ट मार्ग के साथ।

स्वचालित स्क्रिप्ट

मैंने निर्भरताएँ स्थापित करने और चलाने के लिए एक novpn.sh स्क्रिप्ट बनाई है । उबंटू पर परीक्षण किया गया।

पहले अपना वीपीएन शुरू करें।

wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/cf8b37fbe6c3f50a0be825eb77cafa3e0134946f/novpn.sh
# If you don't use eth0, edit the script setting.
sudo chmod +x novpn.sh
./novpn.sh traceroute www.google.com
./novpn.sh --help

मैनुअल HowTo

सबसे पहले, cgroup सहायता और उपकरण स्थापित करें:

sudo apt-get install cgroup-lite cgmanager cgroup-tools

रिबूट (आवश्यक नहीं हो सकता है)।

आपको iptables 1.6 .0+ की आवश्यकता है । IPtables 1.6.0 रिलीज़ स्रोत प्राप्त करें , इसे निकालें, फिर इसे चलाएँ ( --disable-nftablesध्वज त्रुटियों से बचेंगे) iptables स्रोत dir:

sudo apt-get install dh-autoreconf bison flex
./configure --prefix=/usr      \
            --sbindir=/sbin    \
            --disable-nftables \
            --enable-libipq    \
            --with-xtlibdir=/lib/xtables
make
sudo make install
iptables --version

अब, वास्तविक विन्यास। नाम के एक नियंत्रण समूह को परिभाषित करें novpn। इस cgroup की प्रक्रियाओं में 0x00110011(11:11) का एक वर्गीकरण होगा ।

sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid

अब, हम उस इंटरफ़ेस को मान लेंगे जिसका उपयोग आप विशिष्ट ऐप के लिए करना चाहते हैं, eth0गेटवे IP के साथ है 10.0.0.1। इन्हें आप वास्तव में जो चाहते हैं, उससे बदलें (जानकारी प्राप्त करें ip route)। रूट के रूप में अभी भी चलाएं:

# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11

# Force the packets to exit through eth0 with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE

# Define a new "novpn" routing table
# DO THIS JUST ONCE !
echo 11 novpn >> /etc/iproute2/rt_tables

# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn

# Novpn has a default gateway to the interface you want to use
ip route add default via 10.0.0.1 table novpn

# Unset reverse path filtering for all interfaces, or at least for "eth0" and "all"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

अंत में, विशिष्ट इंटरफ़ेस पर अपना ऐप चलाएं:

exit
sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn
cgexec -g net_cls:novpn traceroute www.google.com
# Close all Firefox windows first
cgexec -g net_cls:novpn firefox

या यदि आप पहले से ही चल रही प्रक्रिया को cgroup में ले जाना चाहते हैं, तो ठीक है ... आप नहीं कर सकते! यह NAT (बहाना) फ़ंक्शन के कारण प्रतीत होता है: iptables -nvL -t natजब cgroup स्विच किया जाता है, लेकिन iptables -nvL -t mangleमेल नहीं खाता है।

# Get PID of the process (we'll then suppose it's 1234)
pidof firefox
# Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result.
sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks
# Remove - but this works...
sudo echo 1234 > /sys/fs/cgroup/net_cls

क्रेडिट: कोई जवाब की उम्मीद के रूप में काम कर रहे थे, लेकिन उनमें से एक मिश्रण था: chripell evolware लेख का जवाब मार्ग cgroups, iptables और नीति का उपयोग: मार्ग ले 2 प्रक्रिया प्रति , मैं एक विशिष्ट प्रक्रिया एक OpenVPN कनेक्शन के माध्यम से नहीं जा रहा कैसे करूं? , IPVables के आधार पर OpenVPN के लिए किल स्विच


महान जवाब के लिए धन्यवाद, मैं इसे अपाचे के साथ कैसे काम करूं? मैंने कोशिश की cgexec -g net_cls:novpn apache2और मुझे चर अपरिभाषित एरोस की पूरी सूची दी!
रजक १ak

2
आपको apache2टर्मिनल से सीधे रन करके वही त्रुटियां मिलेंगी । ऐसा इसलिए apache2है क्योंकि आम तौर पर एक सेवा के रूप में लॉन्च किया जाता है systemctl start apache2। हालाँकि, यह साथ काम नहीं करेगा cgexec। कहा जाता है कि कार्यक्रम apache2को प्रसार के लिए net_cls cgroup के लिए वांछित ( ) प्रक्रिया का एक अभिभावक होना चाहिए । इसलिए आपको लॉन्च स्क्रिप्ट ढूंढनी होगी। इस मामले में, यह है sudo cgexec -g net_cls:novpn /usr/sbin/apache2ctl start। के साथ जाँच करें ./novpn.sh --list
क्रिशवेबदेव

यह ubuntu 16.04 में अब और काम नहीं करता है!
razzak

2
मैं इसे Ubuntu 16.04 पर उपयोग कर रहा हूं और यह ठीक काम कर रहा है। उबंटू 16 में इंटरफ़ेस नाम बदल गए हैं, आपको eth0कुछ की जगह बदलने की आवश्यकता हो सकती है enp7s0ifconfigआदेश से जानकारी प्राप्त करें ।
क्रिशवेबदेव

धन्यवाद। लेकिन यह उबंटू 18.04 पर काम नहीं करता है क्योंकि सिस्टममैन के साथ संघर्ष के कारण cpmanager को हटा दिया गया है
skonsoft


3

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

मैंने इसे यहाँ एक जिस्ट के रूप में पोस्ट किया: https://gist.github.com/level323/54a921216f0baaa163127d960bfebbf0

यह भी बाद में cgroup / iptables / रूटिंग टेबल को साफ कर सकता है!

प्रतिक्रिया का स्वागत

पुनश्च - यह डेबियन 8 (जेसी) के लिए डिज़ाइन किया गया है


हाय @allnatural, मैं आपकी altnetworking.sh स्क्रिप्ट का उपयोग करना चाहूंगा, लेकिन मुझे कॉन्फ़िगरेशन फ़ाइल में क्या डालना चाहिए?
क्राइस 70

0

प्रति आवेदन नहीं, नहीं। आप इसे प्रति पोर्ट या आईपी-एड्रेस आदि के अनुसार कर सकते हैं, या एक एप्लिकेशन स्वयं एक विशिष्ट नेटवर्क कार्ड को (और उपयोग) के लिए बाध्य कर सकता है।

यद्यपि आप इसे करने के लिए कोई नियम सेट नहीं कर सकते हैं।


मेरे पास एक जावा एप्लिकेशन है, क्या उस ऐप को एक इंटरफ़ेस से बांधना संभव है?
सुरेश

एक जावा एप्लिकेशन के लिए आपके पास स्रोत कोड है और इंटर्नल्स को फिर से प्रोग्राम कर सकता है?
माजेंको

मेरे पास जावा एप्लिकेशन सोर्स कोड है जो अपाचे http लाइब्रेरी का उपयोग करता है।
सुरेश

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