จำเป็นต้องทำ Bridged Adapter ใน Vagrant เท่านั้นไม่ใช่ NAT


36

ดังนั้นฉันจึงมีปัญหากับการตั้งค่า 'hashicorp / precision64' ของ Vagrant ในหนังสือ Mac ของฉัน

ก่อนอื่นให้กำหนดค่าของฉัน:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure (VAGRANTFILE_API_VERSION) do | config |
  config.vm.box = "hashicorp / precision64"
  config.vm.network "public_network", ประเภท: "dhcp",: bridge => 'en4: Thunderbolt Ethernet'
  config.vm.hostname = "mddirector"
ปลาย

นี่คือ oupput ของ 'คนจรจัดขึ้น'

==> ค่าเริ่มต้น: กำลังพยายามปิดระบบ VM ...
==> ค่าเริ่มต้น: กำลังตรวจสอบว่ากล่อง 'hashicorp / precision64' เป็นข้อมูลล่าสุดหรือไม่
==> ค่าเริ่มต้น: การล้างพอร์ตที่ส่งต่อที่ตั้งไว้ก่อนหน้านี้ ...
==> ค่าเริ่มต้น: การล้างการเชื่อมต่อเครือข่ายที่ตั้งไว้ก่อนหน้านี้ ...
==> ค่าเริ่มต้น: กำลังเตรียมการเชื่อมต่อเครือข่ายตามการกำหนดค่า ...
    เริ่มต้น: อะแดปเตอร์ 1: nat
    เริ่มต้น: อะแดปเตอร์ 2: bridged
==> ค่าเริ่มต้น: การส่งต่อพอร์ต ...
    เริ่มต้น: 22 => 2222 (อะแดปเตอร์ 1)
==> ค่าเริ่มต้น: กำลังบูต VM ...
==> ค่าเริ่มต้น: กำลังรอให้เครื่องบูต นี้อาจใช้เวลาไม่กี่นาที...
    เริ่มต้น: ที่อยู่ SSH: 127.0.0.1:2222
    เริ่มต้น: ชื่อผู้ใช้ SSH: คนพเนจร
    เริ่มต้น: วิธีการรับรองความถูกต้อง SSH: คีย์ส่วนตัว
    เริ่มต้น: คำเตือน: การหมดเวลาการเชื่อมต่อ ลองอีกครั้ง ...
==> ค่าเริ่มต้น: เครื่องบูทและพร้อมใช้งาน!
GuestAdditions 4.3.10 ทำงาน --- ตกลง
==> ค่าเริ่มต้น: กำลังตรวจสอบการเพิ่มของผู้เยี่ยมชมใน VM ...
==> ค่าเริ่มต้น: การตั้งค่าชื่อโฮสต์ ...
==> ค่าเริ่มต้น: การกำหนดค่าและเปิดใช้งานการเชื่อมต่อเครือข่าย ...
==> ค่าเริ่มต้น: กำลังติดตั้งโฟลเดอร์ที่แชร์ ...
    เริ่มต้น: / vagrant => / ผู้ใช้ / garthm / โครงการ / คนจรจัด
==> ค่าเริ่มต้น: เครื่องเตรียมไว้แล้ว เรียกใช้ `บทบัญญัติคนจรจัด 'หรือใช้` - จัดเตรียม'
==> ค่าเริ่มต้น: เพื่อบังคับใช้การจัดเตรียม ผู้ให้บริการที่ทำเครื่องหมายว่าให้ทำงานตลอดเวลาจะยังคงทำงานอยู่

'ifconfig' จะแสดงสิ่งต่อไปนี้:

vagrant @ mddirector: ~ $ ifconfig
eth0 ลิงค์ encap: อีเธอร์เน็ต 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 ขอบเขต: ลิงก์
          ออกอากาศแบบมัลติคาสต์วิ่ง MTU: 1500 เมตริก: 1
          RX แพ็กเก็ต: 725 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 544 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชน: 0 txqueuelen: 1,000
          จำนวนไบต์: 90824 (90.8 KB) TX ไบต์: 63375 (63.3 KB)

eth1 ลิงก์ encap: อีเทอร์เน็ต HWaddr 08: 00: 27: 2f: bb: 6a
          inet addr: 10.0.24.118 Bcast: 10.0.31.255 Mask: 255.255.248.0
          ออกอากาศแบบมัลติคาสต์วิ่ง MTU: 1500 เมตริก: 1
          แพ็คเก็ต RX: ข้อผิดพลาด 3490: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 7 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชน: 0 txqueuelen: 1,000
          จำนวนไบต์: 345981 (345.9 KB) TX ไบต์: 1102 (1.1 KB)

