¿Reenvío de puerto inverso vagabundo?

121

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 al cliente en el invitado.

El config.vm.forwarded_portparámetro 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 un reenvío de puertos, pero en la dirección inversa).

Dan Fabulich
fuente
Dado que Vagrant está usando SSH, es teóricamente posible y la gema de implementación Ruby SSH lo admite, pero nunca vi nada como esto en el documento de Vagrant.
cmur2
Ver también: stackoverflow.com/q/19933550/1157054
Ajedi32

Respuestas:

134

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 el reenvío de puertos en la dirección que desee con la -R guestport:host:hostportopción. Por lo tanto, si desea conectarse al puerto 12345del invitado y reenviarlo 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 comenta correctamente Eero, también puedes usar el comando vagrant ssh -- -R 12345:localhost:80, que tiene el mismo efecto en un comando mucho más conciso.

wlritchi
fuente
67
y puede ejecutar esto de manera más simple usando vagrant ssh -- -R 12345:localhost:80 Esto sigue la sintaxis de la opción ssh -R [bind_address:] port: host: hostport , donde el primer número es el número de puerto para escuchar dentro de la máquina invitada, y los dos últimos son la dirección de servicio como visible desde la máquina host.
Eero
1
Por lo que tengo entendido, el reenvío inverso solo funciona en el shell ssh correspondiente. Creo que Dan Fabulich quería una solución sin la necesidad de ssh en la máquina virtual.
Alp
2
@Alp Creo que es un puerto disponible para todo el sistema, no solo disponible para el proceso ssh. ¡Funciona bien para mí!
Henrik Heimbuerger
1
Para aquellos que usan PuTTy, la sección SSH / Túneles de la interfaz gráfica de usuario de configuración permite el reenvío de puerto remoto (de ahí el -R en el comando) o el reenvío de puerto local (-L en la línea de comando)
Titou
3
O algo que tenga en cuenta la configuración potencialmente diferente del vagabundo si tiene varias configuraciones de vagabundo:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman
100

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 acceda a los servicios que se ejecutan en la máquina host.

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

  • Ventajas de usar Host-Only NetworksoverForwarded Ports

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

      Esta característica solucionaría su problema.

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

      Esta función es muy útil para separar servicios en varias máquinas para imitar con mayor precisión 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 uno Forwarded Port


  • Cómo configurar Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # Vagrant Versión # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Vagrant Versión # 2

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

    La dirección IP del host es siempre 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.

Mingyu
fuente
2
En la misma línea (también de Vagrant: Up and Running), podría configurar una red en puente. En una red con puente, otras máquinas de su red local pueden acceder a su máquina virtual y viceversa. Pero dado que la dirección IP se asigna a través de DHCP, tendría que hacerlo ifconfigen la máquina virtual para encontrar su dirección IP.
nucleartida
28
El hecho de que cuando configure config.vm.network: private_network, ip: "192.168.50.4" significa que el invitado accederá al host yendo a "192.168.50.1" es la información clave aquí. No puedo encontrar ese pequeño tidbit documentado en ninguna parte.
Nucleon
1
Encontré que el uso de la dirección de respuestas de 192.168.0.0no funcionó: curvar / hacer ping en la máquina host estaba dando como resultado una conexión t / o. El uso de la dirección de @ Nucleon (de acuerdo con los documentos de Vagrant sobre el tema) funcionó como se anunciaba.
markdsievers
8
@Mingyu No, el uso de su línea de configuración config.vm.network :private_network, ip: "192.168.0.0"y el encrespamiento / ping en el host generaba 192.168.0.1tiempos de espera de conexión. Configurando la red que se 192.168.50.4resolverá, es decir, host disponible en 192.168.50.1.
markdsievers
3
"192.168.0.0" no es un buen ejemplo, xxx0 normalmente es para transmisión
número 5
73

Puede acceder a los puertos de la máquina host a través de la puerta de enlace predeterminada dentro del sistema operativo invitado. (Que normalmente 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 a él desde el interior de la máquina virtual Vagrant en 10.0.2.2:8000(siempre que 10.0.2.2sea ​​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 ipconfigen un invitado de Windows) y busque la fila con una 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 esta IP mediante programación con netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2.

Fuentes: Cómo conectarse con el host PostgreSQL desde la máquina virtualbox vagabunda ; ¿Conectarse a la máquina host desde un SO invitado de VirtualBox?

Ajedi32
fuente
También me gusta mucho esta solución porque simplemente funcionó sin siquiera detener mi sesión ssh vagabunda actual. ¡Gracias!
Rubix
¡Bravo! esto es exactamente lo que estaba buscando
Khan Shahrukh
¡Excelente! ifconfigy ip addressno me estaban consiguiendo lo que necesitaba, pero lo netstat -rnhice.
geerlingguy
9

Agregue lo siguiente a su ~/.ssh/configen 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 52698 de la máquina host de Vagrant, siempre que haya iniciado sesión a través de vagrant ssh.

Puede confirmar que funciona ejecutando una netstat -ltmáquina virtual vagabunda y tomando nota de las siguientes líneas:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
apilador-baka
fuente
2
+1 Esto fue de gran ayuda para mí. Agregué el texto dado reemplazándolo por el puerto 5037 para permitir que mi caja vagabunda pueda escuchar el emulador de Android que se ejecuta en mi caja de host.
robo el
2

Puedo acceder a los servicios que se ejecutan en mi máquina host a través de su dirección IP local (no su dirección de bucle de retorno). curlProbé creando un servidor http en el puerto 80 (y luego en el puerto 987) y en 197.45.0.10:80 y 197.45.0.10:987 (la dirección IP real cambió para proteger a los inocentes). Funcionó en ambas ocasiones, y no tengo ninguna configuración especial de vagabundos (ni red_pública, ni puerto_enviado) y aunque tengo algunos puertos reenviados a través de PuTTY, no tengo reenviados los puertos 80 y 987. Entonces, tal vez intente usar la dirección IP pública o local de la máquina host.

Y si desea acceder (ssh a) una instancia de vagabundo invitado desde otra, puede habilitar public_network y reenviar desde el puerto 22 de la Vagrantfilesiguiente manera:

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

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

BT
fuente