वीपीएन के साथ नेटवर्क नेमस्पेस में आवेदन के लिए पोर्ट अग्रेषण


13

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

मैंने @schnouki के एक गाइड का अनुसरण करते हुए बताया कि कैसे एक नेटवर्क नेमस्पेस सेट किया जाए और इसके अंदर ओपनवीपीएन चलाया जाए

ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o en+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf

उसके बाद, मैं अपने बाहरी आईपी की जांच कर सकता हूं और नाम-पत्र के अंदर और बाहर अलग-अलग परिणाम प्राप्त कर सकता हूं, जैसा कि इरादा था:

curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>

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

ip netns exec myvpn sudo -u <my-user> /usr/bin/deluged
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluge-web -f
ps $(ip netns pids myvpn)
 PID TTY      STAT   TIME COMMAND
1468 ?        Ss     0:13 openvpn --config /etc/openvpn/myvpn/myvpn.conf
9302 ?        Sl    10:10 /usr/bin/python /usr/bin/deluged
9707 ?        S      0:37 /usr/bin/python /usr/bin/deluge-web -f

अगर मैं vep vpn1 का IP निर्दिष्ट करता हूं, तो मैं नेमस्पेस और बाहर से 8112 पोर्ट पर वेब इंटरफेस का उपयोग करने में सक्षम हूं।

ip netns exec myvpn curl -Is localhost:8112 | head -1
HTTP/1.1 200 OK
ip netns exec myvpn curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK

लेकिन मैं अपने सर्वर से नामस्थान में आवेदन करने के लिए 8112 पोर्ट को पुनर्निर्देशित करना चाहता हूं। लक्ष्य मेरे लैन के अंदर एक कंप्यूटर पर एक ब्राउज़र खोलना और http: // my-server-ip: 8112 के साथ वेब इंटरफ़ेस प्राप्त करना है (मेरा-सर्वर-आईपी सर्वर का स्थिर आईपी जा रहा है जो नेटवर्क इंटरफ़ेस को त्वरित करता है)

संपादित करें: मैंने iptables नियम बनाने के अपने प्रयासों को हटा दिया। मैं जो करने की कोशिश कर रहा हूं उसे ऊपर बताया गया है और निम्नलिखित कमांड को HTTP 200 का उत्पादन करना चाहिए:

curl -I localhost:8112
curl: (7) Failed to connect to localhost port 8112: Connection refused
curl -I <my-server-ip>:8112
curl: (7) Failed to connect to <my-server-ip> port 8112: Connection refused

मैंने DNAT और SNAT नियमों की कोशिश की और अच्छे माप के लिए एक MASQUERADE में फेंक दिया, लेकिन जब से मुझे नहीं पता कि मैं क्या कर रहा हूं, मेरे प्रयास व्यर्थ हैं। शायद कोई मुझे इस निर्माण में मदद कर सकता है।

EDIT: का tcpdump आउटपुट tcpdump -nn -q tcp port 8112। अप्रत्याशित रूप से, पहला कमांड एक HTTP 200 लौटाता है और दूसरा कमांड अस्वीकृत कनेक्शन के साथ समाप्त होता है।

curl -Is 10.200.200.2:8112 | head -1
listening on vpn0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.200.200.1.36208 > 10.200.200.2.8112: tcp 82
IP 10.200.200.2.8112 > 10.200.200.1.36208: tcp 145

curl -Is <my-server-ip>:8112 | head -1
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP <my-server-ip>.58228 > <my-server-ip>.8112: tcp 0
IP <my-server-ip>.8112 > <my-server-ip>.58228: tcp 0

EDIT: @schnouki ने मुझे एक डेबियन एडमिनिस्ट्रेशन लेख की ओर इशारा किया जिसमें जेनेरिक iptables TCP प्रॉक्सी की व्याख्या की गई थी । हाथ में समस्या के लिए लागू, उनकी स्क्रिप्ट इस तरह दिखाई देगी:

YourIP=<my-server-ip>
YourPort=8112
TargetIP=10.200.200.2
TargetPort=8112

iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort

दुर्भाग्य से, वेथ इंटरफेस के बीच यातायात जब्त हो गया और कुछ नहीं हुआ। हालाँकि, @schnouki ने भी socatटीसीपी प्रॉक्सी के रूप में उपयोग का सुझाव दिया था और यह पूरी तरह से काम कर रहा है।

curl -Is <my-server-ip>:8112 | head -1
IP 10.200.200.1.43384 > 10.200.200.2.8112: tcp 913
IP 10.200.200.2.8112 > 10.200.200.1.43384: tcp 1495

मैं अभी तक अजीब बंदरगाह फेरबदल को समझने के लिए है, जबकि ट्रैफिक वीथ इंटरफेस से गुजर रहा है, लेकिन मेरी समस्या अब हल हो गई है।


