Port forwarding terbalik gelandangan?

121

Saya sedang mengerjakan arsitektur layanan web. Saya punya beberapa perangkat lunak yang saya butuhkan untuk dijalankan di mesin host asli, bukan di Vagrant. Tapi saya ingin menjalankan beberapa layanan klien pada tamu.

config.vm.forwarded_portParameter Vagrant akan membuka port pada host dan mengirim data ke tamu. Tapi bagaimana saya bisa membuka port pada tamu dan mengirim data ke host? (Ini masih port forwarding, tetapi dalam arah sebaliknya.)

Dan Fabulich
sumber
Karena Vagrant menggunakan SSH, secara teoritis dimungkinkan dan gem implementasi Ruby SSH mendukung ini tetapi tidak pernah melihat yang seperti ini di dokumen Vagrant.
cmur2

Jawaban:

134

Saat Anda menjalankan vagrant ssh, itu sebenarnya menggunakan perintah yang mendasari ini:

ssh -p 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key [email protected]

SSH mendukung port penerusan ke arah yang Anda inginkan dengan -R guestport:host:hostportopsi. Jadi, jika Anda ingin terhubung ke port12345 pada tamu dan diteruskan ke localhost:80, Anda akan menggunakan perintah ini:

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 [email protected]

Saat Eero berkomentar dengan benar, Anda juga dapat menggunakan perintah tersebut vagrant ssh -- -R 12345:localhost:80, yang memiliki efek yang sama dalam perintah yang jauh lebih ringkas.

wlritchi
sumber
67
dan Anda dapat menjalankan ini lebih sederhana menggunakan vagrant ssh -- -R 12345:localhost:80 Ini mengikuti sintaks opsi ssh -R [bind_address:] port: host: hostport , di mana nomor pertama adalah nomor port untuk didengarkan di dalam mesin tamu, dan dua yang terakhir adalah alamat layanan seperti yang terlihat dari mesin host.
Eero
1
Sejauh yang saya mengerti bahwa penerusan mundur hanya berfungsi di shell ssh yang sesuai. Saya rasa Dan Fabulich menginginkan solusi tanpa perlu ssh ke vm.
Alp
2
@Alp Saya yakin ini adalah port yang tersedia untuk seluruh sistem, tidak hanya tersedia untuk proses ssh. Bekerja dengan baik untuk saya!
Henrik Heimbuerger
1
Bagi mereka yang menggunakan PuTTy, bagian SSH / Tunnels dari konfigurasi gui memungkinkan penerusan port jarak jauh (oleh karena itu -R dalam perintah) atau penerusan port lokal (-L di baris perintah)
Titou
3
Atau sesuatu yang memperhitungkan konfigurasi gelandangan yang berpotensi berbeda jika Anda memiliki beberapa pengaturan gelandangan:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman
100

Di dalam buku Vagrant: Up and Running (Pub.Tanggal: 12 Juni 2013), yang ditulis oleh pencipta Vagrant, dia menyebutkan bahwa tidak mungkin mesin tamu mengakses layanan yang berjalan di mesin host.

Alih-alih menggunakan Forwarded Ports, Anda dapat menyiapkan jaringan pribadi menggunakan Host-Only Networks.

  • Kelebihan menggunakan Host-Only NetworkslebihForwarded Ports

    1. Mesin tamu dapat mengakses layanan yang berjalan di mesin host

      Fitur ini akan menyelesaikan masalah Anda.

    2. Mesin tamu dapat mengakses layanan yang berjalan di mesin tamu lain

      Fitur ini sangat berguna untuk memisahkan layanan ke beberapa mesin agar lebih akurat meniru lingkungan produksi.

    3. Aman

      Mesin luar tidak memiliki cara untuk mengakses layanan yang berjalan di mesin tamu

    4. Lebih sedikit pekerjaan

      Tidak perlu mengonfigurasi setiap Forwarded Port


  • Cara mengonfigurasi Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # Versi Gelandangan # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Versi Gelandangan # 2

    Memiliki baris ini di Anda Vagrantfileakan menginstruksikan gelandangan untuk membuat jaringan pribadi yang memiliki alamat IP statis:192.168.0.0

    Alamat IP dari sebuah host selalu merupakan alamat IP yang sama tetapi dengan oktet terakhir sebagai 1. Dalam contoh sebelumnya, mesin host akan memiliki alamat IP 192.168.0.1.

