Bridged Adapter muss nur in Vagrant, kein NAT ausgeführt werden

36

Ich habe also ein Problem mit der Vagrant-Konfiguration von 'hashicorp / precision64' in meinem MAC-Buch.

Zuerst meine Konfiguration:

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

Dies ist die Ausgabe des "Vagabunden"

==> Standard: Versucht das ordnungsgemäße Herunterfahren der VM ...
==> default: Überprüfe ob das Kästchen 'hashicorp / exact64' aktuell ist ...
==> Standard: Löscht alle zuvor eingestellten weitergeleiteten Ports ...
==> Standard: Löscht alle zuvor eingestellten Netzwerkschnittstellen ...
==> Standard: Vorbereiten der Netzwerkschnittstellen basierend auf der Konfiguration ...
    Voreinstellung: Adapter 1: nat
    Standard: Adapter 2: überbrückt
==> Standard: Ports werden weitergeleitet ...
    Standard: 22 => 2222 (Adapter 1)
==> Standard: VM wird gestartet ...
==> Standard: Warten auf den Start der Maschine. Das kann ein paar minuten dauern...
    Standard: SSH-Adresse: 127.0.0.1:2222
    Standard: SSH-Benutzername: vagrant
    Standard: SSH-Authentifizierungsmethode: Privater Schlüssel
    Standard: Warnung: Verbindungszeitüberschreitung. Wiederholen ...
==> Standard: Maschine gestartet und bereit!
GuestAdditions 4.3.10 wird ausgeführt --- OK.
==> Standard: Suche nach Gastzugängen in VM ...
==> Standard: Hostname einstellen ...
==> Standard: Netzwerkschnittstellen konfigurieren und aktivieren ...
==> Standard: Mounten freigegebener Ordner ...
    Standardeinstellung: / vagrant => / Users / garthm / Projects / vagrant
==> Standard: Maschine bereits bereitgestellt. Führen Sie `vagrant provision` aus oder verwenden Sie die` --provision`
==> Standard: Provisioning erzwingen. Provisioner, die für die Ausführung markiert sind, werden weiterhin ausgeführt.

'ifconfig' zeigt Folgendes:

vagrant @ mddirector: ~ $ ifconfig
eth0 Verbindungskapsel: 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 Gültigkeitsbereich: Link
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Metrisch: 1
          RX-Pakete: 725 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 544 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 1000
          Empfangsbytes: 90824 (90,8 KB) Sendebytes: 63375 (63,3 KB)

eth1 Verbindungskapsel: 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 Metrisch: 1
          RX-Pakete: 3490 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 7 Fehler: 0 fallen gelassen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 1000
          Empfangsbytes: 345981 (345,9 KB) Sendebytes: 1102 (1,1 KB)

lo Link encap: Lokales Loopback
          inet addr: 127.0.0.1 Mask: 255.0.0.0
          inet6 addr: :: 1/128 Gültigkeitsbereich: Host
          UP LOOPBACK RUNNING MTU: 16436 Metrisch: 1
          Empfangspakete: 0 Fehler: 0 Verworfen: 0 Überschreitungen: 0 Rahmen: 0
          TX-Pakete: 0 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 0
          RX-Bytes: 0 (0,0 B) TX-Bytes: 0 (0,0 B)

Mein Problem ist, dass ich die VM von meinem Hostrechner aus anpingen kann ( IP: 10.0.24.112), andere Leute können meine VM auch 10.0.24.XXXanpingen ( IP: 10.10.116.254), meine VM kann meine Devbox anpingen ( ), ich kann die Setups anderer Entwickler virtueller Maschinen von meiner Devbox aus anpingen ( nicht Vagrant, IP: 10.10.116.254), aber ich kann meine VM nicht von meiner Devbox aus anpingen, und andere Entwickler können meine VM nicht von ihrer Devbox aus anpingen.

Die Einrichtung der virtuellen Maschine ist nur mit einer Bridged-Netzwerkkarte möglich, aber der Vagrant hat aus irgendeinem Grund sowohl eine NAT als auch eine Bridged-Konfiguration, obwohl ich Bridged in der Konfiguration angegeben habe. Wie Sie sehen, gibt es zwei IP-Adressen für die Vagrant-VM, die nicht richtig zu sein scheinen. Sie können auch beim Booten einen Port-Forward für Adapter 1 ausführen, bei dem es sich um den NAT-Adapter handelt. Dies bedeutet, dass der NAT-Adapter standardmäßig für alle verwendet wird.

