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
enForwarded Ports
Las máquinas invitadas pueden acceder a los servicios que se ejecutan en la máquina host
Esta función resolvería tu problema.
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.
Seguro
Las máquinas externas no tienen forma de acceder a los servicios que se ejecutan en las máquinas invitadas
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 # 1config.vm.network :private_network, ip: "192.168.0.0"
# Vagrant Version # 2Tener esta línea en su
Vagrantfile
leVagrantfile
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.