Mingyu
sumber
2
Dengan nada yang sama (juga dari Vagrant: Up and Running), Anda dapat mengatur jaringan yang terhubung. Di jaringan yang terhubung, mesin lain di jaringan lokal Anda dapat mengakses mesin virtual Anda, dan sebaliknya. Tetapi karena alamat IP ditetapkan melalui DHCP, Anda harus berada ifconfigdi mesin virtual untuk menemukan alamat IP-nya.
nukleartida
28
Fakta bahwa ketika Anda mengatur config.vm.network: private_network, ip: "192.168.50.4" berarti tamu akan mengakses host dengan membuka "192.168.50.1" adalah informasi kunci di sini. Saya tidak dapat menemukan berita gembira kecil itu didokumentasikan di mana pun.
Nucleon
1
Saya menemukan menggunakan alamat jawaban 192.168.0.0tidak berfungsi - menggulung / ping mesin host mengakibatkan koneksi t / o. Menggunakan alamat @ Nucleon (konsisten dengan dokumen Vagrant tentang topik) berfungsi seperti yang diiklankan.
markdsievers
8
@ Mingyu Tidak - menggunakan baris konfigurasi Anda config.vm.network :private_network, ip: "192.168.0.0"dan melakukan curling / ping ke host 192.168.0.1menyebabkan waktu koneksi habis. Konfigurasi jaringan untuk 192.168.50.4diselesaikan yaitu host yang tersedia di 192.168.50.1.
markdsievers
3
"192.168.0.0" bukan contoh yang baik, xxx0 biasanya untuk penyiaran
nomor 5
73

Anda dapat mengakses port pada mesin host melalui gateway default di dalam OS tamu. (Yang biasanya memiliki IP 10.0.2.2.)

Misalnya, jika Anda memiliki server web yang berjalan pada port 8000 di mesin host Anda ...

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

Anda dapat mengaksesnya dari dalam VM Vagrant di 10.0.2.2:8000(asalkan 10.0.2.2ip gateway default tamu):

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

Untuk menemukan IP gateway default di dalam OS tamu, jalankan netstat -rn(atau ipconfigpada tamu Windows) dan cari baris dengan IP tujuan 0.0.0.0(atau bidang berlabel "Gateway Default" di 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

Anda dapat mengekstrak IP ini secara terprogram dengan netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2.

Sumber: Cara terhubung dengan host PostgreSQL dari mesin virtualbox gelandangan ; Terhubung ke mesin host dari OS guest VirtualBox?

Ajedi 32
sumber
Saya sangat menyukai solusi ini juga karena itu hanya bekerja tanpa menghentikan sesi ssh gelandangan saya saat ini. Terima kasih!
Rubix
Bravo! inilah yang saya cari
Khan Shahrukh
Luar biasa! ifconfigdan ip addresstidak mendapatkan apa yang saya butuhkan, tetapi netstat -rnmelakukannya.
Geerlingguy
9

Tambahkan yang berikut ke Anda ~/.ssh/configdi mesin host:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

Ini memungkinkan Anda mengakses layanan pada mesin host port 52698 dari Vagrant, selama Anda masuk melalui vagrant ssh.

Anda dapat mengonfirmasi bahwa ini berfungsi dengan menjalankan netstat -ltvagrant VM dan mencatat di baris berikut:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
stacker-baka
sumber
2
+1 Ini sangat membantu saya. Saya menambahkan teks yang diberikan menggantikan dengan port 5037 untuk memungkinkan kotak gelandangan saya dapat mendengarkan emulator android yang berjalan di kotak host saya.
merampok
2

Saya dapat mengakses layanan yang berjalan di mesin host saya melalui alamat IP lokalnya (bukan alamat loopbacknya). Saya menguji dengan membuat server http pada port 80 (dan kemudian pada port 987) dan pada curl197.45.0.10:80 dan 197.45.0.10:987 (alamat ip sebenarnya diubah untuk melindungi yang tidak bersalah). Ini bekerja dua kali, dan saya tidak memiliki konfigurasi gelandangan khusus (tidak ada public_network, tidak ada forwarded_port) dan sementara saya memiliki beberapa port yang diteruskan melalui PuTTY, saya tidak memiliki port 80 dan 987 yang diteruskan. Jadi mungkin coba gunakan alamat IP lokal atau publik mesin host.

Dan jika Anda ingin mengakses (ssh ke) satu instance gelandangan tamu dari yang lain, Anda dapat mengaktifkan public_networkserta meneruskan dari port 22 dengan cara Vagrantfileseperti ini:

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

Kemudian selama port tersebut terbuka (yaitu melakukan beberapa penerusan port di konfigurasi router Anda), Anda dapat mengakses mesin itu dari mana saja, bahkan dari dunia luar.

BT
sumber