Wie entferne ich den NAT-Adapter und verwende nur Bridged?

Wenn ich die VirtualBox-Einstellungen bearbeite und den NAT-Adapter deaktiviere, es also nur den überbrückten Adapter gibt und die Box über VirtualBox hochfährt (dh nicht Vagrant Up verwendet), hat sie nur eth0 mit einer IP-Adresse, die von meiner Devbox aus pingfähig ist , wonach ich suche. Wenn ich versuche, die Box nach dem Bearbeiten der VirtualBox-Einstellungen und dem Deaktivieren des NAT-Adapters zu vergrößern, wird die folgende Fehlermeldung angezeigt:

Beim Ausführen von `VBoxManage`, einer von Vagrant verwendeten CLI, ist ein Fehler aufgetreten
zur Steuerung der VirtualBox. Der Befehl und stderr wird unten gezeigt.

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

Stderr: VBoxManage: error: Eine NAT-Regel dieses Namens ist bereits vorhanden
VBoxManage: Fehler: Details: Code NS_ERROR_INVALID_ARG (0x80070057), Komponente NATEngine, Schnittstelle INATEngine, Angerufene nsISupports
VBoxManage: Fehler: Kontext: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUInt16 (strGuestPort)" bei Zeile 1655 der Datei VBoxManageModifyVM.cpp

Wenn ich sofort wieder einen Vagabund mache, hat er den NAT-Adapter wieder aktiviert und wir haben wieder das gleiche Problem.

SynackSA
quelle

Antworten:

21

eth0as NAT ist eine Grundvoraussetzung von Vagrant in seinem gegenwärtigen Zustand . Sie können jedoch die Standard-Routerkonfiguration für überschreiben eth1.

Aus den Vagrant-Dokumenten :

Standard-Router

Abhängig von Ihrer Konfiguration möchten Sie möglicherweise die Standard-Routerkonfiguration manuell überschreiben. Dies ist erforderlich, wenn Sie von anderen Netzwerken über das öffentliche Netzwerk auf die Vagrant-Box zugreifen müssen . Dazu können Sie ein Shell-Provisioner-Skript verwenden:

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

# Standard-Router
config.vm.provision "shell",
  laufe: "immer",
  inline: "route add default gw 192.168.0.1"

# Standardrouter ipv6
config.vm.provision "shell",
  laufe: "immer",
  inline: "route -A inet6 add default gw fc00 :: 1 eth1"

# Standard-GW auf eth0 löschen
config.vm.provision "shell",
  laufe: "immer",
  inline: "eval` route -n | awk '{if ($ 8 == "eth0" && $ 2! = "0.0.0.0") print "route del default gw" $ 2;} ""

Beachten Sie, dass das oben Genannte recht komplex ist und möglicherweise vom Gastbetriebssystem abhängt. Wir dokumentieren jedoch die ungefähre Vorgehensweise, da es sich um eine häufige Frage handelt.

ostrokach
quelle
9

(Entschuldigung, ziemlich naiv in Bezug auf Vagrant / VirtualBox, also verzeihen Sie das Fehlen der richtigen Netzwerkterminologie.)

Ihre Wahl der Brücke: en4) Thunderbolt ist höchstwahrscheinlich das Problem.

Ich gehe davon aus, dass Sie Folgendes wünschen / benötigen:

  • SSH-Anmeldefunktion für Vagrant zur Steuerung Ihres virtuellen Computers über Ihre Entwickler-Box (den Host). Das macht das NAT mit der Portweiterleitung. Es bringt nichts anderes durcheinander, also ist es gar nicht so nützlich, danach zu fragen, dass es weg ist. Und das zeigt sich auf Adapter 1 in VirtualBox.

  • Konnektivität von Ihrem LAN aus und nicht nur von Ihrem Host. Sagen wir etwas im Bereich 192.168.1.xxx. Das ist wichtig, auf Adapter 2.

  • Sie kümmern sich nur um Ihre normale Netzwerkkarte / Netzwerkkarte und haben keinen besonderen Grund, Ethernet über Ihren Thunderbolt-Port zu betreiben.

dh ziemlich genau das, was man von einer VirtualBox mit Bridged und ohne Vagrant bekommen würde.

Hier ist eine SSH-ifconfig von einer dieser VirtualBox-Maschinen, die ich in meinem LAN habe. Es wird ein Webserver ausgeführt, mit dem ich eine Verbindung herstellen kann, und mein Mac kann eine SSH-Verbindung herstellen und eine Verbindung zu einer Datenbank herstellen. Ich werde es die Referenz nennen .

