41 votes

Besoin de faire uniquement un adaptateur ponté dans Vagrant, pas de NAT

Donc, j'ai un problème avec une configuration Vagrant de 'hashicorp/precise64' sur mon MAC book.

Tout d'abord, ma configuration :

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

Voici la sortie de 'vagrant up'

\==> default: Tentative d'arrêt en douceur de la VM...
==> default: Vérification si la box 'hashicorp/precise64' est à jour...
==> default: Nettoyage des ports déjà configurés...
==> default: Nettoyage des interfaces réseau déjà configurées...
==> default: Préparation des interfaces réseau en fonction de la configuration...
    default: Adapteur 1: nat
    default: Adapteur 2: ponté
==> default: Redirection des ports...
    default: 22 => 2222 (adapteur 1)
==> default: Démarrage de la VM...
==> default: Attente du démarrage de la machine. Cela peut prendre quelques minutes...
    default: Adresse SSH : 127.0.0.1:2222
    default: Nom d'utilisateur SSH : vagrant
    default: Méthode d'authentification SSH : clé privée
    default: Attention : Délai de connexion dépassé. Nouvelle tentative...
==> default: Machine démarrée et prête !
GuestAdditions 4.3.10 en cours d'exécution --- OK.
==> default: Vérification des additions invitées dans la VM...
==> default: Configuration et activation des interfaces réseau...
==> default: Montage des dossiers partagés...
    default: /vagrant => /Users/garthm/Projects/vagrant
