नए वीपीएन कनेक्शन के लिए सेटअप रूटिंग और iptables ** को केवल ** बंदरगाहों 80 और 443 पर पुनर्निर्देशित करें


8

मेरे पास एक नया वीपीएन कनेक्शन है (ओपनवीपीएन का उपयोग करके) मुझे कुछ आईएसपी प्रतिबंधों के बारे में बताने के लिए। जबकि यह ठीक काम कर रहा है, यह सभी ट्रैफ़िक को वीपीएन पर ले जा रहा है । यह मुझे डाउनलोड करने के लिए समस्याएँ पैदा कर रहा है (मेरा इंटरनेट कनेक्शन वीपीएन अनुमति की तुलना में बहुत तेज़ है), और रिमोट एक्सेस के लिए। मैं एक ssh सर्वर चलाता हूं, और एक डेमन रनिंग करता हूं जो मुझे अपने फोन के माध्यम से डाउनलोड करने की अनुमति देता है।

मेरे पास eth0 पर मेरा मौजूदा ईथरनेट कनेक्शन है, और tun0 पर नया वीपीएन कनेक्शन है।

मेरा मानना ​​है कि मुझे 192.168.0/24 नेटवर्क पर अपने मौजूदा eth0 कनेक्शन का उपयोग करने के लिए डिफ़ॉल्ट मार्ग को सेटअप करने की आवश्यकता है, और डिफ़ॉल्ट गेटवे को 192.168.0.1 पर सेट करें (मेरा ज्ञान अस्थिर है क्योंकि मैंने कई वर्षों से ऐसा नहीं किया है )। अगर यह सही है, तो मुझे यकीन नहीं है कि यह कैसे करना है! मेरी वर्तमान रूटिंग टेबल है:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         10.51.0.169     0.0.0.0         UG    0      0        0 tun0     0     0      0
10.51.0.1       10.51.0.169     255.255.255.255 UGH   0      0        0 tun0     0     0      0
10.51.0.169     0.0.0.0         255.255.255.255 UH    0      0        0 tun0     0     0      0
85.25.147.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0     0     0      0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0

रूटिंग को ठीक करने के बाद, मेरा मानना ​​है कि गंतव्य पोर्ट 80 या 443 के लिए सब कुछ के लिए मजबूर करने के लिए आईटर्ब का उपयोग करने की आवश्यकता है। फिर, मुझे यकीन नहीं है कि यह कैसे करना है!

इंटरनेट पर मैंने जो कुछ भी पाया है वह कुछ अधिक जटिल करने की कोशिश कर रहा है, और पेड़ों से लकड़ी को छांटने की कोशिश मुश्किल साबित हो रही है।

कोई भी सहायताकाफी प्रशंसनीय होगी।

अपडेट करें

अब तक, विभिन्न स्रोतों से, मैंने निम्नलिखित के साथ मिलकर काम किया है:

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

अब इस लगता है काम करने। सिवाय इसके कि यह नहीं है!

अवरुद्ध वेबसाइटों के लिए कनेक्शन कर रहे हैं , के माध्यम से जा पोर्ट 80 और 443 पर नहीं कनेक्शन कर रहे हैं गैर वीपीएन कनेक्शन का उपयोग कर।

हालाँकि पोर्ट 80 और 443 कनेक्शन जो अवरुद्ध वेबसाइटों के लिए नहीं हैं, वे गैर-वीपीएन कनेक्शन का भी उपयोग कर रहे हैं!

जैसा कि सामान्य लक्ष्य तक पहुँच गया है, मैं अपेक्षाकृत खुश हूँ, लेकिन यह जानना अच्छा होगा कि यह बिल्कुल सही काम क्यों नहीं कर रहा है।

कोई विचार?

संदर्भ के लिए, मेरे पास अब 3 रूटिंग टेबल, मुख्य, इंटरनेट और वीपीएन हैं। इनकी सूची इस प्रकार है ...

मुख्य:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 

इंटरनेट:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 
192.168.0.1 dev eth0  scope link  src 192.168.0.73

वीपीएन:

default via 10.38.0.205 dev tun0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1