lo Link encap: Local Loopback
          inet addr: 127.0.0.1 รูปแบบ: 255.0.0.0
          inet6 addr: :: 1/128 ขอบเขต: โฮสต์
          การเรียกใช้ LOOPBACK RUNNING MTU: 16436 เมตริก: 1
          แพ็กเก็ต RX: 0 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 เฟรม: 0
          แพ็กเก็ต TX: 0 ข้อผิดพลาด: 0 ลดลง: 0 overruns: 0 ผู้ให้บริการ: 0
          การชนกัน: 0 txqueuelen: 0
          จำนวนไบต์: 0 (0.0 B) TX ไบต์: 0 (0.0 B)

ปัญหาของฉันคือว่าฉันสามารถ ping VM จากเครื่องโฮสต์ของฉัน ( IP: 10.0.24.112) คนอื่นสามารถ ping VM ของฉันด้วย ( 10.0.24.XXX), VM ของฉันสามารถ ping devbox ของฉัน ( IP: 10.10.116.254), ฉันสามารถ ping การตั้งค่าเครื่องเสมือนของนักพัฒนาซอฟต์แวร์อื่นจาก devbox ของฉัน ( ไม่ใช่ Vagrant, IP: 10.10.116.254แต่ฉันไม่สามารถ ping VM ของฉันจาก devbox ของฉันและผู้พัฒนารายอื่นไม่สามารถ ping VM ของฉันจาก devbox ของพวกเขา

การตั้งค่าเครื่องเสมือนที่พวกเขามีอยู่กับ Bridged NIC เท่านั้น แต่คนจรจัดด้วยเหตุผลบางอย่างมีทั้ง NAT และ Bridged แม้ว่าฉันจะระบุ bridged ใน config อย่างที่คุณเห็นมีสองที่อยู่ IP สำหรับ Vagrant VM ซึ่งดูไม่ถูกต้อง คุณสามารถเมื่อบูทขึ้นมันจะส่งต่อพอร์ตบนอะแด็ปเตอร์ 1 ซึ่งเป็นอะแดปเตอร์ NAT ซึ่งหมายความว่าดูเหมือนว่ามันใช้อะแดปเตอร์ NAT เป็นค่าเริ่มต้นสำหรับทุกสิ่ง

ฉันจะกำจัดอะแดปเตอร์ NAT และใช้บริดจ์ได้อย่างไร

หากฉันแก้ไขการตั้งค่า VirtualBox และปิดการใช้งานอะแดปเตอร์ NAT ดังนั้นจึงมีเพียงบริดจ์เชื่อมต่ออะแดปเตอร์และบูตกล่องผ่าน VirtualBox (เช่น: ไม่ได้ใช้คนจรจัดขึ้น) จากนั้นจะมี eth0 พร้อมที่อยู่ IP ที่ pingable จาก devbox ของฉัน ซึ่งเป็นสิ่งที่ฉันกำลังมองหา ถ้าฉันลองและคล้อยตามกล่องหลังจากแก้ไขการตั้งค่า VirtualBox และปิดใช้งานอะแดปเตอร์ NAT ฉันได้รับข้อผิดพลาดต่อไปนี้:

มีข้อผิดพลาดขณะดำเนินการ `VBoxManage 'ซึ่งเป็น CLI ที่ใช้โดย Vagrant
สำหรับการควบคุม VirtualBox คำสั่งและ stderr แสดงอยู่ด้านล่าง

คำสั่ง: ["modifiedvm", "7f1c12f7-74cd-4c6b-aa5a-16d6209cf2b3", "--natpf1", "ssh, tcp, 127.0.0.1,2222, 22"]

Stderr: VBoxManage: ข้อผิดพลาด: มีกฎ NAT ของชื่อนี้อยู่แล้ว
VBoxManage: ข้อผิดพลาด: รายละเอียด: รหัส NS_ERROR_INVALID_ARG (0x80070057), ส่วนประกอบ NATEngine, ส่วนต่อประสาน INATEngine, callee nsISupports
VBoxManage: ข้อผิดพลาด: บริบท: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) บรรทัด 1655 ของไฟล์ VBoxManageModifyVM.cpp

หากฉันทำคนพเนจรทันทีอีกครั้งก็เปิดใช้งานอะแดปเตอร์ NAT อีกครั้งและเรากลับไปพบปัญหาเดิมอีกครั้ง

คำตอบ:


21

eth0เป็น NAT เป็นความต้องการพื้นฐานของคนจรจัดในสถานะปัจจุบัน eth1แต่คุณสามารถแทนที่การตั้งค่าเราเตอร์เริ่มต้นสำหรับ

จากเอกสาร Vagrant :

เราเตอร์เริ่มต้น

คุณอาจต้องการแทนที่การกำหนดค่าเราเตอร์เริ่มต้นด้วยตนเองทั้งนี้ขึ้นอยู่กับการตั้งค่าของคุณ นี้เป็นสิ่งจำเป็นถ้าคุณจำเป็นต้องเข้าถึงกล่องจรจัดจากเครือข่ายอื่น ๆ ผ่านเครือข่ายสาธารณะ ในการทำเช่นนั้นคุณสามารถใช้สคริปต์ตัวจัดสรรเชลล์:

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

# เราเตอร์เริ่มต้น
config.vm.provision "เชลล์"
  ทำงาน: "เสมอ"
  แบบอินไลน์: "เส้นทางเพิ่มค่าเริ่มต้น gw 192.168.0.1"

# เราเตอร์เริ่มต้น ipv6
config.vm.provision "เชลล์"
  ทำงาน: "เสมอ"
  แบบอินไลน์: "เส้นทาง -A inet6 เพิ่มค่าเริ่มต้น gw fc00 :: 1 eth1"

# ลบ gw เริ่มต้นบน eth0
config.vm.provision "เชลล์"
  ทำงาน: "เสมอ"
  อินไลน์: "eval` route -n | awk '{ถ้า ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") พิมพ์ \ "เส้นทางเริ่มต้น del gw \" $ 2;}' '"

หมายเหตุข้างต้นค่อนข้างซับซ้อนและอาจเป็นระบบปฏิบัติการของผู้เยี่ยมชมโดยเฉพาะ แต่เราจัดทำเอกสารแนวคิดคร่าวๆว่าจะทำอย่างไรเพราะเป็นคำถามที่พบบ่อย


9

(ขออภัย, ไร้เดียงสาค่อนข้างเกี่ยวกับคนจรจัด / Virtualbox ดังนั้นโปรดให้อภัยการขาดคำศัพท์เครือข่ายที่เหมาะสม)

ทางเลือกของสะพาน: en4) สายฟ้าน่าจะเป็นปัญหา

