Necesita hacer un adaptador en puente solo en Vagrant, sin NAT

35

Así que estoy teniendo problemas con una configuración Vagrant de 'hashicorp / precise64' en mi libro MAC.

Primero, mi configuración:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure (VAGRANTFILE_API_VERSION) hacer | config |
  config.vm.box = "hashicorp / precise64"
  config.vm.network "public_network", tipo: "dhcp",: bridge => 'en4: Thunderbolt Ethernet'
  config.vm.hostname = "mddirector"
fin

Esta es la salida del 'vagabundo'

==> predeterminado: Intento de apagado correcto de VM ...
==> predeterminado: Comprobando si la casilla 'hashicorp / precise64' está actualizada ...
==> predeterminado: borrando cualquier puerto reenviado establecido previamente ...
==> predeterminado: Borrar cualquier interfaz de red establecida previamente ...
==> predeterminado: Preparando interfaces de red basadas en la configuración ...
    predeterminado: Adaptador 1: nat
    predeterminado: Adaptador 2: puenteado
==> predeterminado: reenvío de puertos ...
    predeterminado: 22 => 2222 (adaptador 1)
==> predeterminado: Arrancando VM ...
==> predeterminado: esperando que la máquina arranque. Esto puede tomar unos pocos minutos...
    predeterminado: dirección SSH: 127.0.0.1:2222
    predeterminado: nombre de usuario SSH: vagabundo
    predeterminado: método de autenticación SSH: clave privada
    predeterminado: Advertencia: Tiempo de espera de conexión. Reintentando ...
==> predeterminado: máquina arrancada y lista!
GuestAdditions 4.3.10 en ejecución --- OK.
==> predeterminado: Buscando adiciones de invitados en VM ...
==> predeterminado: Configuración del nombre de host ...
==> predeterminado: configurar y habilitar interfaces de red ...
==> predeterminado: Montaje de carpetas compartidas ...
    valor predeterminado: / vagrant => / Users / garthm / Projects / vagrant
==> predeterminado: máquina ya aprovisionada. Ejecute `disposición vagabunda` o use el` --provision`
==> predeterminado: para forzar el aprovisionamiento. Los aprovisionadores marcados para ejecutarse siempre se ejecutarán.

'ifconfig' muestra lo siguiente:

vagabundo @ mddirector: ~ $ ifconfig
eth0 Enlace de enlace: Ethernet HWaddr 08: 00: 27: 88: 0c: a6
          inet addr: 10.0.2.15 Bcast: 10.0.2.255 Máscara: 255.255.255.0
          inet6 addr: fe80 :: a00: 27ff: fe88: ca6 / 64 Alcance: Enlace
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrica: 1
          Paquetes RX: 725 errores: 0 descartados: 0 desbordamientos: 0 trama: 0
          Paquetes TX: 544 errores: 0 descartados: 0 desbordamientos: 0 operador: 0
          colisiones: 0 txqueuelen: 1000
          RX bytes: 90824 (90.8 KB) TX bytes: 63375 (63.3 KB)

eth1 Link encap: Ethernet HWaddr 08: 00: 27: 2f: bb: 6a
          inet addr: 10.0.24.118 Bcast: 10.0.31.255 Máscara: 255.255.248.0
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrica: 1
          Paquetes RX: 3490 errores: 0 descartados: 0 desbordamientos: 0 trama: 0
          Paquetes TX: 7 errores: 0 descartados: 0 desbordamientos: 0 operador: 0
          colisiones: 0 txqueuelen: 1000
          RX bytes: 345981 (345.9 KB) TX bytes: 1102 (1.1 KB)

lo Link encap: Loopback local
          inet addr: 127.0.0.1 Máscara: 255.0.0.0
          inet6 addr: :: 1/128 Ámbito: Host
          UP LOOPBACK RUNNING MTU: 16436 Métrica: 1
          Paquetes RX: 0 errores: 0 descartados: 0 desbordamientos: 0 trama: 0
          Paquetes TX: 0 errores: 0 descartados: 0 desbordamientos: 0 operador: 0
          colisiones: 0 txqueuelen: 0
          RX bytes: 0 (0.0 B) TX bytes: 0 (0.0 B)

Mi problema es que puedo hacer ping a la VM desde mi máquina host ( IP: 10.0.24.112), otras personas también pueden hacer ping a mi VM ( 10.0.24.XXX), mi VM puede hacer ping a mi devbox ( IP: 10.10.116.254), puedo hacer ping a otras configuraciones de máquinas virtuales de desarrolladores desde mi devbox ( no Vagrant, IP: 10.10.116.254), pero no puedo hacer ping a mi VM desde mi devbox y otros desarrolladores no pueden hacer ping a mi VM desde su devbox.

