Vagrant रिवर्स पोर्ट अग्रेषण?


121

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

वैग्रैंट का config.vm.forwarded_portपैरामीटर होस्ट पर एक पोर्ट खोलेगा और अतिथि को डेटा भेजेगा। लेकिन मैं अतिथि पर एक पोर्ट कैसे खोल सकता हूं और होस्ट को डेटा भेज सकता हूं? (यह अभी भी पोर्ट फ़ॉरवर्डिंग है, लेकिन रिवर्स दिशा में है।)


चूंकि वैग्रैंट एसएसएच का उपयोग कर रहा है, यह सैद्धांतिक रूप से संभव है और रूबी एसएसएच कार्यान्वयन रत्न इस बात का समर्थन करता है, लेकिन वैग्रेंट मुद्राओं में ऐसा कुछ भी कभी नहीं देखा गया।
cmur2

इसे भी देखें: stackoverflow.com/q/19933550/1157054
Ajedi32

जवाबों:


134

जब आप चलते हैं vagrant ssh, तो यह वास्तव में इस अंतर्निहित कमांड का उपयोग कर रहा है:

ssh -p 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key vagrant@127.0.0.1

SSH उस दिशा में अग्रेषण पोर्ट का समर्थन करता है जिसे आप -R guestport:host:hostportविकल्प के साथ चाहते हैं । इसलिए, यदि आप 12345अतिथि से पोर्ट कनेक्ट करना चाहते हैं और इसे आगे भेज दिया है localhost:80, तो आप इस कमांड का उपयोग करेंगे:

ssh -p 2222 -R 12345:localhost:80 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key vagrant@127.0.0.1

जैसा कि Eero सही ढंग से टिप्पणी करता है, आप कमांड का उपयोग भी कर सकते हैं vagrant ssh -- -R 12345:localhost:80, जिसका प्रभाव बहुत अधिक संक्षिप्त कमांड में होता है।


67
और आप इसे और अधिक आसानी से चला सकते हैं। यह vagrant ssh -- -R 12345:localhost:80 ssh विकल्प सिंटैक्स -R [bind_address:] पोर्ट: होस्ट: होस्टपोर्ट , जहां पोर्ट नंबर, गेस्ट मशीन के अंदर सुनने के लिए पोर्ट नंबर है, और अंतिम दो सर्विस एड्रेस हैं, का अनुसरण करता है। मेजबान मशीन से दिखाई दे रहा है।
ईरो

1
जहां तक ​​मैं समझता हूं कि रिवर्स फॉरवर्डिंग केवल इसी ssh शेल में काम करता है। मुझे लगता है कि डान फेबुलिच वीएम में ssh की आवश्यकता के बिना एक समाधान चाहते थे।
अल्प

2
@ मुझे विश्वास है कि यह पूरी प्रणाली के लिए उपलब्ध एक बंदरगाह है, न कि केवल ssh प्रक्रिया के लिए उपलब्ध है। मेरे लिए ठीक काम करता है!
हेनरिक हेमबर्गर

1
PuTTy का उपयोग करने वालों के लिए, कॉन्फ़िगरेशन gui का SSH / सुरंग अनुभाग दोनों रिमोट पोर्ट अग्रेषण (इसलिए कमांड में -R) या स्थानीय पोर्ट फ़ॉरवर्डिंग (कमांड लाइन में -L) की अनुमति देता है
टिटौ

3
या योनि के संभावित अलग-अलग विन्यास के लिए कुछ लेखांकन करें यदि आपके पास कई योनि सेटअप हैं:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman

100

Vagrant: Up and Runningवैग्रांत के निर्माता द्वारा लिखित पुस्तक (पब तिथि: 12 जून, 2013) में, उन्होंने उल्लेख किया कि अतिथि मशीन के लिए मेजबान मशीन पर चलने वाली सेवाओं तक पहुंच संभव नहीं है।