นี่คือสิ่งที่ฉันคิดว่าคุณต้องการ / ต้องการมากกว่าสิ่งที่คุณขอ:

  • ความสามารถในการเข้าสู่ระบบ SSH สำหรับคนจรจัดในการควบคุม vm ของคุณจากกล่อง dev ของคุณ (โฮสต์) นั่นคือสิ่งที่ NAT พร้อมการส่งต่อพอร์ตทำ มันไม่ได้ยุ่งอะไรเลยดังนั้นการขอให้มันจากไปนั้นไม่ใช่สิ่งที่มีประโยชน์ทั้งหมด และนั่นแสดงให้เห็นใน Adapter 1 ใน VirtualBox

  • การเชื่อมต่อจาก LAN ของคุณไม่ใช่แค่โฮสต์ของคุณ สมมุติว่ามีบางอย่างอยู่ในช่วง 192.168.1.xxx นั่นคือสิ่งที่สำคัญในอะแดปเตอร์ 2

  • คุณแค่แคร์การ์ดเครือข่าย / NIC ปกติของคุณและไม่มีเหตุผลใดที่จะรัน Ethernet ผ่านพอร์ต Thunderbolt ของคุณ

นั่นคือสิ่งที่คุณจะได้รับจาก VirtualBox vm พร้อม Bridged และไม่มี Vagrant ให้เห็น

นี่คือ ifconfig SSH จากหนึ่งใน VirtualBox เฉพาะเครื่องที่ฉันมีบน LAN ของฉัน มันรันเว็บเซิร์ฟเวอร์ที่ฉันสามารถเชื่อมต่อและ Mac ของฉันสามารถ SSH ลงไปและเชื่อมต่อกับฐานข้อมูลบนมัน ฉันจะเรียกมันว่าการอ้างอิง

[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

ใน VirtualBox พาเนลเครือข่ายสำหรับ vm อ้างอิงนั้นแสดง Adapter1 เป็นบริดจ์ อะแดปเตอร์อื่น ๆ ทั้งหมดถูกปิดการใช้งาน

ตกลงดังนั้นตอนนี้ฉันจะลองใช้การเชื่อมต่อ LAN เดียวกันนั้นเป็นผลลัพธ์จาก Vagrant แต่ฉันยอมรับว่าฉันจะมี NAT ที่อะแด็ปเตอร์ 1 นั่นคือกลไกการสื่อสารของคนจรจัด-VB ssh

ลอง # 1 - ซึ่งล้มเหลว

จุดเริ่มต้นคือinit คนจรจัด

จากนั้นใน Vagrantfile ฉันเปลี่ยนเพียง 2 สิ่ง:

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

ถ้าฉันพเนจรฉันจะได้รับกล่องโต้ตอบถามว่าจะใช้อินเทอร์เฟซใด:

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

ตอนนี้ดูที่มันก่อนฉันเลือก2)เพราะฉันคิดว่าฉันต้องการ Ethernet และดี1)ดูเหมือน 'เกินไป Apple'