[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 zeigt der Netzwerkbereich für diese Referenz vm Adapter1 als Bridged an. Alle anderen Adapter sind deaktiviert.

OK, also werde ich jetzt versuchen, dasselbe LAN-Konnektivitätsergebnis von Vagrant zu erhalten, aber ich akzeptiere, dass ich an Adapter 1 ein NAT haben werde, das ist der Vagrant-VB-SSH-Kommunikationsmechanismus.

Versuchen Sie # 1 - was fehlschlägt.

Ausgangspunkt ist ein vagabundierender Init .

Dann habe ich in Vagrantfile nur zwei Dinge geändert:

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

Wenn ich dies nicht verstehe , wird ein Dialogfeld angezeigt, in dem Sie gefragt werden, welche Benutzeroberfläche verwendet werden soll:

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

Nun, als ich es mir ansah, entschied ich mich zuerst für 2) weil ich dachte, ich wolle Ethernet und nun, 1) schien "zu Apple".

Dies funktioniert, aber mit einem ungeeigneten IP 10.0.xx.xx-Eintrag, auf den mein ISP Pings blockiert, siehe unten. Ich denke, sie meinen wirklich öffentlich, wenn es um öffentliches Netzwerk geht.

Vagabund 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

Versuchen Sie # 2 - korrekte Version

vagrant halt , dann das verzeichnis löschen, neu anlegen und vagrant init . (Ich habe festgestellt, dass zu viele Netzwerkprobleme den Vagrant und / oder die Virtualbox verwirren können, die durch ein vollständiges Entfernen und erneutes Starten behoben werden könnten.)

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

Wählen Sie diesmal jedoch 1) en1: Wi-Fi (AirPort).

Vagabund ssh

Das eth1 mit 192.168.1.123 sieht doch viel besser aus, oder?

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

Tatsächlich kann ich 192.168.1.123 von meinem Referenz-VM oder von einem anderen physischen Computer in meinem LAN aus pingen.

[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 zeigt ein NAT auf Adapter 1 und ein Bridged auf Adapter 2.

Endgültige Einrichtung -

Es wurde eine automatische Auswahl der Schnittstelle sowie eine statische IP hinzugefügt (die Sie nicht benötigen). Problem gelöst, zumindest für mich.

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

BEARBEITEN 201902: In meinem neuesten Build beschwerte sich Vagrant / Virtualbox darüber, dass Wifi (Flughafen) nicht gefunden wurde:

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

änderte es zu

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

Wird später aktualisiert, wenn etwas auftaucht, aber ich dachte, ich würde das Bit über den Adapternamen aktualisieren.

JL Peyret
quelle
Seine Antwort verdient mehr Anerkennung, so einfach, einen zusätzlichen Adapter hinzuzufügen, bekam ich nicht einmal das Menü (nur 1 aktive Karte).
Glenn Plas
4

Die kurze Antwort scheint nicht zu sein.

Sie können Adapter 1 überschreiben, aber zumindest mit Problemen rechnen 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

Produziert:

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

Leider scheint es dann zu blockieren, den Netzwerkadapter zu konfigurieren, aber vielleicht haben Sie mehr Glück als ich.

Wenn Sie dies tun, können Sie immer mit einer korrigierten Kraft anhalten und neu laden ssh.host. Alternativ habe ich davon gehört, es vagrant dnsaber nie ausprobiert.

KCD
quelle
3

Ich fand diese Diskussion auf StackOverflow.

Für mich hat es gereicht, die dazugehörige VagrantfileZeile zu öffnen und das Kommentarzeichen zu entfernen:

config.vm.network "public_network"

und dann rennen vagrant reload

Tyler
quelle
2
Wenn Sie sich meine Vagrantfile-Konfiguration ansehen, werden Sie feststellen, dass die Konfigurationseinstellung bereits vorhanden ist.
SynackSA
Oh, Entschuldigung! Das habe ich vermisst.
Tyler
3
Ich glaube, es wird immer eine NAT-Verbindung geben, denn wenn Sie vagabundierendes ssh oder Provisioning durchführen, wird es immer über 127.0.0.1:2222 oder einen beliebigen Port darauf zugreifen, der es an 22 auf der Guest-Box weiterleitet.
Hayden
Das ist genau die richtige Antwort für mich. es fügt nur eine nette
Glenn Plas