È necessario eseguire l'adattatore con ponte solo in Vagrant, senza NAT


36

Quindi sto riscontrando problemi con una configurazione di Vagrant di "hashicorp / precise64" sul mio libro MAC.

Innanzitutto, la mia configurazione:

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

Questo è il sostegno del "vagabondo in su"

==> impostazione predefinita: tentativo di arresto regolare della VM ...
==> impostazione predefinita: verifica se la casella "hashicorp / precise64" è aggiornata ...
==> impostazione predefinita: cancellazione di tutte le porte inoltrate precedentemente impostate ...
==> impostazione predefinita: cancellazione di eventuali interfacce di rete precedentemente impostate ...
==> impostazione predefinita: preparazione delle interfacce di rete in base alla configurazione ...
    impostazione predefinita: adattatore 1: nat
    impostazione predefinita: adattatore 2: a ponte
==> impostazione predefinita: porte di inoltro ...
    impostazione predefinita: 22 => 2222 (adattatore 1)
==> impostazione predefinita: avvio VM ...
==> impostazione predefinita: in attesa dell'avvio della macchina. Questo potrebbe richiedere alcuni minuti...
    impostazione predefinita: indirizzo SSH: 127.0.0.1:2222
    impostazione predefinita: nome utente SSH: vagabondo
    impostazione predefinita: metodo di autenticazione SSH: chiave privata
    impostazione predefinita: avviso: timeout della connessione. Nuovo tentativo ...
==> impostazione predefinita: macchina avviata e pronta!
GuestAdditions 4.3.10 in esecuzione --- OK.
==> impostazione predefinita: verifica aggiunte guest nella VM ...
==> impostazione predefinita: impostazione del nome host ...
==> impostazione predefinita: configurazione e abilitazione delle interfacce di rete ...
==> impostazione predefinita: montaggio cartelle condivise ...
    impostazione predefinita: / vagrant => / Users / garthm / Projects / vagrant
==> impostazione predefinita: macchina già fornita. Esegui `vagrant provision` o usa` --provision`
==> impostazione predefinita: per forzare il provisioning. I fornitori contrassegnati per l'esecuzione continueranno comunque.

'ifconfig' mostra quanto segue:

vagrant @ mddirector: ~ $ ifconfig
eth0 Link encap: Ethernet HWaddr 08: 00: 27: 88: 0c: a6
          inet addr: 10.0.2.15 Bcast: 10.0.2.255 Maschera: 255.255.255.0
          inet6 addr: fe80 :: a00: 27ff: fe88: ca6 / 64 Ambito: collegamento
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Sistema metrico: 1
          Pacchetti RX: 725 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
          Pacchetti TX: 544 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
          collisioni: 0 txqueuelen: 1000
          Byte RX: 90824 (90,8 KB) Byte TX: 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 Maschera: 255.255.248.0
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Sistema metrico: 1
          Pacchetti RX: 3490 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
          Pacchetti TX: 7 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
          collisioni: 0 txqueuelen: 1000
          Byte RX: 345981 (345,9 KB) Byte TX: 1102 (1,1 KB)

lo Link encap: Local Loopback
          inet addr: 127.0.0.1 Maschera: 255.0.0.0
          inet6 addr: :: 1/128 Ambito: host
          UP LOOPBACK RUNNING MTU: 16436 Metrico: 1
          Pacchetti RX: 0 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
          Pacchetti TX: 0 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
          collisioni: 0 txqueuelen: 0
          Byte RX: 0 (0,0 B) Byte TX: 0 (0,0 B)

Il mio problema è che, se posso eseguire il ping della VM dal mio computer host ( IP: 10.0.24.112), anche altre persone possono eseguire il ping della mia VM ( 10.0.24.XXX), la mia VM può eseguire il ping del mio devbox ( IP: 10.10.116.254), posso eseguire il ping delle impostazioni di altre macchine virtuali degli sviluppatori dal mio devbox ( non Vagrant IP: 10.10.116.254), ma non riesco a eseguire il ping della mia VM dal mio devbox e altri sviluppatori non possono eseguire il ping della mia VM dal loro devbox.

