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.)
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.
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 deForwarded Ports
-
Invité les machines peuvent accéder aux services tournant sur machine hôte
cette fonctionnalité résoudrait votre problème.
-
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.
-
Sécurisé
Les machines extérieures n'ont aucun moyen d'accéder aux services fonctionnant sur les machines invités
-
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 #1config.vm.network :private_network, ip: "192.168.0.0"
# Vagrant Version #2avoir 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
.
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?
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
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.