การส่งต่อพอร์ตย้อนกลับของ Vagrant?


121

ฉันกำลังทำงานเกี่ยวกับสถาปัตยกรรมบริการเว็บ ฉันมีซอฟต์แวร์บางตัวที่ต้องใช้ในเครื่องโฮสต์ดั้งเดิมไม่ใช่ใน Vagrant แต่ฉันต้องการเรียกใช้บริการลูกค้าบางอย่างกับแขก

config.vm.forwarded_portพารามิเตอร์ของ Vagrant จะเปิดพอร์ตบนโฮสต์และส่งข้อมูลไปยังแขก แต่ฉันจะเปิดพอร์ตสำหรับแขกและส่งข้อมูลไปยังโฮสต์ได้อย่างไร? (ยังคงเป็นพอร์ตฟอร์เวิร์ด แต่ในทิศทางกลับกัน)


เนื่องจาก Vagrant ใช้ SSH จึงเป็นไปได้ในทางทฤษฎีและอัญมณีการใช้งาน Ruby SSHรองรับสิ่งนี้ แต่ไม่เคยเห็นอะไรแบบนี้ใน Vagrant docu
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:] port: host: hostportโดยที่หมายเลขแรกคือหมายเลขพอร์ตที่จะรับฟังภายในเครื่องของแขกและสองตัวสุดท้ายคือที่อยู่บริการ ที่มองเห็นได้จากเครื่องโฮสต์
Eero

1
เท่าที่ฉันเข้าใจว่าการส่งต่อย้อนกลับใช้ได้เฉพาะในเชลล์ ssh ที่เกี่ยวข้องเท่านั้น ฉันคิดว่า Dan Fabulich ต้องการวิธีแก้ปัญหาโดยไม่จำเป็นต้อง ssh เข้าสู่ vm
Alp

2
@Alp ฉันเชื่อว่ามันเป็นพอร์ตที่ใช้ได้กับทั้งระบบไม่ใช่แค่สำหรับกระบวนการ ssh เท่านั้น ใช้ได้ดีสำหรับฉัน!
Henrik Heimbuerger

1
สำหรับผู้ที่ใช้ PuTTy ส่วน SSH / Tunnels ของ configuration gui อนุญาตให้ส่งต่อทั้งพอร์ตระยะไกล (ดังนั้น -R ในคำสั่ง) หรือ Local port forwarding (-L ในบรรทัดคำสั่ง)
Titou

3
หรือบางสิ่งบางอย่างที่เกี่ยวข้องกับการกำหนดค่าที่อาจแตกต่างกันของคนจรจัดหากคุณมีการตั้งค่าคนจรจัดหลายตัว:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman

100

ในหนังสือVagrant: Up and Running(Pub. date: 12 มิถุนายน 2013) ซึ่งเขียนโดยผู้สร้าง Vagrant เขากล่าวว่าเป็นไปไม่ได้ที่เครื่องแขกจะเข้าถึงบริการที่ทำงานบนเครื่องโฮสต์

แทนที่จะใช้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" # Vagrant เวอร์ชั่น # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Vagrant เวอร์ชั่น # 2

    การมีบรรทัดนี้ในVagrantfileพินัยกรรมของคุณจะสั่งให้คนเร่ร่อนสร้างเครือข่ายส่วนตัวที่มีที่อยู่ IP แบบคงที่:192.168.0.0

    ที่อยู่ IP ของโฮสต์อยู่เสมอที่อยู่ IP เดียวกัน แต่มี octet ที่สุดท้ายเป็น 1 192.168.0.1ในตัวอย่างก่อนหน้านี้เครื่องโฮสต์จะมีที่อยู่


2
ในหลอดเลือดดำเดียวกัน (จากVagrant: Up and Running) คุณสามารถตั้งค่าเครือข่ายเชื่อมโยงได้ บนเครือข่ายบริดจ์เครื่องอื่น ๆ ในเครือข่ายท้องถิ่นของคุณสามารถเข้าถึงเครื่องเสมือนของคุณได้และในทางกลับกัน แต่เนื่องจากที่อยู่ IP ถูกกำหนดผ่าน DHCP คุณจึงต้องเข้าไปifconfigในเครื่องเสมือนเพื่อค้นหาที่อยู่ IP
nucleartide

28
ความจริงที่ว่าเมื่อคุณตั้งค่า config.vm.network: private_network, ip: "192.168.50.4" หมายความว่าแขกจะเข้าถึงโฮสต์ได้โดยไปที่ "192.168.50.1" ซึ่งเป็นข้อมูลหลักที่นี่ ฉันไม่พบเอกสารที่เป็นระเบียบเรียบร้อยเล็กน้อยที่ใดก็ได้
Nucleon

1
ฉันพบว่าการใช้ที่อยู่คำตอบของ192.168.0.0ไม่ได้ผล - การม้วนงอ / ปิงเครื่องโฮสต์ส่งผลให้เกิดการเชื่อมต่อ t / o การใช้ที่อยู่ของ @ Nucleon (สอดคล้องกับเอกสาร Vagrantในหัวข้อ) ได้ผลตามที่โฆษณาไว้
markdsievers