ใช้งานได้ แต่มีรายการ IP 10.0.xx.xx ที่ไม่เหมาะสมซึ่ง ISP ของฉันบล็อกส่ง Ping ดูที่ด้านล่าง ฉันเดาว่าพวกเขาหมายถึงสาธารณะจริงๆเมื่อมีการพูดว่าเครือข่ายสาธารณะ

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

ลอง # 2 - รุ่นที่ถูกต้อง

หยุดคนจรจัดแล้วลบไดเรกทอรีสร้างมันขึ้นมาอีกครั้งและinit คนจรจัด (ฉันพบว่า messing มากเกินไปกับเครือข่ายอาจสร้างความสับสนให้คนพเนจรและ / หรือ virtualbox ซึ่งการลบและรีสตาร์ทแบบเต็มจะแก้ไข)

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

แต่คราวนี้เลือก 1) en1: Wi-Fi (AirPort)

SSH คนจรจัด

eth1 นั้นที่มี 192.168.1.123 ดูดีกว่ามากใช่ไหม

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

และแน่นอนฉันสามารถ ping 192.168.1.123 จาก vm อ้างอิงของฉันหรือจากเครื่องอื่นใน 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, VirtualBox แสดง NAT บนอแด็ปเตอร์ 1 และ Bridged บนอแด็ปเตอร์ 2

การตั้งค่าสุดท้าย -

เพิ่มการเลือกอินเทอร์เฟซโดยอัตโนมัติเช่นเดียวกับ IP แบบคงที่ (ซึ่งคุณไม่ต้องการ) แก้ไขปัญหาสำหรับฉันอย่างน้อย

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

แก้ไข 201902: ในงานสร้างล่าสุดของฉันคนจรจัด / กล่องเสมือนก็บ่นเกี่ยวกับWifi (สนามบิน)ไม่พบ:

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

เปลี่ยนเป็น

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

จะอัปเดตในภายหลังหากมีบางอย่างเกิดขึ้น แต่คิดว่าฉันจะอัปเดตบิตเกี่ยวกับชื่ออะแดปเตอร์


คำตอบของเขาสมควรได้รับเครดิตเพิ่มดังนั้นจึงง่ายต่อการเพิ่มอะแดปเตอร์พิเศษฉันไม่ได้รับเมนู (มีเพียง 1 การ์ดที่ใช้งานอยู่)
Glenn Plas

4

คำตอบสั้น ๆ ดูเหมือนจะไม่

คุณสามารถแทนที่อะแดปเตอร์ 1 แต่คาดว่าจะมีปัญหาอย่างน้อย 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

ผลิต:

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

โชคไม่ดีที่ดูเหมือนว่าจะล็อคการกำหนดค่าอะแดปเตอร์เครือข่าย แต่บางทีคุณอาจมีโชคมากกว่าฉัน

ssh.hostถ้าคุณทำคุณก็สามารถบังคับให้หยุดและโหลดด้วยการแก้ไข อีกทางหนึ่งฉันเคยได้ยินvagrant dnsแต่ไม่เคยลอง


3

ฉันพบการสนทนานี้ใน StackOverflow

สำหรับฉันมันก็พอที่จะเปิดที่เกี่ยวข้องVagrantfileและไม่แสดงข้อคิดเห็นบรรทัดต่อไปนี้:

config.vm.network "public_network"

จากนั้นเรียกใช้ vagrant reload


2
หากคุณดูการกำหนดค่า Vagrantfile ของฉันคุณจะเห็นว่าการตั้งค่ามีอยู่แล้ว
SynackSA

โอ้ขอโทษ! ฉันคิดถึงสิ่งนั้น
ไทเลอร์

3
ฉันเชื่อว่ามันจะมีการเชื่อมต่อ NAT อยู่เสมอเพราะเมื่อคุณทำคนตกหล่น ssh หรือการจัดเตรียมใด ๆ มันจะเข้าถึงมันผ่าน 127.0.0.1:2222 เสมอ
Hayden

นี่คือจุดที่คำตอบสำหรับฉัน มันเพิ่งเพิ่มนิค
เกล็นพลาส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.