Precisa fazer o adaptador de ponte apenas no Vagrant, sem NAT

36

Portanto, estou tendo problemas com a configuração do Vagrant de 'hashicorp / precision64' no meu livro do MAC.

Primeiro, minha configuração:

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

Esta é a saída do 'vagabundo para cima'

==> padrão: Tentativa de desligamento normal da VM ...
==> padrão: Verificando se a caixa 'hashicorp / precision64' está atualizada ...
==> padrão: Limpando todas as portas encaminhadas definidas anteriormente ...
==> padrão: Limpando as interfaces de rede definidas anteriormente ...
==> padrão: Preparando interfaces de rede com base na configuração ...
    padrão: adaptador 1: nat
    padrão: Adaptador 2: em ponte
==> padrão: portas de encaminhamento ...
    padrão: 22 => 2222 (adaptador 1)
==> padrão: Inicializando a VM ...
==> padrão: Aguardando a inicialização da máquina. Isso pode levar alguns minutos...
    padrão: endereço SSH: 127.0.0.1:2222
    padrão: nome de usuário SSH: vagrant
    padrão: método de autenticação SSH: chave privada
    padrão: Aviso: Tempo limite da conexão. Tentando novamente ...
==> padrão: Máquina inicializada e pronta!
GuestAdditions 4.3.10 em execução --- OK.
==> padrão: Verificando adições de convidados na VM ...
==> padrão: Definindo o nome do host ...
==> padrão: configurando e ativando interfaces de rede ...
==> padrão: Montando pastas compartilhadas ...
    padrão: / vagrant => / Usuários / garthm / Projetos / vagrant
==> padrão: a máquina já provisionada. Execute `vagrant provision` ou use o` --provision`
==> padrão: para forçar o provisionamento. Os provisionadores marcados para executar sempre ainda serão executados.

'ifconfig' mostra o seguinte:

vagrant @ mddirector: ~ $ ifconfig
eth0 Encap do link: 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
          Endereço do inet6: fe80 :: a00: 27ff: fe88: ca6 / 64 Escopo: Link
          UP BROADCAST EM FUNCIONAMENTO MULTICAST MTU: 1500 Métrico: 1
          Pacotes RX: 725 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
          Pacotes TX: 544 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
          colisões: 0 txqueuelen: 1000
          Bytes RX: 90824 (90,8 KB) Bytes TX: 63375 (63,3 KB)

Encaminhamento de link eth1: 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 EM FUNCIONAMENTO MULTICAST MTU: 1500 Métrico: 1
          Pacotes RX: 3490 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
          Pacotes TX: 7 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
          colisões: 0 txqueuelen: 1000
          Bytes RX: 345981 (345,9 KB) Bytes TX: 1102 (1,1 KB)

lo Encap do link: Loopback local
          inet addr: 127.0.0.1 Máscara: 255.0.0.0
          inet6 addr: :: 1/128 Escopo: Host
          UP LOOPBACK EM FUNCIONAMENTO MTU: 16436 Métrico: 1
          Pacotes RX: 0 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
          Pacotes TX: 0 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
          colisões: 0 txqueuelen: 0
          Bytes RX: 0 (0,0 B) Bytes TX: 0 (0,0 B)

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

As configurações da máquina virtual que eles possuem são apenas com uma NIC em ponte, mas por algum motivo o vagabundo tem uma NAT e uma ponte, embora eu tenha especificado a ponte na configuração. Como você pode ver, existem dois endereços IP para a VM Vagrant, o que não parece certo. Você também pode, quando inicializar, executar uma porta para frente no adaptador 1, que é o adaptador NAT, o que significa que parece que ele está usando o adaptador NAT por padrão para tudo.

Como faço para me livrar do adaptador NAT e usar apenas ponte?

Se eu editar as configurações do VirtualBox e desativar o adaptador NAT, houver apenas o adaptador em ponte e inicializar a caixa via VirtualBox (ou seja: não usar o vagrant up), ele só terá eth0 com um endereço IP que pode ser pingado no meu devbox , que é o que estou procurando. Se eu tentar vagar pela caixa depois de editar as configurações do VirtualBox e desativar o adaptador NAT, recebo o seguinte erro:

Ocorreu um erro ao executar o `VBoxManage`, uma CLI usada pelo Vagrant
para controlar o VirtualBox. O comando e stderr são mostrados abaixo.

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

