Vagrant ters bağlantı noktası iletimi?


121

Bir web hizmetleri mimarisi üzerinde çalışıyorum. Vagrant'ta değil, yerel ana makinede çalıştırmam gereken bazı yazılımlar var. Ama misafirde bazı müşteri hizmetleri yürütmek istiyorum.

Vagrant'ın config.vm.forwarded_portparametresi, ana bilgisayarda bir bağlantı noktası açacak ve verileri misafire gönderecektir. Ancak konukta bir bağlantı noktasını nasıl açabilirim ve verileri ev sahibine nasıl gönderebilirim? (Hala bağlantı noktası yönlendirme, ancak ters yönde.)


Vagrant SSH kullandığından teorik olarak mümkündür ve Ruby SSH uygulama mücevheri bunu destekler ancak Vagrant belgesinde böyle bir şey görmedi.
cmur2

Yanıtlar:


134

Çalıştırdığınızda vagrant ssh, aslında şu temel komutu kullanıyor:

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:hostportseçenek ile istediğiniz yönde yönlendirme bağlantı noktalarını destekler . Dolayısıyla, 12345konuk üzerindeki bağlantı noktasına bağlanmak ve yönlendirilmesini localhost:80istiyorsanız, şu komutu kullanırsınız:

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'nun doğru yorumladığı gibi, vagrant ssh -- -R 12345:localhost:80çok daha kısa bir komutta aynı etkiye sahip olan komutu da kullanabilirsiniz .


67
ve bunu kullanarak daha basit bir şekilde çalıştırabilirsiniz. Bu vagrant ssh -- -R 12345:localhost:80 , ssh seçeneği sözdizimini takip eder -R [bağlantı_adresi:] bağlantı noktası: ana bilgisayar: ana bilgisayar , burada ilk numara konuk makinede dinlenecek bağlantı noktası numarası ve son ikisi hizmet adresidir ana makineden göründüğü gibi.
Eero

1
Anladığım kadarıyla, ters iletmenin yalnızca ilgili ssh kabuğunda çalıştığını anladım. Dan Fabulich'in sanal makineye ssh göndermeye gerek kalmadan bir çözüm istediğini düşünüyorum.
Alp

2
@Alp Bunun sadece ssh işlemi için değil, tüm sistem için kullanılabilir bir bağlantı noktası olduğuna inanıyorum. Benim için iyi çalışıyor!
Henrik Heimbuerger

1
PuTTy'yi kullananlar için, yapılandırma kılavuzunun SSH / Tunnels bölümü hem Uzak bağlantı noktası iletmeye (dolayısıyla komutta -R) hem de Yerel bağlantı noktası iletmeye (komut satırında -L) izin verir
Titou

3
Veya birden fazla serseri kurulumunuz varsa, serserinin potansiyel olarak farklı yapılandırmasını açıklayan bir şey:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman

100

Kitapta Vagrant: Up and RunningVagrant'ın yaratıcısı tarafından yazılan (Yayın tarihi: 12 Haziran 2013), konuk makinenin ana makinede çalışan hizmetlere erişmesinin mümkün olmadığını belirtti.

Kullanmak yerine, kullanarak Forwarded Portsözel bir ağ kurabilirsiniz Host-Only Networks.

  • Host-Only NetworksOver kullanmanın avantajlarıForwarded Ports

    1. Konuk makineler, ana makinede çalışan hizmetlere erişebilir

      Bu özellik sorununuzu çözecektir.

    2. Konuk makineler, diğer konuk makinesinde çalışan hizmetlere erişebilir

      Bu özellik, bir üretim ortamını daha doğru bir şekilde taklit etmek için hizmetleri birden çok makineye ayırmak için çok kullanışlıdır.

    3. Güvenli

      Dış makinelerin konuk makinelerde çalışan hizmetlere erişme yolu yoktur

    4. Az iş

      Her birini yapılandırmaya gerek yok Forwarded Port


  • Nasıl yapılandırılır Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # Vagrant Sürüm # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Vagrant Sürüm # 2

    Bu çizgiye sahip olmak Vagrantfile , serseriye statik IP adresine sahip özel bir ağ oluşturma talimatı verecektir:192.168.0.0

    Ana bilgisayarın IP adresi her zaman aynı IP adresidir, ancak son sekizli bir 1'dir. Önceki örnekte, ana makine IP adresine sahip olacaktır 192.168.0.1.


2
Aynı şekilde (ayrıca buradan Vagrant: Up and Running), köprülü bir ağ kurabilirsiniz. Köprülü bir ağda, yerel ağınızdaki diğer makineler sanal makinenize erişebilir ve bunun tersi de geçerlidir. Ancak IP adresi DHCP aracılığıyla atandığından ifconfig, IP adresini bulmak için sanal makinede yapmanız gerekir .
nükleartide

