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


36

J'ai donc des problèmes avec une configuration Vagrant de 'hashicorp / precise64' sur mon carnet MAC.

Tout d'abord, ma config:

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

C'est le oupput du vagabond

==> défaut: tentative d'arrêt en douceur de la machine virtuelle ...
==> défaut: Vérifier si la case 'hashicorp / precise64' est à jour ...
==> défaut: effacer tous les ports transférés précédemment définis ...
==> défaut: effacer toutes les interfaces réseau précédemment définies ...
==> défaut: préparer les interfaces réseau en fonction de la configuration ...
    défaut: Adaptateur 1: nat
    défaut: Adaptateur 2: ponté
==> défaut: Transfert des ports ...
    valeur par défaut: 22 => 2222 (adaptateur 1)
==> défaut: démarrage de la machine virtuelle ...
==> défaut: En attente de démarrage de la machine. Cela peut prendre quelques minutes...
    valeur par défaut: adresse SSH: 127.0.0.1:2222
    défaut: SSH nom d'utilisateur: vagrant
    valeur par défaut: méthode d'authentification SSH: clé privée
    défaut: Avertissement: délai de connexion. Réessayer ...
==> défaut: machine démarrée et prête!
GuestAdditions 4.3.10 en cours d'exécution --- OK.
==> default: Vérification des ajouts d'invités dans VM ...
==> défaut: Définition du nom d'hôte ...
==> défaut: configuration et activation des interfaces réseau ...
==> défaut: Monter les dossiers partagés ...
    défaut: / vagrant => / Users / garthm / Projects / vagrant
==> défaut: machine déjà approvisionnée. Lancer `vagrant provision` ou utiliser le` --provision`
==> défaut: pour forcer le provisioning. Les approvisionneurs marqués pour être exécutés continueront toujours à fonctionner.

'ifconfig' montre ce qui suit:

vagrant @ mddirector: ~ $ ifconfig
eth0 Encapsulation de lien: Ethernet HWaddr 08: 00: 27: 88: 0c: a6
          inet addr: 10.0.2.15 Bcast: 10.0.2.255 Masque: 255.255.255.0
          inet6 addr: fe80 :: a00: 27ff: fe88: ca6 / 64 Portée: lien
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrique: 1
          Paquets RX: 725 erreurs: 0 lâchés: 0 dépassements: 0 trame: 0
          Paquets TX: 544 erreurs: 0 abandonnées: 0 dépassements: 0 opérateur: 0
          collisions: 0 txqueuelen: 1000
          Octets RX: 90824 (90,8 Ko) Octets TX: 63375 (63,3 Ko)

eth1 Lien encapsulé: Ethernet HWaddr 08: 00: 27: 2f: bb: 6a
          inet addr: 10.0.24.118 Bcast: 10.0.31.255 Masque: 255.255.248.0
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrique: 1
          Paquets RX: 3490 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
          Paquets TX: 7 erreurs: 0 abandonnées: 0 dépassements: 0 transporteur: 0
          collisions: 0 txqueuelen: 1000
          Octets de réception: 345981 (345,9 Ko) Octets de transmission: 1102 (1,1 Ko)

lo Link encap: Local Loopback
          inet addr: 127.0.0.1 Masque: 255.0.0.0
          inet6 addr: :: 1/128 Portée: hôte
          UP LOOPBACK RUNNING MTU: 16436 Métrique: 1
          Paquets RX: 0 erreurs: 0 abandonnées: 0 dépassements: 0 image: 0
          Paquets TX: 0 erreurs: 0 abandonnées: 0 dépassements: 0 transporteur: 0
          collisions: 0 txqueuelen: 0
          Octets RX: 0 (0.0 B) Octets TX: 0 (0.0 B)

Mon problème est que, si je peux envoyer un ping à la machine virtuelle depuis ma machine hôte ( IP: 10.0.24.112), d’autres personnes peuvent aussi envoyer un ping à ma machine virtuelle ( 10.0.24.XXX), ma machine virtuelle peut envoyer un ping à ma devbox ( IP: 10.10.116.254), je peux envoyer une requête ping aux configurations de machines virtuelles des autres développeurs pas Vagrant, IP: 10.10.116.254), mais je ne peux pas cingler ma VM depuis ma devbox et les autres développeurs ne peuvent pas cingler ma VM depuis leur devbox.

Les configurations de la machine virtuelle qu'ils ont est uniquement avec une carte réseau pontée, mais pour une raison quelconque, le vagabond a un NAT et un pont, même si j'ai spécifié ponté dans la configuration. Comme vous pouvez le constater, il existe deux adresses IP pour la machine virtuelle vagabonde, ce qui ne semble pas correct. Vous pouvez également, lors du démarrage, effectuer un transfert de port sur l'adaptateur 1, qui correspond à l'adaptateur NAT, ce qui signifie qu'il sonne comme s'il utilisait l'adaptateur NAT par défaut pour tout.

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

Si j'édite les paramètres de VirtualBox et si je 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: ne pas utiliser vagrant), alors il n'y a qu'un eth0 avec une adresse IP qui est pingable depuis ma devbox , c'est ce que je cherche. Si j'essaie de vagabonder dans la boîte après avoir modifié les paramètres de VirtualBox et désactivé l'adaptateur NAT, j'obtiens le message d'erreur suivant:

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 illustrés ci-dessous.

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