Le configurazioni della macchina virtuale che hanno sono solo con una NIC con bridge, ma il vagabondo per qualche motivo ha sia un NAT che un bridge, anche se ho specificato il bridge nella configurazione. Come puoi vedere, ci sono due indirizzi IP per la VM Vagrant, che non sembra giusto. Puoi anche, quando si avvia, fa un port forwarding sull'adattatore 1, che è l'adattatore NAT, il che significa che sembra che stia usando l'adattatore NAT per impostazione predefinita per tutto.

Come posso eliminare l'adattatore NAT e utilizzare solo il bridge?

Se modifico le impostazioni di VirtualBox e disabilito l'adattatore NAT, quindi c'è solo l'adattatore con ponte e avvio la scatola tramite VirtualBox (cioè: non usando Vagrant up), allora ha solo eth0 con un indirizzo IP che è pingabile dal mio devbox , che è quello che sto cercando. Se provo a vagare nella casella dopo aver modificato le impostazioni di VirtualBox e disabilitato l'adattatore NAT, ottengo il seguente errore:

Si è verificato un errore durante l'esecuzione di `VBoxManage`, una CLI utilizzata da Vagrant
per il controllo di VirtualBox. Il comando e stderr sono mostrati di seguito.

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

Stderr: VBoxManage: errore: esiste già una regola NAT con questo nome
VBoxManage: errore: Dettagli: codice NS_ERROR_INVALID_ARG (0x80070057), componente NATEngine, interfaccia INATEngine, chiamata nsISupports
VBoxManage: errore: Contesto: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUInt16 (strGuestPort)" riga 1655 del file VBoxManageModifyVM.cpp

Se eseguo di nuovo immediatamente un vagabondo, ha riabilitato nuovamente l'adattatore NAT e torniamo di nuovo ad avere lo stesso problema.

Risposte:


21

eth0poiché NAT è un requisito fondamentale di Vagrant nel suo stato attuale . Ma puoi sovrascrivere la configurazione del router predefinita per eth1.

Dai documenti di Vagrant :

Router predefinito

A seconda della configurazione, è possibile che si desideri sostituire manualmente la configurazione del router predefinita. Ciò è necessario se è necessario accedere alla casella Vagrant da altre reti sulla rete pubblica . Per fare ciò, è possibile utilizzare uno script del provisioner di shell:

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

# router predefinito
config.vm.provision "shell",
  run: "sempre",
  inline: "route add default gw 192.168.0.1"

# router predefinito ipv6
config.vm.provision "shell",
  run: "sempre",
  inline: "route -A inet6 aggiungi default gw fc00 :: 1 eth1"

# elimina gw predefinito su eth0
config.vm.provision "shell",
  run: "sempre",
  inline: "eval` route -n | awk '{if ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") stampa \ "route del default gw \" $ 2;}' `"

Si noti che quanto sopra è abbastanza complesso e potrebbe essere specifico del SO guest, ma documentiamo l'idea approssimativa di come farlo perché è una domanda comune.


9

(Siamo spiacenti, abbastanza ingenui riguardo a Vagrant / Virtualbox, quindi perdona la mancanza di una terminologia di rete adeguata)

La scelta del bridge: en4) Il fulmine è molto probabilmente il problema.