28
Config.vm.network: private_network, ip: "192.168.50.4" kurulumunu yaptığınızda, konuğun "192.168.50.1" e giderek ana bilgisayara erişeceği anlamına gelir buradaki bilgi biti. Belgelenen o küçük bilgi parçasını hiçbir yerde bulamıyorum.
Nükleon

1
192.168.0.0İşe yaramadı yanıt adresini kullanarak buldum - ana makineyi kıvırmak / ping atmak, bağlantıların sonuçlanmasına neden oluyordu. @ Nucleon'un adresini kullanmak ( konuyla ilgili Vagrant belgelerine uygun olarak) reklamı yapılan şekilde çalıştı.
markdsievers

8
@Mingyu Hayır - yapılandırma hattınızı kullanmak config.vm.network :private_network, ip: "192.168.0.0"ve ana bilgisayarı kıvırmak / ping atmak 192.168.0.1bağlantı zaman aşımlarına neden oluyordu . Çözülecek ağı yapılandırma, 192.168.50.4yani şu adresten kullanılabilir ana bilgisayar 192.168.50.1.
markdsievers

3
"192.168.0.0" iyi bir örnek değil, XXX0 normalde yayın ing içindir
number5

73

Konuk işletim sistemi içindeki varsayılan ağ geçidi aracılığıyla ana makinedeki bağlantı noktalarına erişebilirsiniz. (Tipik olarak IP'sine sahiptir 10.0.2.2.)

Örneğin, ana makinenizde 8000 numaralı bağlantı noktasında çalışan bir web sunucunuz varsa ...

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

En Serseri VM içinde de erişebilirsiniz 10.0.2.2:8000(sağlanan 10.0.2.2konukların varsayılan ağ geçidinin ip olduğu):

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

Konuk işletim sistemi içindeki varsayılan ağ geçidinin IP'sini bulmak için şunu çalıştırın: netstat -rn (veya ipconfigbir Windows konuk üzerinde) ve hedef IP'sine sahip satırı 0.0.0.0(veya Windows'ta "Varsayılan Ağ Geçidi" etiketli alanı ) arayın :

$ 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

Bu IP'yi programlı olarak çıkartabilirsiniz. netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2 .

Kaynaklar: Serseri sanal kutu makinesinden ana bilgisayar PostgreSQL ile nasıl bağlantı kurulur ; VirtualBox konuk işletim sisteminden ana makineye bağlanılsın mı?


Ben de bu çözümü çok seviyorum çünkü şu anki serseri ssh oturumumu durdurmadan çalıştı. Teşekkürler!
Rubix

Bravo ! tam olarak aradığım şey buydu
Khan Shahrukh

Mükemmel! ifconfigve ip addressbana ihtiyacım olanı alamıyordu ama aldım netstat -rn.
geerlingguy

9

~/.ssh/configAna makineye aşağıdakileri ekleyin :

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

Üzerinden oturum açtığınız sürece Vagrant'tan 52698 ana makine bağlantı noktasındaki bir hizmete erişmenizi sağlar vagrant ssh.

netstat -ltVagrant VM'de çalışıp aşağıdaki satırlarda bir not alarak çalıştığını doğrulayabilirsiniz :

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

2
+1 Bu bana çok yardımcı oldu. Serseri kutumun ana bilgisayar kutumda çalışan android öykünücüyü dinleyebilmesi için 5037 numaralı bağlantı noktasıyla değiştirerek verilen metni ekledim.
soymak

2

Ana makinemde çalışan hizmetlere yerel IP adresi aracılığıyla erişebiliyorum (geri döngü adresi değil). 80 numaralı bağlantı noktasında (ve ardından 987 numaralı bağlantı noktasında) bir http sunucusu oluşturarak test ettim vecurl 197.45.0.10:80 ve 197.45.0.10:987 (masumları korumak için gerçek ip adresi değiştirildi) kullanarak test ettim. Her iki seferde de çalıştı ve herhangi bir özel serseri konfigürasyonum yok (public_network yok, forwarded_port yok) ve PuTTY aracılığıyla yönlendirilen bazı portlarım olsa da, 80 ve 987 portlarım yönlendirilmiyor. Bu nedenle, ana makinenin yerel veya genel IP adresini kullanmayı deneyebilirsiniz.

Ve bir konuk serseri örneğine diğerinden erişmek (ssh içine) erişmek istiyorsanız, public_network22 numaralı bağlantı noktasından şu şekilde iletmeyi etkinleştirebilir ve etkinleştirebilirsiniz Vagrantfile:

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

Daha sonra, bu bağlantı noktası açık olduğu sürece (yani yönlendirici yapılandırmanızda biraz daha bağlantı noktası yönlendirme yapın), bu makineye her yerden, hatta dış dünyadan erişebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.