La configuración de la máquina virtual que tienen es solo con una NIC Bridged, pero el vagabundo por alguna razón tiene NAT y Bridged, aunque he especificado bridged en la configuración. Como puede ver, hay dos direcciones IP para la máquina virtual Vagrant, lo que no parece correcto. También puede, cuando se inicia, hace un puerto hacia adelante en el Adaptador 1, que es el adaptador NAT, lo que significa que parece que está usando el adaptador NAT de forma predeterminada para todo.

¿Cómo me deshago del adaptador NAT y uso solo puenteado?

Si edito la configuración de VirtualBox y deshabilito el adaptador NAT, por lo que solo está el Adaptador en puente y arranco la caja a través de VirtualBox (es decir: no usa vagrant up), entonces solo tiene eth0 con una dirección IP que se puede hacer ping desde mi devbox , que es lo que estoy buscando. Si trato de vagar el cuadro después de editar la configuración de VirtualBox y deshabilitar el adaptador NAT, aparece el siguiente error:

Se produjo un error al ejecutar `VBoxManage`, una CLI utilizada por Vagrant
para controlar VirtualBox. El comando y stderr se muestran a continuación.

Comando: ["modifyvm", "7f1c12f7-74cd-4c6b-aa5a-16d6209cf2b3", "--natpf1", "ssh, tcp, 127.0.0.1,2222,, 22"]

Stderr: VBoxManage: error: ya existe una regla NAT de este nombre
VBoxManage: error: Detalles: código NS_ERROR_INVALID_ARG (0x80070057), componente NATEngine, interfaz INATEngine, llamada nsISupports
VBoxManage: error: Contexto: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUInt16 (strGuestPort))" at línea 1655 del archivo VBoxManageModifyVM.cpp

Si vuelvo a hacer un vagabundo inmediatamente, ha vuelto a habilitar el adaptador NAT nuevamente, y volvemos a tener el mismo problema nuevamente.

SynackSA
fuente

Respuestas:

21

eth0como NAT es un requisito fundamental de Vagrant en su estado actual . Pero puede anular la configuración predeterminada del enrutador para eth1.

De los documentos de Vagrant :

Enrutador predeterminado

Dependiendo de su configuración, es posible que desee anular manualmente la configuración predeterminada del enrutador. Esto es necesario si necesita acceder al cuadro Vagrant desde otras redes a través de la red pública . Para hacerlo, puede usar un script de aprovisionamiento de shell:

config.vm.network "public_network", ip: "192.168.0.17"

# enrutador predeterminado
config.vm.provision "shell",
  ejecutar: "siempre",
  en línea: "ruta agregar gw predeterminado 192.168.0.1"

# router predeterminado ipv6
config.vm.provision "shell",
  ejecutar: "siempre",
  en línea: "route -A inet6 add default gw fc00 :: 1 eth1"

# eliminar gw predeterminado en eth0
config.vm.provision "shell",
  ejecutar: "siempre",
  en línea: "eval` route -n | awk '{if ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") print \ "route del default gw \" $ 2;}' `"

Tenga en cuenta que lo anterior es bastante complejo y puede ser específico del SO huésped, pero documentamos la idea aproximada de cómo hacerlo porque es una pregunta común.

Ostrokach
fuente
9

(Lo siento, bastante ingenuo sobre vagrant / virtualbox, así que perdona la falta de una terminología de red adecuada)

Su elección de puente: en4) Thunderbolt es muy probablemente el problema.

Esto es lo que supongo que quieres / necesitas, en lugar de lo que pediste:

  • Capacidad de inicio de sesión SSH para vagabundos para controlar su vm, desde su caja de desarrollo (el host). Eso es lo que hace el NAT con el reenvío de puertos. No ensucia nada más, por lo que pedir que desaparezca no es tan útil. Y eso aparece en el Adaptador 1 en VirtualBox.

  • Conectividad desde su LAN, en lugar de solo su host. Digamos algo en el rango 192.168.1.xxx. Eso es lo importante, en el Adaptador 2.

  • Solo le importa su tarjeta de red / NIC normal y no tiene ningún motivo particular para ejecutar Ethernet a través de su puerto Thunderbolt.

es decir, más o menos lo que obtendría de un VirtualBox vm con Bridged y sin Vagrant para ser visto.

Aquí hay un ifconfig SSH de una de esas máquinas de VirtualBox que tengo en mi LAN. Ejecuta un servidor web al que me puedo conectar y mi Mac puede usar SSH y conectarse a una base de datos. Lo llamaré la referencia .

[root@fdm ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:9A:85:1A
          inet addr:192.168.1.143  Bcast:192.168.1.255  Mask:255.255.255.0

En VirtualBox, el panel Red, para esa referencia vm, muestra el Adaptador1 como puenteado. Todos los demás adaptadores están deshabilitados.

Bien, ahora voy a tratar de obtener el mismo resultado de conectividad LAN de Vagrant, pero acepto que tendré un NAT en el adaptador 1, ese es el mecanismo de comunicación ssh vagrant-VB.

Prueba # 1, que falla.

El punto de partida es un vagabundo init .

Luego, en Vagrantfile, cambié solo 2 cosas:

config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"

si vagano esto, aparece un cuadro de diálogo que me pregunta qué interfaz usar:

==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en3: Thunderbolt 1
4) p2p0
5) bbptp0
6) bridge0