उपयोग करने के बजाय Forwarded Ports, आप निजी नेटवर्क का उपयोग कर सेट कर सकते हैंHost-Only Networks

  • उपयोग करने का नियम Host-Only Networks से अधिकForwarded Ports

    1. अतिथि मशीन होस्ट मशीन पर चलने वाली सेवाओं तक पहुंच सकती हैं

      यह सुविधा आपकी समस्या का समाधान करेगी।

    2. अतिथि मशीन अन्य अतिथि मशीन पर चलने वाली सेवाओं तक पहुंच सकती हैं

      उत्पादन सुविधाओं के अधिक सटीक रूप से नकल करने के लिए कई मशीनों पर अलग-अलग सेवाओं के लिए यह सुविधा बहुत उपयोगी है।

    3. सुरक्षित

      बाहरी मशीनों में अतिथि मशीनों पर चलने वाली सेवाओं तक पहुंचने का कोई तरीका नहीं है

    4. कम काम

      हर एक को कॉन्फ़िगर करने की आवश्यकता नहीं है Forwarded Port


  • कॉन्फ़िगर कैसे करें Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # वैग्रंट संस्करण # 1

    config.vm.network :private_network, ip: "192.168.0.0" # वैग्रंट संस्करण # 2

    आपके पास यह लाइन होने Vagrantfileसे एक निजी नेटवर्क बनाने के लिए आव्रजन का निर्देश होगा जिसमें एक स्थिर आईपी पता होगा:192.168.0.0

    होस्ट का IP पता हमेशा एक ही IP एड्रेस होता है लेकिन अंतिम ऑक्टेट के रूप में 1. एक उदाहरण में, होस्ट मशीन में IP एड्रेस होगा 192.168.0.1


2
एक ही नस में (से भी Vagrant: Up and Running), आप एक ब्रिड्ड नेटवर्क सेट कर सकते हैं। एक ब्रिड्ड नेटवर्क पर, आपके स्थानीय नेटवर्क की अन्य मशीनें आपके वर्चुअल मशीन तक पहुँच सकती हैं, और इसके विपरीत। लेकिन चूंकि आईपी पता डीएचसीपी के माध्यम से सौंपा गया है, इसलिए आपको ifconfigइसका आईपी पता खोजने के लिए वर्चुअल मशीन में होना चाहिए।
न्यूक्लियराइड

28
तथ्य यह है कि जब आप config.vm.network: private_network, ip: "192.168.50.4" सेटअप करते हैं, तो इसका मतलब है कि अतिथि "192.168.50.1" पर जाकर होस्ट तक पहुंच जाएगा, यहां जानकारी का एक महत्वपूर्ण हिस्सा है। मुझे लगता है कि छोटे tidbit कहीं भी प्रलेखित नहीं मिल सकता है।
न्यूक्लियर

1
मैंने 192.168.0.0काम नहीं करने के जवाब के पते का उपयोग करते हुए पाया - मेजबान मशीन को कर्लिंग / पिंग करने के परिणामस्वरूप कनेक्शन टी / ओ का था। @ न्यूक्लॉन के पते का उपयोग करना ( विषय पर वैग्रेंट डॉक्स के अनुरूप ) विज्ञापन के रूप में काम किया।
मार्कशीट

8
@Mingyu नहीं - अपनी कॉन्फ़िगरेशन लाइन का उपयोग करना config.vm.network :private_network, ip: "192.168.0.0"और होस्ट को कर्लिंग / पिंग करना 192.168.0.1जिसके परिणामस्वरूप कनेक्शन समय बहिष्कार किया गया था। 192.168.50.4इसे हल करने के लिए नेटवर्क को कॉन्फ़िगर करना अर्थात होस्ट उपलब्ध होना 192.168.50.1
मार्कट

3
"192.168.0.0" एक अच्छा उदाहरण नहीं है, xxx0 सामान्य रूप से प्रसारण आईएनजी के लिए है
number5

73

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

उदाहरण के लिए, यदि आपके पास अपने होस्ट मशीन पर पोर्ट 8000 पर एक वेबसर्वर चल रहा है ...

echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000

आप इसे Vagrant VM के अंदर से एक्सेस कर सकते हैं 10.0.2.2:8000(बशर्ते 10.0.2.2मेहमान के डिफ़ॉल्ट गेटवे का आईपी हो):

vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!

अतिथि OS के अंदर डिफ़ॉल्ट गेटवे का IP खोजने के लिए, netstat -rn(या ipconfigविंडोज अतिथि पर) चलाएं और गंतव्य के साथ पंक्ति देखें 0.0.0.0(या विंडोज पर "डिफ़ॉल्ट गेटवे" लेबल वाला क्षेत्र):

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.33.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1

आप इस IP को प्रोग्रामेटिक रूप से निकाल सकते हैं netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2

स्रोत: योनि वर्चुअलबॉक्स मशीन से होस्ट PostgreSQL से कैसे जुड़ें ; वर्चुअलबॉक्स अतिथि OS से होस्ट मशीन से कनेक्ट करें?


मुझे यह समाधान बहुत पसंद है क्योंकि यह सिर्फ मेरे वर्तमान योनि सत्र को रोकने के बिना भी काम करता है। धन्यवाद!
रुबिक्स

वाहवाही ! यह वही है जो मैं देख रहा था
खान शाहरुख

अति उत्कृष्ट! ifconfigऔर ip addressमुझे वो नहीं मिल रहा था जो मुझे चाहिए था, लेकिन netstat -rnकिया।
जेरलिंगगुगी

9

अपने ~/.ssh/configमेजबान मशीन पर निम्नलिखित जोड़ें :

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

यह आपको वैगन्रेंट से होस्ट मशीन पोर्ट 52698 पर एक सेवा का उपयोग करने देता है, जब तक आप लॉग इन करते हैं vagrant ssh

आप इसकी पुष्टि कर सकते हैं कि यह netstat -ltवीएम पर चलकर और निम्नलिखित पंक्तियों पर ध्यान देकर काम करता है :

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN

2
+1 यह मेरे लिए बहुत बड़ी मदद थी। मैंने दिए गए पाठ को पोर्ट 5037 के साथ बदल दिया ताकि मेरे आवारा बॉक्स मेरे होस्ट बॉक्स पर चलने वाले एंड्रॉइड एमुलेटर को सुनने में सक्षम हो सकें।
लूट

2

मैं अपने होस्ट मशीन पर चलने वाली सेवाओं को इसके स्थानीय आईपी पते (इसके लूपबैक पते से नहीं) के माध्यम से एक्सेस कर सकता हूं। मैंने पोर्ट 80 (और फिर पोर्ट 987) पर एक http सर्वर बनाकर परीक्षण किया औरcurl बनाकर और 197.45.0.10:80 और 197.45.0.10:987 (मासूम की रक्षा के लिए वास्तविक आईपी पता बदलकर । इसने दोनों बार काम किया, और मेरे पास कोई विशेष योनि विन्यास (कोई public_network, कोई अग्रेषित_पोर्ट) नहीं है और जबकि मेरे पास कुछ पोर्ट पुट्टी के माध्यम से अग्रेषित हैं, मेरे पास पोर्ट 80 और 987 नहीं हैं। तो शायद मेजबान मशीन के स्थानीय या सार्वजनिक आईपी पते का उपयोग करने का प्रयास करें।

और यदि आप एक अतिथि योनि उदाहरण को दूसरे से एक्सेस करना चाहते हैं, तो आप public_networkपोर्ट 22 को इस Vagrantfileतरह से फॉरवर्ड करने में सक्षम कर सकते हैं :

config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200

फिर जब तक वह पोर्ट खुला रहता है (यानी अपने राउटर कॉन्फिगर में कुछ और पोर्ट फॉरवर्ड करना) आप उस मशीन को कहीं से भी एक्सेस कर सकते हैं, यहां तक ​​कि बाहरी दुनिया में भी।

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