Ecco cosa presumo tu voglia / desideri, piuttosto che quello che hai chiesto:

  • Funzionalità di accesso SSH per Vagrant per controllare la tua VM, dalla tua casella di sviluppo (l'host). Questo è ciò che fa il NAT con port forwarding. Non rovina nient'altro, quindi chiedere che scompaia non è poi così utile. E questo si presenta sull'adattatore 1 in VirtualBox.

  • Connettività dalla tua LAN, piuttosto che solo dal tuo host. Diciamo qualcosa nell'intervallo 192.168.1.xxx. Questo è ciò che è importante, sull'adattatore 2.

  • Ti preoccupi solo della tua normale scheda di rete / scheda di rete e non hai motivi particolari per eseguire Ethernet sulla porta Thunderbolt.

cioè praticamente quello che otterresti da un VirtualBox VM con Bridged e nessun Vagrant da vedere.

Ecco un ifconfig SSH da una di quelle macchine VirtualBox che ho sulla mia LAN. Esegue un server Web a cui posso connettermi e il mio Mac può SSH in esso e connettersi a un database su di esso. Lo chiamerò il riferimento .

[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

In VirtualBox, il pannello Rete, per quel riferimento vm, mostra Adapter1 come Bridged. Tutti gli altri adattatori sono disabilitati.

OK, quindi ora proverò per lo stesso risultato di connettività LAN da Vagrant, ma accetto che avrò un NAT all'adattatore 1, questo è il meccanismo di comunicazione ssh vagrant-VB.

Prova # 1 - che non riesce.

Il punto di partenza è un init vagabondo .

Quindi in Vagrantfile, ho cambiato solo 2 cose:

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

se lo vagabondo , ricevo una finestra di dialogo che chiede quale interfaccia usare:

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

Ora, guardandolo, per prima cosa ho scelto 2) perché pensavo di volere Ethernet e bene, 1) sembrava "troppo Apple".

Funziona, ma con una voce IP 10.0.xx.xx non adatta, su cui il mio ISP blocca i ping, vedi sotto. Immagino che significhino davvero pubblico quando dice rete pubblica.

vagabondo ssh

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

Prova # 2 - versione corretta

vagrant halt , quindi eliminare la directory, crearla nuovamente e vagrant init . (Ho scoperto che pasticciare troppo con la rete potrebbe confondere il vagabondo e / o la virtualbox che una correzione completa e il riavvio avrebbero risolto)

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

Ma, questa volta, scegli 1) en1: Wi-Fi (AirPort).

vagabondo ssh

Che eth1 con 192.168.1.123 sembra molto più bello, vero?

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

E, in effetti, posso eseguire il ping 192.168.1.123 dal mio vm di riferimento o da un'altra macchina fisica sulla mia 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 mostra un NAT sull'adattatore 1 e un bridge sull'adattatore 2.

Installazione finale -

Aggiunta la selezione automatica dell'interfaccia e un IP statico (che non è necessario). Problema risolto, almeno per me.

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

EDIT 201902: nella mia ultima build, vagrant / virtualbox si lamentavano del fatto che Wifi (Aeroporto) non veniva trovato:

==> 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

cambiato in

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

Si aggiornerà più tardi se dovesse succedere qualcosa, ma ho pensato di aggiornare il bit sul nome dell'adattatore.


la sua risposta merita più credito, così semplice aggiungere un adattatore aggiuntivo, non ho nemmeno ottenuto il menu (ho solo 1 carta attiva).
Glenn Plas,

4

La risposta breve sembra essere no.

È possibile ignorare l'adattatore 1 ma ci si aspetta almeno problemi 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...

Sfortunatamente sembra quindi bloccare la configurazione della scheda di rete, ma forse avrai più fortuna di me.

Se lo fai puoi sempre forzare l'arresto e ricaricare con una correzione ssh.host. In alternativa, ne ho sentito parlare vagrant dnsma non l' ho mai provato.


3

Ho trovato questa discussione su StackOverflow.

Per me, è stato sufficiente aprire il relativo Vagrantfile e decommentare la seguente riga:

config.vm.network "public_network"

e poi corri vagrant reload


2
Se guardi la mia configurazione di Vagrantfile, vedrai che l'impostazione di configurazione è già presente.
SynackSA

Oh scusa! Ho perso questo.
Tyler,

3
Credo che avrà sempre una connessione NAT perché quando fai un sagrato o qualsiasi provisioning, accederà sempre attraverso 127.0.0.1:2222 o qualunque porta lo inoltri a 22 sulla casella guest.
Hayden,

Questa è la risposta perfetta per me. aggiunge solo un bel
Glenn Plas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.