उपरोक्त स्क्रिप्ट उम्मीद के मुताबिक काम करती है। मैं बस netstat में 10 पते से यातायात को देखने की उम्मीद कर रहा था। हालाँकि, सभी ट्रैफ़िक 192 से उत्पन्न होते हैं, लेकिन पोर्ट 80 और 443 को वीपीएन पर निर्देशित किया जाता है। मैं एक उत्तर में पूरा समाधान रखूंगा, लेकिन iproute2 और fwmark के सुझाव के लिए @anttir को सहारा देता हूं। मैं उन पर नहीं आया था, और उनके बिना मैं अभी भी एक ईंट की दीवार के खिलाफ अपना सिर पीट रहा था!
स्टीव

जवाबों:


4

तो, यह सबसे ऊपर है, लेकिन संपूर्ण समाधान इस प्रकार था:

संपादित करें / etc / iproute2 / rt_tables और नीचे 2 लाइनें जोड़ें:

101 internet
102 vpn

आप इन तालिकाओं को अन्य नाम दे सकते हैं जो अधिक समझ में आते हैं, बस सुसंगत रहें।

फिर आपको /etc/init.d में एक स्क्रिप्ट बनाने की आवश्यकता है (मैंने इसे rt_setup कहा है)

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

फिर, जाहिर है, इसे /etc/rc2.d से लिंक करें (मैं ubuntu का उपयोग करता हूं, रनवेल आपके लिए अलग हो सकता है)। सुनिश्चित करें कि आप इसे Openvpn लिंक की तुलना में अधिक S नंबर देते हैं !

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

मैं आश्वस्त नहीं हूं कि अगली 2 लाइनें आवश्यक हैं, लेकिन वे iptables में उपयोग के लिए आईपी अग्रेषण को सक्षम करते हैं।

अगला स्क्रिप्ट प्रासंगिक आईपी पते से उत्पन्न होने वाले ट्रैफ़िक को देखने के लिए कुछ नियम बनाता है, और यह देखने के लिए कि ट्रैफ़िक को विशेष रूप से चिह्नित किया गया है या नहीं।

POSTROUTING और PREROUTING सुनिश्चित करता है कि किसी पते से उत्पन्न होने वाले ट्रैफ़िक को उत्तर मिले!

अंतिम iptables PRERINGING वह हिस्सा है जो ट्रैफ़िक को टैग करता है, और यह सुनिश्चित करता है कि पोर्ट 80 या 443 में जाने वाली कुछ चीज़ों को तालिका 2 (वीपीएन) का उपयोग करने के लिए चिह्नित किया गया है।

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

जैसा कि यह खड़ा है, प्रक्रिया शानदार ढंग से काम करती है। वीपीएन को मशीन के आते ही शुरू कर दिया जाता है, और यह स्क्रिप्ट कुछ सेकंड बाद चलती है (इस स्क्रिप्ट को चलाने से पहले वीपीएन को पूरी तरह से शुरू करने के लिए सुनिश्चित करने के लिए मैं एक स्लीप स्टेटमेंट जोड़ सकता हूं)। मेरा रिमोट एक्सेस कनेक्शन (ssh आदि) बहुत अच्छा काम करता है। मेरे कनेक्शन जो कि 80 या 443 पोर्ट पर नहीं जाते हैं वे मेरे स्थानीय कनेक्शन का उपयोग कर रहे हैं, लेकिन सभी वेब ट्रैफ़िक वीपीएन पर जा रहे हैं, और मेरे आईएसपी द्वारा लगाए गए नियंत्रणों को दरकिनार कर रहे हैं!

जैसा कि मैंने अपने प्रश्न के तहत अपनी टिप्पणी में कहा था, मैंने @ttir के सुझाव के बिना इस मार्ग को देखना भी शुरू नहीं किया होगा। उस सुझाव के पीछे, साइट http://blog.khax.net/2009/11/28/multi-gateway-rout-with-iptables-and-iproute2/ और http://linux-ip.net/ html / adv-multi-internet.html बहुत उपयोगी रहे हैं (भले ही कोड 100% पूर्ण न हो!)