8
@ มิงหยูไม่ - การใช้เส้นกำหนดค่าของคุณconfig.vm.network :private_network, ip: "192.168.0.0"และการโค้งงอ / ปิงโฮสต์ที่เปิด192.168.0.1อยู่ส่งผลให้หมดเวลาเชื่อมต่อ การกำหนดค่าเครือข่ายที่จะได้รับการแก้ไขก็คือโฮสต์สามารถดูได้ที่192.168.50.4 192.168.50.1
markdsievers

3
"192.168.0.0" ไม่ใช่ตัวอย่างที่ดีโดยปกติ xxx0 ใช้สำหรับการแพร่ภาพ
หมายเลข 5

73

คุณสามารถเข้าถึงพอร์ตบนเครื่องโฮสต์ผ่านเกตเวย์เริ่มต้นภายในระบบปฏิบัติการของแขก (ซึ่งโดยทั่วไปจะมี IP เป็น10.0.2.2)

ตัวอย่างเช่นหากคุณมีเว็บเซิร์ฟเวอร์ที่ทำงานบนพอร์ต 8000 บนเครื่องโฮสต์ของคุณ ...

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

คุณสามารถเข้าถึงได้จากภายใน Vagrant VM ที่10.0.2.2:8000(ที่ให้ไว้10.0.2.2คือ ip ของเกตเวย์เริ่มต้นของแขก):

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

ในการค้นหา IP ของเกตเวย์เริ่มต้นภายในระบบปฏิบัติการของแขกให้เรียกใช้netstat -rn(หรือipconfigบนผู้เยี่ยมชม Windows) และมองหาแถวที่มี IP ปลายทางเป็น0.0.0.0(หรือฟิลด์ที่ชื่อ "เกตเวย์เริ่มต้น" บน Windows):

$ 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 จากเครื่อง VirtualBox คนจรจัด ; เชื่อมต่อกับเครื่องโฮสต์จาก VirtualBox guest OS หรือไม่


ฉันชอบโซลูชันนี้มากเช่นกันเพราะมันใช้งานได้โดยไม่ต้องหยุดเซสชัน ssh คนจรจัดปัจจุบันของฉัน ขอบคุณ!
Rubix

ไชโย! นี่คือสิ่งที่ฉันกำลังมองหา
Khan Shahrukh

ยอดเยี่ยม ifconfigและip addressไม่ได้รับสิ่งที่ฉันต้องการ แต่netstat -rnได้รับ
geerlingguy

9

เพิ่มสิ่งต่อไปนี้ให้กับคุณ~/.ssh/configบนเครื่องโฮสต์:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

มันช่วยให้คุณเข้าถึงบริการบนพอร์ตเครื่องโฮสต์ 52,698 vagrant sshจากจรจัดตราบใดที่คุณเข้าสู่ระบบผ่าน

คุณสามารถยืนยันว่าใช้งานได้โดยทำงานnetstat -ltบน VM คนจรจัดและจดบันทึกในบรรทัดต่อไปนี้:

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

2
+1 นี่เป็นความช่วยเหลืออย่างมากสำหรับฉัน ฉันเพิ่มข้อความที่กำหนดแทนที่ด้วยพอร์ต 5037 เพื่อให้กล่องคนจรจัดของฉันสามารถฟังโปรแกรมจำลอง Android ที่ทำงานบนกล่องโฮสต์ของฉันได้
ปล้น

2

ฉันสามารถเข้าถึงบริการที่ทำงานบนเครื่องโฮสต์ของฉันผ่านที่อยู่ IP ในเครื่อง (ไม่ใช่ที่อยู่ย้อนกลับ) ฉันทดสอบโดยการสร้างเซิร์ฟเวอร์ http บนพอร์ต 80 (จากนั้นบนพอร์ต 987) และในcurl197.45.0.10:80 และ 197.45.0.10:987 (ที่อยู่ IP จริงเปลี่ยนไปเพื่อปกป้องผู้บริสุทธิ์) มันใช้งานได้ทั้งสองครั้งและฉันไม่มีการกำหนดค่าคนจรจัดพิเศษ (ไม่มี public_network ไม่มี forwarded_port) และในขณะที่ฉันมีพอร์ตบางพอร์ตที่ส่งต่อผ่าน PuTTY ฉันไม่มีพอร์ต 80 และ 987 ที่ส่งต่อ ดังนั้นอาจลองใช้ที่อยู่ IP ในเครื่องหรือสาธารณะของเครื่องโฮสต์

และหากคุณต้องการเข้าถึง (ssh into) อินสแตนซ์ของแขกเร่ร่อนจากอีกเครื่องหนึ่งคุณสามารถเปิดใช้งานpublic_networkและส่งต่อจากพอร์ต 22 ได้ในVagrantfileลักษณะนี้:

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

จากนั้นตราบเท่าที่พอร์ตนั้นเปิดอยู่ (เช่นทำการส่งต่อพอร์ตเพิ่มเติมในการกำหนดค่าเราเตอร์ของคุณ) คุณสามารถเข้าถึงเครื่องนั้นได้จากทุกที่แม้กระทั่งโลกภายนอก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.