Ahora, mirándolo, primero elegí 2) porque pensé que quería Ethernet y bueno, 1) parecía 'demasiado Apple'.

Esto funciona, pero con una entrada de IP 10.0.xx.xx inadecuada, en la que mi ISP bloquea los pings, consulte a continuación. Supongo que realmente se refieren a público cuando dice red pública.

ssh vagabundo

vagrant@vagrant:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:0c:41:3e
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe0c:413e/64 Scope:Link

eth1      Link encap:Ethernet  HWaddr 08:00:27:ca:f4:64
          inet6 addr: fe80::a00:27ff:feca:f464/64 Scope:Link

Prueba # 2 - versión correcta

detener vagabundo , luego elimine el directorio, créelo nuevamente e inicie vagabundo . (Descubrí que jugar demasiado con la red podría confundir al vagabundo y / o al virtualbox que solucionaría una eliminación completa y un reinicio)

config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"

Pero, esta vez, elige 1) en1: Wi-Fi (AirPort).

ssh vagabundo

Ese eth1 con 192.168.1.123 se ve mucho mejor, ¿no?

vagrant@vagrant:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:0c:41:3e
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0

eth1      Link encap:Ethernet  HWaddr 08:00:27:53:6e:1d
          inet addr:192.168.1.123  Bcast:192.168.1.255  Mask:255.255.255.0

Y, de hecho, puedo hacer ping a 192.168.1.123 desde mi vm de referencia o desde otra máquina física en mi LAN.

[root@fdm ~]# ping 192.168.1.123
PING 192.168.1.123 (192.168.1.123) 56(84) bytes of data.
64 bytes from 192.168.1.123: icmp_seq=1 ttl=64 time=1039 ms
64 bytes from 192.168.1.123: icmp_seq=2 ttl=64 time=40.4 ms

FWIW, VirtualBox muestra un NAT en el adaptador 1 y un puente en el adaptador 2.

Configuración final

Se agregó una selección automática de la interfaz, así como una IP estática (que no necesita). Problema resuelto, al menos para mí.

  config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)', ip: "192.168.1.201"

EDITAR 201902: en mi última compilación, vagrant / virtualbox se quejaba de que no se encontró Wifi (Aeropuerto) :

==> default: Specific bridge 'en1: Wi-Fi (AirPort)' not found. You may be asked to specify
==> default: which network to bridge to.
==> default: Available bridged network interfaces:
1) en0: Ethernet
2) en2: Thunderbolt 1
3) bridge0

lo cambió a

config.vm.network "public_network", bridge: "bridge0"

Se actualizará más tarde si surge algo, pero pensé en actualizar el bit sobre el nombre del adaptador.

JL Peyret
fuente
su respuesta merece más crédito, tan simple de agregar un adaptador adicional que ni siquiera obtuve el menú (solo tengo 1 tarjeta activa).
Glenn Plas
4

La respuesta corta parece ser no.

Puede anular el adaptador 1 pero esperar problemas al menos con vagrant ssh

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.network "public_network", :adapter=>1 , type: "dhcp", :bridge => 'en4: Thunderbolt Ethernet'
  config.vm.hostname = "mddirector"

  # In case you get the host wrong...
  config.vm.boot_timeout = 30
  config.vm.provider "virtualbox" do |vb, override|
       vb.gui = true
  end

  config.ssh.host = '192.168.148.24'

end

Produce:

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: bridged
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
    default: VirtualBox adapter #1 not configured as "NAT". Skipping port
    default: forwards on this adapter.
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...

Desafortunadamente, parece bloquear la configuración del adaptador de red, pero tal vez tenga más suerte que yo.

Si lo hace, siempre puede forzar la detención y la recarga con una corrección ssh.host. Alternativamente, he oído hablar de él vagrant dnspero nunca lo he intentado.

KCD
fuente
3

Encontré esta discusión en StackOverflow.

Para mí, fue suficiente para abrir lo relacionado Vagrantfiley descomentar la siguiente línea:

config.vm.network "public_network"

y luego correr vagrant reload

Tyler
fuente
2
Si observa mi configuración de Vagrantfile, verá que la configuración ya está allí.
SynackSA
¡Oh, lo siento! Me lo perdí.
Tyler
3
Creo que siempre tendrá una conexión NAT porque cuando haces ssh vagabundos o cualquier aprovisionamiento, siempre va a acceder a través de 127.0.0.1:2222 o cualquier puerto que envíe a 22 en la casilla de invitado.
Hayden
Esta es la respuesta correcta para mí. solo agrega un nic
Glenn Plas