1
एक अंतिम जोड़ के रूप में, मैंने sleep 20स्क्रिप्ट के शीर्ष में एक जोड़ा, क्योंकि ओपनवीएनपी कनेक्शन समय पर पूरा नहीं हो रहा था। मैंने echo 2 > /proc/sys/net/ipv4/conf/tun0/rp_filterस्क्रिप्ट में भी जोड़ा क्योंकि ट्यून के लिए रिवर्स पैकेट फ़िल्टर को अक्षम करना आवश्यक है। जब कोई उत्तर स्रोत पते S के साथ tun0 से वापस आता है, तो रिवर्स पैकेट फ़िल्टर चेक करता है "यदि मुझे S को संबोधित करने के लिए एक पैकेट रूट करना था, और यह tun0 से नहीं गुजरेगा, तो मैं पैकेट छोड़ दूंगा" - और क्योंकि ऐसा करते समय लुकअप कोई मान्य fwmark नहीं है, यह निर्धारित करता है कि मार्ग सामान्य डिफ़ॉल्ट मार्ग होगा, इसलिए यह पैकेट को गिरा देता है।
स्टीव

मुझे यह काम करने के लिए मुझे आपकी स्क्रिप्ट संपादित करनी पड़ी। अंतिम लाइन के route add default gw 192.168.0.1 eth0लिए स्थानीय गेटवे के माध्यम से पोर्ट 80/443 ट्रैफ़िक को रूट करना प्रतीत होता था, जैसा कि इरादा था। route add default tun0मेरे लिए चाल करने के लिए अंतिम पंक्ति को बदलने लगता है।

1

प्रति प्रोटोकॉल राउटिंग एक बालक जटिल है। आमतौर पर रूटिंग टेबल का उपयोग गंतव्य आईपी के अनुसार गेटवे की जांच करने के लिए किया जाता है और ओपनवेप या 192.168.0.1 डिफ़ॉल्ट गेटवे का उपयोग किया जाता है।

वीपीएन के दूसरे छोर पर स्क्वीड http प्रॉक्सी को सेट करना आसान होगा और प्रॉक्सी का उपयोग करने के लिए ब्राउज़र सेट करना होगा।

आप iptables का उपयोग नहीं करेंगे क्योंकि यह HTTP कनेक्शन के गंतव्य आईपी को बदल देगा और यह काम नहीं करेगा।

आप वीपीएन समापन बिंदु पर सेट डिफ़ॉल्ट मार्ग के साथ एक नया रूटिंग टेबल (/ etc / iproute2 / rt_tables) बना सकते हैं, सभी HTTP पैकेट को चिह्नित करने के लिए iptables fwmark (-j MARK) का उपयोग करें और फिर आईपी ​​नियम के लिए एक कस्टम नियम बनाने के लिए नए रूटिंग टेबल का उपयोग करने के लिए चिह्नित पैकेज।


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

वीपीएन और वीपीएन के बाहर दुनिया के बाकी हिस्सों में सिर्फ कुछ आईपी को रूट करने के बारे में कैसे?
एंटि रयत्सला

मैंने कुछ आईपी को रूट करने के बारे में सोचा था, लेकिन जैसे-जैसे साइटें घूमती हैं, सूची बदलती जाती है, और मुझे पीसी पर अन्य उपयोगकर्ताओं के लिए उपयोग करना आसान बनाने की आवश्यकता होती है। मैंने एक नया राउटिंग टेबल स्थापित करने और पैकेटों को चिह्नित करने के लिए देखना शुरू कर दिया है। मार्किंग पैकेट आसान सा था, यह राउटिंग टेबल है जिसके बारे में मुझे यकीन नहीं है। मैं वीपीएन के लिए एक सेट कर सकता हूं जो सही दिखता है, और बाकी सब कुछ जो राइट-ईश दिखता है, के लिए एक है, लेकिन मुझे यकीन नहीं है कि मुख्य के साथ क्या करना है जो अभी भी चूक (वीपीएन) पर सेट है। अभी भी खेल रहा है ...
स्टीव

linux-ip.net/html/adv-multi-internet.html ip रूल शो और आईपी रूल fwmark 4 टेबल 4 प्राथमिकता 10000
जोड़ते हैं

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