Vagrant Reverse Port Weiterleitung?

121

Ich arbeite an einer Webdienstarchitektur. Ich habe eine Software, die ich auf dem nativen Host-Computer ausführen muss, nicht in Vagrant. Aber ich möchte einige Client-Services für den Gast ausführen.

Der config.vm.forwarded_portParameter von Vagrant öffnet einen Port auf dem Host und sendet die Daten an den Gast. Aber wie kann ich einen Port für den Gast öffnen und die Daten an den Host senden? (Es ist immer noch Portweiterleitung, aber in umgekehrter Richtung.)

Dan Fabulich
quelle
Da Vagrant SSH verwendet, ist dies theoretisch möglich, und das Ruby SSH-Implementierungsjuwel unterstützt dies, hat jedoch im Vagrant-Dokument noch nie so etwas gesehen.
cmur2

Antworten:

134

Beim Ausführen vagrant sshwird tatsächlich der zugrunde liegende Befehl verwendet:

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 unterstützt die Weiterleitung von Ports in die gewünschte Richtung mit der -R guestport:host:hostportOption. Wenn Sie also eine Verbindung zum Port 12345des Gasts herstellen und an diesen weiterleiten localhost:80möchten, verwenden Sie diesen Befehl:

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]

Wie Eero richtig kommentiert, können Sie auch den Befehl verwenden vagrant ssh -- -R 12345:localhost:80, der den gleichen Effekt in einem viel präziseren Befehl hat.

wlritchi
quelle
67
und Sie können dies einfacher ausführen , indem Sie Folgendes verwenden:vagrant ssh -- -R 12345:localhost:80 Dies folgt der Syntax der ssh-Option -R [bind_address:] port: host: hostport , wobei die erste Nummer die Portnummer ist, die auf dem Gastcomputer abgehört werden soll, und die letzten beiden die Dienstadresse sind wie vom Host-Computer aus sichtbar.
Eero
1
Soweit ich weiß, funktioniert die Rückwärtsweiterleitung nur in der entsprechenden ssh-Shell. Ich denke, Dan Fabulich wollte eine Lösung, ohne in die VM einsteigen zu müssen.
Alp
2
@Alp Ich glaube, es ist ein Port, der für das gesamte System verfügbar ist, nicht nur für den SSH-Prozess. Funktioniert gut für mich!
Henrik Heimbuerger
1
Für diejenigen, die PuTTy verwenden, erlaubt der Abschnitt SSH / Tunnel der Konfigurations-GUI sowohl die Weiterleitung von Remote-Ports (daher das -R im Befehl) als auch die Weiterleitung von lokalen Ports (-L in der Befehlszeile)
Titou
3
Oder etwas, das die potenziell andere Konfiguration von Vagrant vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
berücksichtigt,
100

In dem Vagrant: Up and Runningvom Ersteller von Vagrant verfassten Buch ( Veröffentlichungsdatum : 12. Juni 2013) erwähnte er, dass Gastcomputer nicht auf Dienste zugreifen können, die auf dem Hostcomputer ausgeführt werden.

Anstatt zu verwenden Forwarded Ports, können Sie mit ein privates Netzwerk einrichten Host-Only Networks.

  • Vorteile der Verwendung Host-Only NetworksüberForwarded Ports

    1. Gastcomputer können auf die Dienste zugreifen, die auf dem Hostcomputer ausgeführt werden

      Diese Funktion würde Ihr Problem lösen.

    2. Gastcomputer können auf die Dienste zugreifen, die auf einem anderen Gastcomputer ausgeführt werden

      Diese Funktion ist sehr nützlich, um Dienste auf mehrere Maschinen zu verteilen und eine Produktionsumgebung genauer nachzuahmen.

    3. Sichern

      Externe Computer haben keine Möglichkeit, auf die auf den Gastcomputern ausgeführten Dienste zuzugreifen

    4. Weniger Arbeit

      Sie müssen nicht jeden einzelnen konfigurieren Forwarded Port


  • So konfigurieren Sie Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # Vagrant Version # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Vagrant Version # 2

    Wenn Sie diese Zeile in Ihrem VagrantfileTestament haben, wird vagrant angewiesen, ein privates Netzwerk mit einer statischen IP-Adresse zu erstellen:192.168.0.0

    Die IP-Adresse des Hosts ist immer dieselbe IP-Adresse, jedoch mit dem letzten Oktett als 1. Im vorherigen Beispiel hätte der Host-Computer die IP-Adresse 192.168.0.1.