Stderr: VBoxManage: error: une règle NAT de ce nom existe déjà
VBoxManage: erreur: Détails: code NS_ERROR_INVALID_ARG (0x80070057), composant NATEngine, interface INATEngine, appelé nsISupports
VBoxManage: error: Context: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUInt16 (strGuestPort)) ligne 1655 du fichier VBoxManageModifyVM.cpp

Si je refais immédiatement un vagabond, il a réactivé l'adaptateur NAT, et nous avons de nouveau le même problème.

Réponses:


21

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

De la documentation vagabonde :

Routeur par défaut

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

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

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

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

# efface le gw par défaut sur eth0
config.vm.provision "shell",
  run: "toujours",
  inline: "eval` route -n | awk '{if ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") print \ "route del default gw \" $ 2;}' `"

Notez que ce qui précède est assez complexe et peut être spécifique à un système d’exploitation invité, mais nous documentons l’idée approximative de la procédure à suivre car c’est une question courante.


9

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

Votre choix de pont: en4) Thunderbolt est 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 permettant à vagrant de contrôler votre machine virtuelle, à partir de votre boîte de dev (l’hôte). C'est ce que fait le NAT avec la redirection de port. Cela ne gache rien d'autre, donc demander qu'il soit parti n'est pas très utile. Et cela apparaît sur l'adaptateur 1 de VirtualBox.

  • Connectivité à partir de votre réseau local plutôt que simplement de 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 juste de votre carte réseau / NIC normale et n'avez aucune raison particulière de faire fonctionner Ethernet sur votre port Thunderbolt.

c'est-à-dire à peu près ce que vous obtiendrez d'une machine virtuelle VirtualBox avec Bridged et sans Vagrant.

Voici un ifconfig SSH à partir de l’une de ces machines VirtualBox que j’ai sur mon réseau local. Il exécute un serveur Web auquel je peux me connecter et mon Mac peut utiliser une connexion SSH et se connecter à une base de données. Je l'appellerai la référence .

[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

Dans VirtualBox, le panneau Réseau, pour cette référence vm, indique que Adapter1 est ponté. Tous les autres adaptateurs sont désactivés.

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

Essayez n ° 1 - qui échoue.

Le point de départ est un init vagabond .

Puis dans Vagrantfile, je n’ai changé que 2 choses:

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

si je vagabonde là-dessus , je reçois un dialogue demandant quelle interface utiliser:

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

Maintenant, en le regardant, j'ai d'abord choisi 2) parce que je pensais que je voulais Ethernet et bien, 1) semblait 'trop Apple'.

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

ssh vagabond

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

Essayez # 2 - version correcte

arrêt vagabond , puis supprimez le répertoire, créez-le à nouveau et init vagrant . (J'ai constaté que jouer trop avec le réseau pouvait confondre le vagabond et / ou la virtualbox, ce que corrigeraient une suppression et un redémarrage complets)

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

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

ssh vagabond

Que eth1 avec 192.168.1.123 semble beaucoup plus agréable, n'est-ce pas?

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

Et, en effet, je peux envoyer une requête ping à 192.168.1.123 à partir de ma machine virtuelle de référence ou d'une autre machine physique de mon réseau local.

[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 affiche un NAT sur l’adaptateur 1 et un pont sur l’adaptateur 2.

Configuration finale -

Ajout de la sélection automatique de l'interface ainsi que d'une adresse 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"

EDIT 201902: sur ma dernière version, vagrant / virtualbox se plaignaient de l'absence de connexion Wi-Fi (aéroport) :

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

changé pour

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

Mettra à jour plus tard si quelque chose se présente, mais je pensais mettre à jour le bit concernant le nom de l'adaptateur.


sa réponse mérite plus de crédit, si simple d'ajouter un adaptateur supplémentaire, je n'ai même pas eu le menu (seulement une carte active).
Glenn Plas

4

La réponse courte semble être non.

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

  # 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

Produit:

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

Malheureusement, il semble que la configuration de la carte réseau soit bloquée, mais vous aurez peut-être plus de chance que moi.

Si vous le faites, vous pouvez toujours forcer l’arrêt et le rechargement avec une correction ssh.host. Alternativement j'ai entendu parler de vagrant dnsmais jamais essayé.


3

J'ai trouvé cette discussion sur StackOverflow.

Pour moi, il suffisait d'ouvrir le lien Vagrantfileet de décommenter la ligne suivante:

config.vm.network "public_network"

puis courir vagrant reload


2
Si vous regardez ma configuration Vagrantfile, vous verrez que le paramètre de configuration est déjà là.
SynackSA

Oh pardon! J'ai manqué ça.
Tyler

3
Je pense qu'il y aura toujours une connexion NAT, car lorsque vous effectuez un ssh ou un approvisionnement vagabond, il y aura toujours accès via 127.0.0.1:2222 ou par un autre port transféré à 22 sur la boîte d'invité.
Hayden

C'est la réponse sur place pour moi. il ajoute juste un nic
Glenn Plas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.