web-dev-qa-db-fra.com

Transfert de port inverse vagabond?

Je travaille sur une architecture de services Web. Certains logiciels doivent être exécutés sur la machine hôte native, mais pas dans Vagrant. Mais je voudrais exécuter des services à la clientèle sur l'invité.

Le paramètre config.vm.forwarded_port De Vagrant 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? (Il s'agit toujours d'une redirection de port, mais en sens inverse.)

115
Dan Fabulich

Quand vous courez vagrant ssh, il utilise 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 [email protected]

SSH prend en charge la redirection de ports dans la direction souhaitée avec le -R guestport:Host:hostport option. Donc, si vous voulez vous connecter au port 12345 sur l'invité et le faire transférer à 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 [email protected]

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

126
wlritchi

Dans le livre Vagrant: Up and Running (Date de publication: 12 juin 2013), écrit par le créateur de Vagrant, il a indiqué qu'il n'était pas possible pour la machine invitée d'accéder aux services s'exécutant sur la machine hôte.

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

  • Avantages d'utiliser Host-Only Networks plus de Forwarded Ports

    1. Les ordinateurs invités peuvent accéder aux services en cours d'exécution sur l'ordinateur hôte

      Cette fonctionnalité résoudrait votre problème.

    2. Les ordinateurs invités peuvent accéder aux services exécutés sur un autre ordinateur invité.

      Cette fonctionnalité est très utile pour séparer les services sur plusieurs machines afin de reproduire avec plus de précision un environnement de production.

    3. Garantir

      Les ordinateurs externes n'ont aucun moyen d'accéder aux services exécutés sur les ordinateurs invités

    4. Moins de travail

      Pas besoin de configurer chaque 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 demandera à vagrant de créer un réseau privé ayant une adresse IP statique: 192.168.0.0

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

97
Mingyu

Vous pouvez accéder aux ports de la machine hôte via la passerelle par défaut à l'intérieur du système d'exploitation invité. (Qui a généralement une adresse IP de 10.0.2.2.)

Par exemple, si un serveur Web s'exécute sur le port 8000 de votre ordinateur hôte ...

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

Vous pouvez y accéder depuis le vagabond VM à 10.0.2.2:8000 (à condition de 10.0.2.2 est l'adresse IP de la passerelle par défaut de l'invité):

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

Pour trouver l'adresse IP de la passerelle par défaut dans le système d'exploitation invité, exécutez netstat -rn (ou ipconfig sur un invité Windows) et recherchez la ligne avec une adresse IP de destination égale à 0.0.0.0 _ (ou le champ "Passerelle par défaut" sous 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 adresse IP par programme avec netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2.

Sources: Comment se connecter à l'hôte PostgreSQL à partir d'une machine virtuelle virtualisée vagabonde ; Connectez-vous à la machine hôte depuis un OS invité de VirtualBox?

63
Ajedi32

Ajoutez 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 52698 de la machine hôte depuis Vagrant, tant que vous vous êtes connecté via vagrant ssh.

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

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

Je peux accéder aux services en cours d'exécution sur mon ordinateur hôte via son adresse IP locale (pas son adresse de bouclage). J'ai testé en créant un serveur http sur le port 80 (puis sur le port 987) et curling 197.45.0.10:80 et 197.45.0.10:987 (l'adresse IP réelle a été modifiée pour protéger l'innocent). Cela a fonctionné les deux fois, et je n'ai pas de configuration vagabonde spéciale (pas de public_network, ni de forwarded_port) et, bien que certains ports soient transférés via PuTTY, les ports 80 et 987 ne sont pas transférés. Essayez donc d’utiliser l’adresse IP locale ou publique de la machine hôte.

Et si vous souhaitez accéder (en ssh à) une instance d'invité vagabond à une autre, vous pouvez activer public_network ainsi que le transfert depuis le port 22 dans le Vagrantfile comme ceci:

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

Ensuite, tant que ce port est ouvert (c.-à-d. Que vous effectuez davantage de redirection de port dans la configuration de votre routeur), vous pouvez accéder à cette machine depuis n'importe où, même le monde extérieur.

2
B T