network create vagrant portforwarding

vagrant - create - ¿Reenvío de puerto inverso vago?



vagrant sync (5)

Estoy trabajando en una arquitectura de servicios web. Tengo un software que necesito ejecutar en la máquina host nativa, no en Vagrant. Pero me gustaría ejecutar algunos servicios de cliente en el invitado.

El parámetro config.vm.forwarded_port de Vagrant abrirá un puerto en el host y enviará los datos al invitado. Pero, ¿cómo puedo abrir un puerto en el invitado y enviar los datos al host? (Sigue siendo reenvío de puertos, pero en dirección inversa).


Agregue lo siguiente a su ~/.ssh/config en la máquina host:

Host 127.0.0.1 RemoteForward 52698 127.0.0.1:52698

Le permite acceder a un servicio en el puerto de máquina host 52698 desde Vagrant, siempre que haya iniciado sesión a través de vagrant ssh .

Puede confirmar que funciona ejecutando netstat -lt en VM vagabunda y tomando una nota en las siguientes líneas:

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


Cuando ejecuta vagrant ssh , en realidad está usando este comando subyacente:

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 admite puertos de reenvío en la dirección que desee con la -R guestport:host:hostport . Por lo tanto, si desea conectarse al puerto 12345 del invitado y reenviarlo a localhost:80 , debe usar este comando:

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]

Como Eero comenta correctamente, también puede usar el comando vagrant ssh -- -R 12345:localhost:80 , que tiene el mismo efecto en un comando mucho más conciso.


En el libro Vagrant: Up and Running (fecha de publicación: 12 de junio de 2013), escrito por el creador de Vagrant, mencionó que no es posible que la máquina invitada tenga acceso a los servicios que se ejecutan en la máquina host.

En lugar de utilizar Forwarded Ports , puede configurar una red privada utilizando Host-Only Networks .

  • Ventajas de usar Host-Only Networks en Forwarded Ports

    1. Las máquinas invitadas pueden acceder a los servicios que se ejecutan en la máquina host

      Esta función resolvería tu problema.

    2. Las máquinas invitadas pueden acceder a los servicios que se ejecutan en otra máquina invitada

      Esta característica es muy útil para separar servicios en varias máquinas para imitar de forma más precisa un entorno de producción.

    3. Seguro

      Las máquinas externas no tienen forma de acceder a los servicios que se ejecutan en las máquinas invitadas

    4. Menos trabajo

      No es necesario configurar cada Forwarded Port

  • Cómo configurar 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

    Tener esta línea en su Vagrantfile le Vagrantfile a vagabundo que cree una red privada que tenga una dirección IP estática: 192.168.0.0

    La dirección IP del host siempre es la misma dirección IP pero con el octeto final como 1. En el ejemplo anterior, la máquina host tendría la dirección IP 192.168.0.1 .


Puede acceder a los puertos en la máquina host a través de la puerta de enlace predeterminada dentro del sistema operativo invitado. (Que típicamente tiene una IP de 10.0.2.2 .)

Por ejemplo, si tiene un servidor web ejecutándose en el puerto 8000 en su máquina host ...

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

Puede acceder desde dentro de la VM Vagrant a 10.0.2.2:8000 (siempre que 10.0.2.2 sea ​​la ip de la puerta de enlace predeterminada del invitado):

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

Para encontrar la IP de la puerta de enlace predeterminada dentro del sistema operativo invitado, ejecute netstat -rn (o ipconfig en un invitado de Windows) y busque la fila con una dirección IP de destino de 0.0.0.0 (o el campo etiquetado como "Puerta de enlace predeterminada" en 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

Puede extraer este IP programáticamente con netstat -rn | grep "^0.0.0.0 " | tr -s '' '' | cut -d " " -f2 netstat -rn | grep "^0.0.0.0 " | tr -s '' '' | cut -d " " -f2 netstat -rn | grep "^0.0.0.0 " | tr -s '' '' | cut -d " " -f2 .

Fuentes: cómo conectarse con el host PostgreSQL desde la máquina virtual de vagabundo ; ¿Conectarse a la máquina host desde un sistema operativo invitado VirtualBox?


Puedo acceder a los servicios que se ejecutan en mi equipo host a través de su dirección IP local (no su dirección de bucle invertido). Probé creando un servidor http en el puerto 80 (y luego en el puerto 987) y cursando 197.45.0.10:80 y 197.45.0.10:987 (la dirección IP real cambió para proteger a los inocentes). Funcionó las dos veces, y no tengo ninguna configuración de vagabundo especial (no public_network, no forwarded_port) y aunque tengo algunos puertos reenviados a través de PuTTY, no tengo los puertos 80 y 987 reenviados. Así que tal vez intente usar la dirección IP local o pública de la máquina host.

Y si quiere acceder (ssh into) a una instancia vagabundante de otro, puede habilitar public_network así como reenviar desde el puerto 22 en el Vagrantfile esta manera:

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

Luego, siempre que ese puerto esté abierto (es decir, haga un poco más de reenvío de puertos en la configuración de su enrutador), puede acceder a esa máquina desde cualquier lugar, incluso en el mundo exterior.