Vagrant inverser la redirection de port?

je travaille sur une architecture de services web. J'ai un logiciel que je dois utiliser sur la machine hôte native, pas dans Vagrant. Mais j'aimerais que le service client s'occupe de l'invité.

Le paramètre

Vagrant config.vm.forwarded_port ouvrira un port sur l'hôte et enverra les données à l'invité. Mais comment puis-je ouvrir un port sur l'invité et envoyer les données à l'hôte? (C'est toujours port forwarding, mais dans la direction opposée.)

106
demandé sur Dan Fabulich 2013-04-27 00:20:46

5 réponses

quand vous lancez vagrant ssh , c'est en fait en utilisant cette commande sous-jacente:

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 supporte les ports de transit dans la direction que vous voulez avec l'option -R guestport:host:hostport . Ainsi, si vous vouliez vous connecter au port 12345 sur le client et le faire transmettre à localhost:80 , vous utiliseriez cette commande:

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

comme le commente correctement Eero, vous pouvez aussi utiliser la commande vagrant ssh -- -R 12345:localhost:80 , qui a le même effet dans une commande beaucoup plus concise.

118
répondu wlritchi 2013-07-16 16:24:44

Dans le livre Vagrant: Up and Running (Pub. date: 12 juin 2013), écrit par le créateur de Vagrant, il a mentionné qu'il n'est pas possible pour guest machine d'accéder aux services fonctionnant sur la machine hôte.

au lieu d'utiliser Forwarded Ports , vous pouvez configurer un réseau privé en utilisant Host-Only Networks .

  • avantages de l'utilisation Host-Only Networks au-dessus de Forwarded Ports

    1. Invité les machines peuvent accéder aux services tournant sur machine hôte

      cette fonctionnalité résoudrait votre problème.

    2. Invité machines peuvent accéder aux services en cours d'exécution sur les autres hôtes de la machine

      cette fonctionnalité est très utile pour séparer les services sur plusieurs machines afin d'imiter plus précisément un environnement de production.

    3. Sécurisé

      Les machines extérieures n'ont aucun moyen d'accéder aux services fonctionnant sur les machines invités

    4. moins de travail

      pas besoin de configurer chaque unique Forwarded Port


  • comment configurer 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

    avoir cette ligne dans votre Vagrantfile donnera l'instruction à vagrant de créer un réseau privé qui a une adresse IP statique: 192.168.0.0

    L'adresse IP de l'hôte est toujours la même adresse IP, mais avec l'octet final 1. Dans l'exemple précédent, la machine hôte aurait l'adresse IP 192.168.0.1 .

96
répondu Mingyu 2015-11-19 17:23:02

vous pouvez accéder aux ports sur la machine hôte via la passerelle par défaut à l'intérieur de l'OS invité. (Qui a typiquement une IP de 10.0.2.2 .)

par exemple, si vous avez un serveur web tournant sur le port 8000 de votre machine hôte...

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

vous pouvez y accéder à partir de L'intérieur de la VM Vagrant à 10.0.2.2:8000 (à condition que 10.0.2.2 soit l'adresse ip de la passerelle par défaut du client):

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

pour trouver L'IP de la passerelle par défaut à l'intérieur de l'OS invité, Lancez netstat -rn (ou ipconfig sur un invité Windows) et recherchez la ligne avec une adresse IP de destination de 0.0.0.0 (ou le champ étiqueté" passerelle par défaut "sur 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

vous pouvez extraire cette IP programmatiquement avec netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2 .

Sources: Comment faire pour se connecter à l'hôte de PostgreSQL à partir de vagrant virtualbox machine ; se Connecter à l'hôte machine d'un OS invité VirtualBox?

52
répondu Ajedi32 2017-05-23 11:55:19

ajouter ce qui suit à votre ~/.ssh/config sur la machine hôte:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

il vous permet d'accéder à un service sur le port machine hôte 52698 depuis Vagrant, aussi longtemps que vous vous êtes connecté via vagrant ssh .

vous pouvez confirmer que cela fonctionne en exécutant netstat -lt sur VM vagrant et en prenant une note sur les lignes suivantes:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
5
répondu stacker-baka 2015-12-24 16:20:16

je peux accéder aux services tournant sur ma machine hôte via son adresse IP locale (pas son adresse loopback). J'ai testé en créant un serveur http sur le port 80 (puis sur le port 987) et curl ing 197.45.0.10:80 et 197.45.0.10:987 (adresse ip réelle changée pour protéger les innocents). Cela a fonctionné les deux fois, et je n'ai pas de configuration vagabonde spéciale (Pas de réseau public_network, pas de forwarded_port) et bien que j'ai quelques ports transmis via PuTTY, Je n'ai pas les ports 80 et 987 transmis. Alors peut-être essayer d'utiliser l'adresse IP locale ou publique de la machine hôte.

et si vous voulez accéder (ssh) à une instance vagabonde invitée d'une autre instance, vous pouvez activer public_network ainsi que l'expédition à partir du port 22 dans le Vagrantfile comme ceci:

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

alors tant que ce port est ouvert (c'est-à-dire faire plus de redirection de port dans votre configuration de routeur) vous pouvez accéder à cette machine de n'importe où, même du monde extérieur.

2
répondu B T 2014-09-15 19:33:37