Precisa fazer o adaptador em ponte somente no Vagrant, sem NAT

32

Então, estou tendo problemas com uma configuração vagante de 'hashicorp / precise64' no meu livro MAC.

Primeiro, minha configuração:

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

Esta é a saída do 'vagrant up'

==> default: Attempting graceful shutdown of VM...
==> default: Checking if box 'hashicorp/precise64' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
GuestAdditions 4.3.10 running --- OK.
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/garthm/Projects/vagrant
==> default: Machine already provisioned. Run 'vagrant provision' or use the '--provision'
==> default: to force provisioning. Provisioners marked to run always will still run.

'ifconfig' mostra o seguinte:

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  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe88:ca6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:725 errors:0 dropped:0 overruns:0 frame:0
          TX packets:544 errors:0 dropped:0 overruns:0 carrier:0
          collisions: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  Mask:255.255.248.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3490 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:345981 (345.9 KB)  TX bytes:1102 (1.1 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Meu problema é que, que eu posso fazer o ping da VM da minha máquina host (IP: 10.0.24.112), outras pessoas podem pingar minha minha VM também (10.0.24.XXX), minha VM pode pingar meu devbox (IP : 10.10.116.254), eu posso pingar outras configurações de máquinas virtuais de desenvolvedores do meu devbox (não Vagrant, IP: 10.10.116.254), mas eu não posso pingar minha VM do meu devbox e outro desenvolvedor não pode ping minha VM da sua devbox.

As configurações da máquina virtual que eles têm é apenas com uma placa de rede em ponte, mas o vagrant por algum motivo tem um NAT e uma ponte, embora eu tenha especificado bridge na configuração. Como você pode ver, existem dois endereços IP para a VM do Vagrant, o que não parece certo. Você também pode, quando é inicializado, fazer um redirecionamento de porta no Adaptador 1, que é o adaptador NAT, o que significa que ele está usando o adaptador NAT por padrão para tudo.

Como posso me livrar do adaptador NAT e usar apenas pontes?

Se eu editar as configurações do VirtualBox e desabilitar o adaptador NAT, haverá apenas o Adaptador em ponte e inicializará a caixa via VirtualBox (ou seja: não usando vagrant up), então ele terá apenas eth0 com um endereço IP que seja pingável do meu devbox, que é o que estou procurando. Se eu tentar e vagrant up a caixa depois de editar as configurações do VirtualBox e desabilitar o adaptador NAT, recebo o seguinte erro:

There was an error while executing 'VBoxManage', a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

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

Stderr: VBoxManage: error: A NAT rule of this name already exists
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component NATEngine, interface INATEngine, callee nsISupports
VBoxManage: error: Context: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at line 1655 of file VBoxManageModifyVM.cpp

Se eu imediatamente fizer um vagrant novamente, ele reativou o adaptador NAT novamente e voltamos a ter o mesmo problema novamente.

    
por SynackSA 13.05.2014 / 16:19

4 respostas

18

eth0 como NAT é um requisito fundamental do Vagrant em seu estado atual . Mas você pode substituir a configuração do roteador padrão por eth1 .

Dos documentos do Vagrant :

Default Router

Depending on your setup, you may wish to manually override the default router configuration. This is required if you need access the Vagrant box from other networks over the public network. To do so, you can use a shell provisioner script:

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

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

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

# delete default gw on eth0
config.vm.provision "shell",
  run: "always",
  inline: "eval 'route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }''"

Note the above is fairly complex and may be guest OS specific, but we document the rough idea of how to do it because it is a common question.

    
por 10.09.2015 / 17:40
8

(Desculpe, completamente ingênuo sobre vagrant / virtualbox, então perdoe a falta de terminologia de rede adequada)

Sua escolha de bridge: en4) Thunderbolt é provavelmente o problema.

Aqui está o que eu suponho que você quer / precisa, em vez do que você pediu:

  • Capacidade de login SSH para o vagrant controlar sua vm, a partir de sua caixa dev (o host). É isso que o NAT com o encaminhamento de porta faz. Isso não estraga mais nada, então pedir que ele se foi não é tão útil assim. E isso aparece no adaptador 1 no VirtualBox.

  • Conectividade da sua LAN, em vez de apenas seu host. Vamos dizer algo no intervalo 192.168.1.xxx. Isso é o que é importante no Adaptador 2.

  • Você apenas se preocupa com sua placa de rede / placa de rede normal e não tem nenhum motivo específico para executar a Ethernet em sua porta Thunderbolt.

i.e. basicamente o que você obteria de um VirtualBox vm com Bridged e nenhum Vagrant para ser visto.

Aqui está um ifconfig SSH de uma dessas máquinas do VirtualBox que eu tenho na minha LAN. Ele executa um servidor da Web ao qual eu posso me conectar e meu Mac pode conectá-lo a um banco de dados. Eu vou chamar de referência .

[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

No VirtualBox, o painel Network, para essa referência vm, mostra Adapter1 como Bridged. Todos os outros adaptadores estão desativados.

OK, agora vou tentar o mesmo resultado de conectividade de LAN do Vagrant, mas aceito que eu tenha um NAT no adaptador 1, que é o mecanismo de comunicação ssh do vagrant.

Tente # 1 - que falha.

O ponto de partida é um init vagrant .

Então no Vagrantfile, eu mudei apenas 2 coisas:

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

se eu vagrant up , eu recebo uma caixa de diálogo perguntando qual interface usar:

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

Agora, olhando para ele, eu escolhi pela primeira vez 2) porque eu pensei que queria Ethernet e bem, 1) parecia 'muito Apple'.

Isso funciona, mas com uma entrada IP 10.0.xx.xx inadequada, na qual o ISP bloqueia, veja abaixo. Eu acho que eles realmente querem dizer público quando diz rede pública.

vagrant 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

Tente # 2 - versão correta

vagrant halt , exclua o diretório, crie-o novamente e vagrant init . (Descobri que mexer demais com a rede poderia confundir o vagabundo e / ou o virtualbox que uma remoção e reinicialização completas consertariam)

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

Mas, desta vez, escolha 1) en1: Wi-Fi (AirPort).

vagrant ssh

Essa eth1 com 192.168.1.123 parece muito mais legal, não é?

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, de fato, posso fazer o ping 192.168.1.123 da minha referência vm ou de outra máquina física na minha 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, o VirtualBox mostra um NAT no Adaptador 1 e um Bridged no Adaptador 2.

Configuração final -

Adicionado seleção automática da interface, bem como um IP estático (que você não precisa). Problema resolvido, pelo menos para mim.

  config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)', ip: "192.168.1.201"
    
por 21.05.2015 / 22:19
4

A resposta curta parece ser não.

Você pode substituir o adaptador 1, mas espera problemas pelo menos com 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

Produz:

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

Infelizmente, parece bloquear a configuração do adaptador de rede, mas talvez você tenha mais sorte do que eu.

Se você puder, sempre poderá forçar a interrupção e recarregar com um ssh.host corrigido. Como alternativa, ouvi falar de vagrant dns , mas nunca tentei.

    
por 14.08.2014 / 02:11
2

Eu encontrei esta discussão no StackOverflow.

Para mim, foi o suficiente para abrir o Vagrantfile relacionado e descomentar a seguinte linha:

config.vm.network "public_network"

e, em seguida, execute vagrant reload

    
por 14.05.2014 / 23:15

Tags