Mingyu
quelle
2
In der gleichen Weise (auch von Vagrant: Up and Running) können Sie ein überbrücktes Netzwerk einrichten. In einem überbrückten Netzwerk können andere Maschinen in Ihrem lokalen Netzwerk auf Ihre virtuelle Maschine zugreifen und umgekehrt. Da die IP-Adresse jedoch über DHCP zugewiesen wird, müssen Sie ifconfigin der virtuellen Maschine die IP-Adresse ermitteln.
Nuklearflut
28
Die Tatsache, dass beim Einrichten von config.vm.network: private_network ip: "192.168.50.4" bedeutet, dass der Gast über "192.168.50.1" auf den Host zugreift, ist hier die wichtigste Information. Ich kann diesen kleinen Leckerbissen nirgendwo dokumentieren.
Nucleon
1
Ich habe festgestellt, dass die Verwendung der Antwortadresse von 192.168.0.0nicht funktioniert hat - das Einrollen / Pingen des Host-Computers führte zu Verbindungs-T / O's. Die Verwendung der Adresse von @ Nucleon (in Übereinstimmung mit den Vagrant-Dokumenten zum Thema) funktionierte wie angegeben.
Markdsievers
8
@Mingyu Nein - Die Verwendung Ihrer Konfigurationszeile config.vm.network :private_network, ip: "192.168.0.0"und das Einrollen / Pingen des Hosts 192.168.0.1führte zu Verbindungszeitüberschreitungen. Konfigurieren des zu lösenden Netzwerks, 192.168.50.4dh Host verfügbar unter 192.168.50.1.
Markdsievers
3
"192.168.0.0" ist kein gutes Beispiel, xxx0 ist normalerweise für die Ausstrahlung vorgesehen
Nummer 5
73

Sie können über das Standard-Gateway im Gastbetriebssystem auf Ports auf dem Hostcomputer zugreifen. (Was normalerweise eine IP von hat 10.0.2.2.)

Zum Beispiel, wenn auf Ihrem Host-Computer ein Webserver auf Port 8000 ausgeführt wird ...

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

Sie können von der Vagrant-VM aus darauf zugreifen 10.0.2.2:8000(vorausgesetzt, es 10.0.2.2handelt sich um die IP-Adresse des Standard-Gateways des Gasts):

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

Um die IP des Standard-Gateways im Gastbetriebssystem zu ermitteln, führen Sie netstat -rn(oder ipconfigeinen Windows-Gast) aus und suchen Sie nach der Zeile mit der Ziel-IP von 0.0.0.0(oder dem Feld "Standard-Gateway" unter 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

Sie können diese IP programmgesteuert mit extrahieren netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2.

Quellen: Herstellen einer Verbindung mit dem Host PostgreSQL von einer vagabundierenden Virtualbox-Maschine aus ; Von einem VirtualBox-Gastbetriebssystem aus eine Verbindung zum Host-Computer herstellen?

Ajedi32
quelle
Ich mag diese Lösung auch sehr, weil sie einfach funktioniert hat, ohne meine aktuelle vagabundierende SSH-Sitzung zu stoppen. Vielen Dank!
Rubix
Bravo! Dies ist genau das, wonach ich gesucht habe
Khan Shahrukh
Ausgezeichnet! ifconfigund ip addressbekam mir nicht das, was ich brauchte, netstat -rntat es aber.
Geerlingguy
9

Fügen Sie Ihrem ~/.ssh/configHost auf dem Host-Computer Folgendes hinzu :

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

Sie können von Vagrant aus auf einen Dienst am Hostcomputer-Port 52698 zugreifen, sofern Sie sich über angemeldet haben vagrant ssh.

Sie können bestätigen, dass es funktioniert, indem Sie es netstat -ltauf einer vagabundierenden VM ausführen und in den folgenden Zeilen eine Notiz machen:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
Stapler-Baka
quelle
2
+1 Das war eine große Hilfe für mich. Ich habe den angegebenen Text durch Port 5037 ersetzt, damit meine Vagrant-Box den Android-Emulator hören kann, der auf meiner Host-Box ausgeführt wird.
Rob
2

Ich kann über die lokale IP-Adresse (nicht über die Loopback-Adresse) auf Dienste zugreifen, die auf meinem Host-Computer ausgeführt werden. Ich habe getestet, indem ich einen http-Server auf Port 80 (und dann auf Port 987) erstellt und curl197.45.0.10:80 und 197.45.0.10:987 (die tatsächliche IP-Adresse wurde geändert, um die Unschuldigen zu schützen). Es hat beide Male funktioniert und ich habe keine spezielle Vagabundkonfiguration (kein öffentliches Netzwerk, kein weitergeleiteter Port) und obwohl ich einige Ports über PuTTY weitergeleitet habe, habe ich keine Ports 80 und 987 weitergeleitet. Versuchen Sie also möglicherweise, die lokale oder öffentliche IP-Adresse des Host-Computers zu verwenden.

Und wenn Sie von einer anderen aus auf eine Gast-Vagabund-Instanz zugreifen (ssh in diese zugreifen) möchten, können Sie public_networkPort 22 wie folgt aktivieren und weiterleiten Vagrantfile:

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

Solange dieser Port geöffnet ist (dh in Ihrer Routerkonfiguration weitere Portweiterleitungen durchführen), können Sie von überall auf diesen Computer zugreifen, auch von außen.

BT
quelle