==> default: Machine déjà provisionnée. Exécutez \`vagrant provision\` ou utilisez \`--provision\`
==> default: pour forcer la provision. Les provisionneurs marqués pour fonctionner toujours seront toujours exécutés.

'ifconfig' montre ce qui suit :

vagrant@mddirector:~$ ifconfig
eth0      Lien encap:Ethernet  AdresseHW 08:00:27:88:0c:a6
          adr inet:10.0.2.15  Bcast:10.0.2.255  Masque:255.255.255.0
          adr inet6: fe80::a00:27ff:fe88:ca6/64 Portée:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Mȧtrique:1
          RX paquets:725 erreurs:0 pertes:0 dépassements:0 cadre:0
          TX paquets:544 erreurs:0 pertes:0 dépassements:0 porteur:0
          collisions:0 longueur file attente:1000
          RX octets:90824 (90.8 Ko)  TX octets:63375 (63.3 Ko)

eth1      Lien encap:Ethernet  AdresseHW 08:00:27:2f:bb:6a
          adr inet:10.0.24.118  Bcast:10.0.31.255  Masque:255.255.248.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Mȧtrique:1
          RX paquets:3490 erreurs:0 pertes:0 dépassements:0 cadre:0
          TX paquets:7 erreurs:0 pertes:0 dépassements:0 porteur:0
          collisions:0 longueur file attente:1000
          RX octets:345981 (345.9 Ko)  TX octets:1102 (1.1 Ko)

lo        Lien encap:Boucle locale
          adr inet:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Portée:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Mȧtrique:1
          RX paquets:0 erreurs:0 pertes:0 dépassements:0 cadre:0
          TX paquets:0 erreurs:0 pertes:0 dépassements:0 porteur:0
          collisions:0 longueur file attente:0
          RX octets:0 (0.0 o)  TX octets:0 (0.0 o)

Mon problème est que je peux pinguer la VM depuis mon ordinateur hôte (IP: 10.0.24.112), d'autres personnes peuvent aussi pinger ma VM (10.0.24.XXX), ma VM peut pinger mon devbox (IP: 10.10.116.254), je peux pinger les setups de machine virtuelle d'autres développeurs depuis mon devbox (pas Vagrant, IP: 10.10.116.254), mais je ne peux pas pinger ma VM depuis mon devbox et les autres développeurs ne peuvent pas pinger ma VM depuis leur devbox.

Les setups de machine virtuelle qu'ils ont sont avec uniquement une carte NIC pontée, mais pour une raison quelconque, le Vagrant a à la fois une NAT et une carte pontée, même si j'ai spécifié ponté dans la configuration. Comme vous pouvez le voir, il y a deux adresses IP pour la VM Vagrant, ce qui ne semble pas correct. De plus, lorsque la VM démarre, elle effectue un renvoi de port sur l'Adaptateur 1, qui est l'adaptateur NAT, ce qui signifie qu'il semble utiliser l'adaptateur NAT par défaut pour tout.

Comment puis-je me débarrasser de l'adaptateur NAT et utiliser uniquement le mode ponté ?

Si je modifie les paramètres de VirtualBox et désactive l'adaptateur NAT, de sorte qu'il n'y ait que l'Adaptateur ponté et que je démarre la boîte via VirtualBox (c'est-à-dire pas en utilisant 'vagrant up'), alors il n'y a qune eth0 avec une adresse IP pingable depuis mon devbox, ce que je cherche. Si j'essaie de faire un 'vagrant up' après avoir modifié les paramètres de VirtualBox et désactivé l'adaptateur NAT, je reçois l'erreur suivante :

Une erreur s'est produite lors de l'exécution de \`VBoxManage\`, une CLI utilisée par Vagrant pour contrôler VirtualBox. La commande et stderr sont affichés ci-dessous.

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

Stderr : VBoxManage: erreur: Une règle NAT de ce nom existe déjà
VBoxManage: erreur: Détails: code NS\_ERROR\_INVALID\_ARG (0x80070057), composant NATEngine, interface INATEngine, appelant nsISupports
VBoxManage: erreur: Contexte: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at line 1655 of file VBoxManageModifyVM.cpp

Si je fais immédiatement un 'vagrant up' à nouveau, l'adaptateur NAT est réactivé, et nous retrouvons le même problème à nouveau.

27voto

ostrokach Points 555

eth0 en tant que NAT est une exigence fondamentale de Vagrant dans son état actuel. Mais vous pouvez remplacer la configuration du routeur par défaut pour eth1.

Depuis la documentation de Vagrant:

Routeur par défaut

En fonction de votre configuration, vous souhaiterez peut-être remplacer manuellement la configuration du routeur par défaut. Cela est nécessaire si vous avez besoin d'accéder à la boîte Vagrant depuis d'autres réseaux via le réseau public. Pour ce faire, vous pouvez utiliser un script provisionneur shell :

config.vm.network "public\_network", ip: "192.168.0.17"

# routeur par défaut
config.vm.provision "shell",
  run: "always",
  inline: "route add default gw 192.168.0.1"

# routeur par défaut ipv6
config.vm.provision "shell",
  run: "always",
  inline: "route -A inet6 add default gw fc00::1 eth1"

# supprimer le routeur par défaut sur 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; }'\`"

Remarque : ce qui précède est assez complexe et peut dépendre du système d'exploitation invité, mais nous documentons l'idée générale de comment le faire car c'est une question fréquente.

12voto

JL Peyret Points 783

(Désolé, assez naïf sur vagrant/virtualbox donc pardonnez le manque de terminologie réseau appropriée)

Votre choix de pont: en4) Thunderbolt est très probablement le problème.

Voici ce que je suppose que vous voulez / avez besoin, plutôt que ce que vous avez demandé:

  • Capacité de connexion SSH pour vagrant pour contrôler votre machine virtuelle, depuis votre machine de développement (l'hôte). C'est ce que fait le NAT avec le renvoi de port. Cela ne perturbe rien d'autre, donc demander à ce qu'il soit supprimé n'est pas très utile. Et cela apparaît sur l'Adaptateur 1 dans VirtualBox.

  • Connectivité depuis votre LAN, plutôt que seulement depuis votre hôte. Disons quelque chose dans la plage 192.168.1.xxx. C'est ce qui est important, sur l'Adaptateur 2.

  • Vous vous souciez simplement de votre carte NIC réseau normale et n'avez aucune raison particulière de faire fonctionner l'Ethernet sur votre port Thunderbolt.

c'est-à-dire à peu près ce que vous obtiendriez d'une vm VirtualBox avec Ponté et sans Vagrant à voir.

Voici un ifconfig SSH à partir de l'une de ces machines uniquement VirtualBox que j'ai sur mon LAN. Il exécute un serveur web auquel je peux me connecter et mon Mac peut s'y connecter en SSH et se connecter à une base de données dessus. Je vais l'appeler la référence.

[root@fdm ~]# ifconfig
eth0      Lien encap:Ethernet  Adresse MAC 08:00:27:9A:85:1A
          Adresse IP:192.168.1.143  Bcast:192.168.1.255  Masque:255.255.255.0

Dans VirtualBox, le panneau Réseau, pour cette vm de référence, montre Adapter1 comme Ponté. Tous les autres adaptateurs sont désactivés.

OK, je vais maintenant essayer d'obtenir ce même résultat de connectivité LAN à partir de Vagrant, mais j'accepte d'avoir un NAT sur l'adaptateur 1, c'est le mécanisme de communication ssh vagrant-VB.

Essai n°1 - qui échoue.

Le point de départ est un vagrant init.

Ensuite, dans le Vagrantfile, je n'ai changé que 2 choses:

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

si je lance vagrant up, j'obtiens une boîte de dialogue demandant quelle interface utiliser:

==> default: Interfaces réseau Pontées disponibles :
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en3: Thunderbolt 1
4) p2p0
5) bbptp0
6) bridge0

Maintenant, en regardant cela, j'ai d'abord choisi 2) car je pensais vouloir l'Ethernet et bon, 1) semblait 'trop Apple'.

Cela fonctionne, mais avec une entrée IP inadaptée 10.0.xx.xx, que mon FAI bloque les pings, voir ci-dessous. Je suppose qu'ils veulent vraiment dire réseau public quand il dit réseau public.

vagrant ssh

vagrant@vagrant:~$ ifconfig
eth0      Lien encap:Ethernet  Adresse MAC 08:00:27:0c:41:3e
          Adresse IP:10.0.2.15  Bcast:10.0.2.255  Masque:255.255.255.0
          Adresse IPv6: fe80::a00:27ff:fe0c:413e/64 Scope:Lien

eth1      Lien encap:Ethernet  Adresse MAC 08:00:27:ca:f4:64
          Adresse IPv6: fe80::a00:27ff:feca:f464/64 Scope:Lien

Essai n°2 - version correcte

vagrant halt, puis supprimer le répertoire, le recréer et vagrant init. (J'ai trouvé que le fait de trop jouer avec le réseau pouvait perturber le vagrant et/ou virtualbox, ce qu'une suppression complète et un redémarrage pouvaient résoudre)

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

Mais, cette fois, choisissez 1) en1: Wi-Fi (AirPort).

vagrant ssh

Cette eth1 avec 192.168.1.123 a l'air bien mieux, n'est-ce pas ?

vagrant@vagrant:~$ ifconfig
eth0      Lien encap:Ethernet  Adresse MAC 08:00:27:0c:41:3e
          Adresse IP:10.0.2.15  Bcast:10.0.2.255  Masque:255.255.255.0

eth1      Lien encap:Ethernet  Adresse MAC 08:00:27:53:6e:1d
          Adresse IP:192.168.1.123  Bcast:192.168.1.255  Masque:255.255.255.0

Et en effet, je peux pinguer 192.168.1.123 depuis ma vm de référence, ou depuis une autre machine physique sur mon LAN.

[root@fdm ~]# ping 192.168.1.123
PING 192.168.1.123 (192.168.1.123) 56(84) bytes de données.
64 octets de 192.168.1.123 : icmp_seq=1 ttl=64 temps=1039 ms
64 octets de 192.168.1.123 : icmp_seq=2 ttl=64 temps=40.4 ms

Pour information, VirtualBox montre un NAT sur l'Adaptateur 1 et un Ponté sur l'Adaptateur 2.

Configuration finale -

Ajout d'une sélection automatique de l'interface ainsi qu'une IP statique (dont vous n'avez pas besoin). Problème résolu, du moins pour moi.

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

ÉDIT 201902 : sur ma dernière construction, vagrant/virtualbox se plaignaient de ne pas trouver Wifi (Airport):

==> default: Pont spécifique 'en1: Wi-Fi (AirPort)' introuvable. On peut vous demander de spécifier
==> default: à quel réseau se connecter en pont.
==> default: Interfaces réseau Pontées disponibles :
1) en0: Ethernet
2) en2: Thunderbolt 1
3) bridge0

je l'ai changé en

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

Je mettrai à jour plus tard si quelque chose se présente, mais j'ai pensé mettre à jour la partie sur le nom de l'adaptateur.

5voto

La réponse courte semble être de ne pas le faire.

Vous pouvez remplacer l'adaptateur 1 mais attendez-vous à des problèmes au moins avec 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"

  # Au cas où vous avez mal spécifié l'hôte...
  config.vm.boot_timeout = 30
  config.vm.provider "virtualbox" do |vb, override|
       vb.gui = true
  end

  config.ssh.host = '192.168.148.24'

end

Produit:

Mise en route de la machine 'default' avec le fournisseur 'virtualbox'...
==> default: Suppression des interfaces réseau précédemment définies...
==> default: Préparation des interfaces réseau en fonction de la configuration...
    default: Adaptateur 1: ponté
==> default: Redirection des ports...
    default: 22 => 2222 (adaptateur 1)
    default: L'adaptateur VirtualBox #1 n'est pas configuré en "NAT". Ignorer les redirections de ports sur cet adaptateur.
==> default: Exécution des personnalisations de pré-démarrage de la machine virtuelle...
==> default: Démarrage de la VM...

Malheureusement, il semble alors se bloquer lors de la configuration de l'adaptateur réseau, mais peut-être aurez-vous plus de chance que moi.

Si vous en avez, vous pouvez toujours forcer l'arrêt et recharger avec un ssh.host corrigé. Alternativement, j'ai entendu parler de vagrant dns mais je ne l'ai jamais essayé.

3voto

Secto Kia Points 101

J'ai trouvé cette discussion sur StackOverflow.

Pour moi, il a suffi d'ouvrir le Vagrantfile associé et de décommenter la ligne suivante :

config.vm.network "public_network"

puis d'exécuter vagrant reload.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X