अस्वीकरण: मेरे पास vethउपकरणों के साथ कोई अनुभव नहीं है (यह बहुत दिलचस्प लगता है, हालांकि ... ;-))। क्या आपने यह tcpdumpजांचने के लिए उपयोग किया है कि आने वाले पैकेट्स कितनी दूर हैं? यदि tcpdump -i veth0कुछ दिखाई नहीं देता है तो tcpdumo -i loआवश्यक हो सकता है।
हौके लैजिंग

जवाबों:


9

मैं हमेशा iptables पुनर्निर्देशन के साथ मुद्दों (शायद मेरी गलती है, मुझे पूरा यकीन है कि यह संभव है)। लेकिन आपके जैसे मामले के लिए, यह IMO के बिना उपयोगकर्ता-भूमि में करना आसान है।

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

यहाँ कैसे के साथ यह करने के लिए है socat :

socat tcp-listen:8112,reuseaddr,fork tcp-connect:10.200.200.2:8112

( पहले अनुमानित कनेक्शन बंद होने के बाद forkविकल्प को socatरोकने से बचने की आवश्यकता है)।

संपादित करें : reuseaddrटिप्पणियों में सुझाव के अनुसार जोड़ा गया ।

यदि आप पूरी तरह से इसे iptables के साथ करना चाहते हैं, तो डेबियन एडमिनिस्ट्रेशन साइट पर एक गाइड है । लेकिन मैं अभी भी socatअधिक उन्नत सामानों के लिए पसंद करता हूं - जैसे आईपीवी 6 को आईपीवी 6 को समीप करना, या एसएसएल को अलग करने के लिए पुराने जावा प्रोग्राम को सुरक्षित सेवाओं से कनेक्ट करने की अनुमति देना ...

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


1
तुमने मेरा दिन बना दिया! मैं कभी भी भर में नहीं आया था socatऔर यह बिल्कुल वही करता है जो मैं काफी समय से iptables के साथ करने की कोशिश कर रहा था। मैंने कई अनुप्रयोगों का परीक्षण किया और वे सभी त्रुटिपूर्ण रूप से काम कर रहे हैं, जो कि बाहरी दुनिया से जुड़कर tun0 के माध्यम से जुड़े हुए हैं, जबकि अभी भी ve1 के माध्यम से अपने वेब इंटरफेस तक पहुंच प्रदान कर रहे हैं।
21

1
कुछ परीक्षण करने के बाद, मैंने reuseaddrध्वज जोड़ा । यह port already in useतेजी से उत्तराधिकार में socat -4 TCP-LISTEN:8112,reuseaddr,fork TCP:10.200.200.2:8112
समाज को

8

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

लेकिन यहां तक ​​कि अलग-थलग मैं अभी भी इसे सुविधा के लिए, नेटवर्क पर प्रहार करना चाहता हूं।

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

socat tcp-listen:8112,fork,reuseaddr \
  exec:'ip netns exec myvpn socat STDIO tcp-connect\:127.0.0.1\:8112',nofork

यह एक नेटवर्क नेमस्पेस में कनेक्शन के लिए सुनता है जहां आप इसे चलाते हैं, पोर्ट 8112 पर, फिर कनेक्टेड क्लाइंट को नेटवर्क नेमस्पेस के अंदर बाकी को निष्पादित करने के execलिए चलाने के ip netns exec myvpn ...लिए मिलता है myvpn, फिर एक बार myvpnनेटवर्क नेमस्पेस के अंदर यह दूसरे के साथ फिर से दूसरा कनेक्शन बनाता है socat


की तरह एक आकर्षण काम कर
approximatenumber

चूँकि मैं लिनक्स प्रशासन के साथ बहुत अनुभवी नहीं हूं और मुझे यह पता लगाने में कुछ समय खर्च हुआ: :एकल-उद्धरण के अंदर दोनों वर्णों से बचना सुनिश्चित करें अन्यथा आप एक त्रुटि कह सकते हैं ... wrong number of parameters (2 instead of 1)(2 या 3)। अन्यथा: महान काम करता है! बहुत धन्यवाद!
इगोर

2

प्रलय के लिए यहाँ मेरा समाधान है। Iptables की कोई आवश्यकता नहीं है। यहाँ कदम हैं:

  1. अपनी ओपेनवोन टनल शुरू करें
  2. नेमस्पेस बनाएं और वहां अपनी ओपनवीएनपी सुरंग लाएं:
ip netns $ NS जोड़ते हैं
# TUN के आने का इंतजार करें
जबकि [[$ (आईपी मार्ग | grep $ TUN | wc -l) == 0]]; सो जाओ 1; किया हुआ
MY_IP = $ (ip addr show $ TUN | grep inet | cut -d '' -f6 | cut -d '/' -f1)
# जिस तरह से आप गेटवे आईपी निकालते हैं, वह आपके ओपनवैप कनेक्शन के लिए अलग हो सकता है
GATEWAY_IP = $ MY_IP
# नामस्थान में मेरा $ TUN (VPN इंटरफ़ेस) जेल
ip लिंक $ TUN नेटन $ NS सेट करता है
# एक सबनेट के साथ इंटरफेस लाओ (वीपीएन सर्वर द्वारा मुझे दिए गए के बराबर)
ip netns $ NS ifconfig $ TUN $ MY_IP / 24 अप को निष्पादित करते हैं
# लूपबैक लाओ
ip netns $ NS ifconfig lo 127.0.0.1/8 अप को निष्पादित करते हैं
# रिमोट गेटवे (आपका पॉइंटटॉप पॉइंट वीपीएन आईपी एड्रेस) सेट करें
ip netns $ NS रूट को डिफ़ॉल्ट gw $ GATEWAY_IP जोड़ते हैं
  1. अपने डिफ़ॉल्ट नाम स्थान और आपके द्वारा बनाए गए के बीच वीथ कनेक्शन स्थापित करें:
# नेमस्पेस के बीच संचार के लिए वीथ इंटरफेस स्थापित करें
आईपी ​​लिंक जोड़ने veth0 प्रकार veth सहकर्मी नाम veth1
# दूसरी नस को अपने नाम स्थान पर ले जाएं
आईपी ​​लिंक सेट veth1 netns $ NS
# अप्रयुक्त आईपी रेंज से पहली वीथ को एक आईपी दें
ifconfig veth0 10.1.1.1/24 अप
# और दूसरा वाला
ip netns $ NS ifconfig veth1 10.1.1.2/24 अप को निष्पादित करते हैं
# TODO: LAN के साथ संचार करने के लिए veth1 और एथ इंटरफ़ेस के बीच एक पुल स्थापित करें
# DNS क्लाइंट सेट अप करें। ip netns इस फ़ाइल का उपयोग करके /etc/resolv.conf का अनुकरण करेगा:
mkdir -p / etc / netns / $ NS
इको "नामकरण 8.8.4.4"> /etc/netns/$NS/resolv.conf
  1. $ NS में अपने deluged और अपने डिफ़ॉल्ट नाम स्थान पर अपने deluge- वेब चलाएं। 10.1.1.2 वीपीटी आईपी पते पर प्वाइंट डेल्यूज-वेब, जहां डेल्यूगड इसके कनेक्शन के लिए सुन रहा होगा।

देखा! आप वीपीएन के पीछे सुरक्षित हो गए हैं, जबकि आपका डेल्यूज़-वेब आपके होम नेटवर्क पर आसानी से उपलब्ध है


2

@ AndrDevEK का उत्तर उपयोगी है। उस पर विस्तार करने के लिए, आप इंस्टॉल नहीं करना चाह सकते हैं socat। जिस स्थिति में आप एक ही चीज़ को थोड़ा जटिल एसएसएच पोर्ट-फॉरवर्ड सेटअप के साथ प्राप्त कर सकते हैं। विशेष रूप से यूनिक्स-डोमेन सॉकेट से / के लिए पोर्ट-फ़ॉरवर्डिंग की सुविधा यहाँ उपयोगी है, क्योंकि यूनिक्स-डोमेन सॉकेट स्वतंत्र रूप से नेटवर्क नेमस्पेस का संचालन करते हैं:

sudo ip netns exec myvpn su -c "ssh -N -L /tmp/myunixsock:localhost:8112 localhost" $USER &
ssh_pid1=$!
ssh -N -L localhost:8112:/tmp/myunixsock localhost &
ssh_pid2=$!

साफ - सफाई:

sudo kill $ssh_pid1
kill $ssh_pid2
rm /tmp/myunixsock

पहला ssh -N -Lmyvpn नामस्थान के भीतर शुरू किया गया है। यह एक यूनिक्स-डोमेन सॉकेट बनाता है /tmp/myunixsockऔर इस पर सुनता है। इनकमिंग कनेक्शन लोकलहोस्ट को भेजे जाते हैं: 8112 (myvpn नामस्थान के अंदर)। दूसरा ssh -N -Lडिफ़ॉल्ट नाम स्थान में प्रारंभ किया गया है। यह एक सुनने का टीसीपी पोर्ट बनाता है और यूनिक्स-डोमेन सॉकेट के लिए आने वाले कनेक्शन को आगे बढ़ाता है।

यह ध्यान दिया जाना चाहिए कि इसके लिए काम करने के लिए, sshआपके नेटवर्क नेमस्पेस के अंदर काम करने की आवश्यकता होगी यदि यह पहले से ही नहीं है (और पासवर्ड रहित पबकी ऑपरेशन सहायक है):

sudo ip netns exec myvpn ip link set up dev lo
sudo ip netns exec myvpn /usr/sbin/sshd -o PidFile=/run/sshd-myvpn.pid
ssh-copy-id localhost
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.