Stderr: VBoxManage: erro: Já existe uma regra NAT com esse nome
VBoxManage: error: Detalhes: código NS_ERROR_INVALID_ARG (0x80070057), componente NATEngine, interface INATEngine, chamada nsISupports
VBoxManage: error: Contexto: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUInt16 (strGuestPort)" em linha 1655 do arquivo VBoxManageModifyVM.cpp

Se eu imediatamente voltar a vagar, ele reativou o adaptador NAT novamente e voltamos a ter o mesmo problema novamente.

SynackSA
fonte

Respostas:

21

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

Dos documentos do Vagrant :

Roteador padrão

Dependendo da sua configuração, você pode substituir manualmente a configuração padrão do roteador. Isso é necessário se você precisar acessar a caixa do Vagrant de outras redes pela rede pública . Para fazer isso, você pode usar um script de provisionador de shell:

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

# roteador padrão
config.vm.provision "shell",
  executar: "sempre",
  inline: "route add default gw 192.168.0.1"

# roteador padrão ipv6
config.vm.provision "shell",
  executar: "sempre",
  inline: "rota -A inet6 adiciona o padrão gw fc00 :: 1 eth1"

# delete gw padrão em eth0
config.vm.provision "shell",
  executar: "sempre",
  inline: "eval` rota -n | awk '{if ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") print \ "rota do padrão gw \" $ 2;}' '"

Observe que o acima é bastante complexo e pode ser específico do SO convidado, mas documentamos a ideia aproximada de como fazê-lo, porque é uma pergunta comum.

ostrokach
fonte
9

(Desculpe, ingênuo quanto ao vagrant / virtualbox, perdoe a falta de terminologia de rede adequada)

Sua escolha da ponte: en4) Thunderbolt provavelmente é o problema.

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

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

  • Conectividade da sua LAN, e não apenas do seu host. Digamos algo no intervalo 192.168.1.xxx. Isso é importante no Adaptador 2.

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

ou seja, praticamente o que você obteria de um VirtualBox vm com Bridged e sem Vagrant a ser visto.

Aqui está um ifconfig SSH de uma daquelas máquinas do VirtualBox que eu tenho na minha LAN. Ele executa um servidor Web ao qual eu posso conectar e meu Mac pode fazer o SSH nele e conectar-se a um banco de dados. 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 Rede, para essa referência vm, mostra Adaptador1 como Ponte. Todos os outros adaptadores estão desativados.

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

Tente # 1 - que falha.

O ponto de partida é um init vagante .

Então, no Vagrantfile, mudei apenas duas coisas:

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

se eu vagar por isso, 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 achava que queria Ethernet e, bem, 1) parecia 'muito Apple'.

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

vagabundo 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 muito com a rede poderia confundir o vagrant e / ou o virtualbox que uma remoção e reinicialização completas corrigiam)

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

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

vagabundo ssh

Esse eth1 com 192.168.1.123 parece muito melhor, 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 executar ping em 192.168.1.123 na minha referência vm ou em 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 (do qual 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"

EDIT 201902: na minha versão mais recente, o vagrant / virtualbox estava reclamando que o Wifi (aeroporto) não foi encontrado:

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

mudou para

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

Será atualizado mais tarde se surgir algo, mas pensei em atualizar o pouco sobre o nome do adaptador.

JL Peyret
fonte
a resposta dele merece mais crédito, tão simples de adicionar um adaptador extra que eu nem recebi o menu (só tenho 1 cartão ativo).
Glenn Plas
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 que a configuração do adaptador de rede está bloqueada, mas talvez você tenha mais sorte do que eu.

Se fizer isso, você sempre pode forçar a parada e recarregar com uma correção ssh.host. Alternativamente, eu ouvi falar, vagrant dnsmas nunca tentei.

KCD
fonte
3

Eu encontrei esta discussão no StackOverflow.

Para mim, bastava abrir o relacionado Vagrantfilee descomentar a seguinte linha:

config.vm.network "public_network"

e depois corra vagrant reload

Tyler
fonte
2
Se você olhar para a minha configuração do Vagrantfile, verá que a configuração já está lá.
SynackSA
Oh, desculpe! Eu senti falta disso.
Tyler #
3
Acredito que sempre haverá uma conexão NAT, porque quando você faz ssh vagrant ou qualquer provisionamento, sempre acessa através de 127.0.0.1:2222 ou qualquer porta que for encaminhada para 22 na caixa de convidados.
Hayden
Este é um ponto de resposta para mim. apenas adiciona um nic
Glenn Plas