Cần làm bộ chuyển đổi cầu nối chỉ trong Vagrant, không có NAT


36

Vì vậy, tôi đang gặp vấn đề với thiết lập Vagrant của 'hashicorp / precision64' trên cuốn sách MAC của mình.

Đầu tiên, cấu hình của tôi:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure (VAGRANTFILE_API_VERSION) làm | config |
  config.vm.box = "hashicorp / precision64"
  config.vm.network "public_network", gõ: "dhcp" ,: cầu => 'en4: Thunderbolt Ethernet'
  config.vm.hostname = "mddirector"
kết thúc

Đây là sự khởi đầu của 'vagrant up'

==> mặc định: Cố gắng tắt VM duyên dáng ...
==> mặc định: Kiểm tra xem hộp 'hashicorp / precision64' có được cập nhật không ...
==> mặc định: Xóa mọi cổng được chuyển tiếp trước đó ...
==> mặc định: Xóa mọi giao diện mạng được đặt trước đó ...
==> mặc định: Chuẩn bị giao diện mạng dựa trên cấu hình ...
    mặc định: Bộ chuyển đổi 1: nat
    mặc định: Bộ chuyển đổi 2: bắc cầu
==> mặc định: Chuyển tiếp cổng ...
    mặc định: 22 => 2222 (bộ chuyển đổi 1)
==> mặc định: Khởi động VM ...
==> mặc định: Đang chờ máy khởi động. Có thể sẽ mất vài phút...
    mặc định: địa chỉ SSH: 127.0.0.1:2222
    mặc định: tên người dùng SSH: vagrant
    mặc định: phương thức SSH auth: khóa riêng
    mặc định: Cảnh báo: Hết thời gian kết nối. Đang thử lại ...
==> mặc định: Máy đã khởi động và sẵn sàng!
GuestAdditions 4.3.10 đang chạy --- OK.
==> mặc định: Kiểm tra bổ sung của khách trong VM ...
==> mặc định: Đặt tên máy chủ ...
==> mặc định: Định cấu hình và bật giao diện mạng ...
==> mặc định: Gắn thư mục dùng chung ...
    mặc định: / vagrant => / Users / garthm / Project / vagrant
==> mặc định: Máy đã được cung cấp. Chạy `cung cấp vagrant` hoặc sử dụng` --provision`
==> mặc định: để buộc cung cấp. Nhà cung cấp được đánh dấu để chạy luôn sẽ vẫn chạy.

'ifconfig' hiển thị như sau:

vagrant @ mddirector: ~ $ ifconfig
eth0 Liên kết mã hóa: Ethernet HWaddr 08: 00: 27: 88: 0c: a6
          inet addr: 10.0.2.15 Bcast: 10.0.2.255 Mặt nạ: 255.255.255.0
          inet6 addr: fe80 :: a00: 27ff: fe88: ca6 / 64 Phạm vi: Liên kết
          UP MADICAST RUNNING MULTICAST MTU: 1500 Số liệu: 1
          Các gói RX: 725 lỗi: 0 rớt: 0 tràn: 0 khung: 0
          Các gói TX: 544 lỗi: 0 rớt: 0 tràn: 0 sóng mang: 0
          va chạm: 0 txqueuelen: 1000
          Các byte RX: 90824 (90,8 KB) byte TX: 63375 (63,3 KB)

Liên kết mã hóa eth1: Ethernet HWaddr 08: 00: 27: 2f: bb: 6a
          inet addr: 10.0.24.118 Bcast: 10.0.31.255 Mặt nạ: 255.255.248.0
          UP MADICAST RUNNING MULTICAST MTU: 1500 Số liệu: 1
          Các gói RX: 3490 lỗi: 0 rớt: 0 tràn: 0 khung: 0
          Các gói TX: 7 lỗi: 0 rớt: 0 tràn: 0 sóng mang: 0
          va chạm: 0 txqueuelen: 1000
          Các byte RX: 345981 (345,9 KB) TX byte: 1102 (1.1 KB)

lo Liên kết mã hóa: Loopback cục bộ
          inet addr: 127.0.0.1 Mặt nạ: 255.0.0.0
          inet6 addr: :: 1/128 Phạm vi: Máy chủ
          LÊN LOOPBACK CHẠY MTU: 16436 Số liệu: 1
          Các gói RX: 0 lỗi: 0 rớt: 0 tràn: 0 khung: 0
          Các gói TX: 0 lỗi: 0 rớt: 0 tràn: 0 sóng mang: 0
          va chạm: 0 txqueuelen: 0
          Các byte RX: 0 (0,0 B) TX byte: 0 (0,0 B)

Vấn đề của tôi là, tôi có thể ping máy ảo từ máy chủ của mình ( IP: 10.0.24.112), người khác cũng có thể ping máy ảo của tôi ( 10.0.24.XXX), máy ảo của IP: 10.10.116.254tôi có thể ping máy phát điện của tôi () không phải Vagrant, IP: 10.10.116.254), nhưng tôi không thể ping VM từ devbox của mình và các nhà phát triển khác không thể ping VM của tôi từ devbox của họ.

Các thiết lập máy ảo mà họ có chỉ có một Bridged NIC, nhưng vì lý do nào đó, cả hai đều có cả NAT và Bridged, mặc dù, tôi đã chỉ định bắc cầu trong cấu hình. Như bạn có thể thấy, có hai địa chỉ IP cho Vagrant VM, có vẻ không đúng. Bạn cũng có thể, khi nó khởi động, nó sẽ chuyển tiếp cổng trên Bộ điều hợp 1, đó là bộ điều hợp NAT, có nghĩa là nó có vẻ như đang sử dụng bộ điều hợp NAT theo mặc định cho mọi thứ.

Làm cách nào để thoát khỏi bộ điều hợp NAT và chỉ sử dụng cầu nối?

Nếu tôi chỉnh sửa cài đặt VirtualBox và vô hiệu hóa bộ điều hợp NAT, thì chỉ có Bộ điều hợp được bắc cầu và khởi động hộp thông qua VirtualBox (tức là: không sử dụng vagrant up), thì nó chỉ có eth0 với địa chỉ IP có thể ping được từ hộp thư của tôi , đó là những gì tôi đang tìm kiếm. Nếu tôi thử và làm mờ hộp sau khi chỉnh sửa cài đặt VirtualBox và vô hiệu hóa bộ điều hợp NAT, tôi sẽ gặp lỗi sau:

Đã xảy ra lỗi khi thực thi `VBoxManage`, CLI được sử dụng bởi Vagrant
để kiểm soát VirtualBox. Lệnh và thiết bị lỗi chuẩn được hiển thị bên dưới.

Lệnh: "

Stderr: VBoxManage: error: Đã tồn tại quy tắc NAT của tên này
VBoxManage: lỗi: Chi tiết: mã NS_ERROR_INVALID_ARG (0x80070057), thành phần NATEngine, giao diện INATEngine, callee nsISupports
VBoxManage: error: Context: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strhostIp) .raw (), RTStrToUInt16 (strhostPort), Bstr (strGuestIp) .raw (), RTStr dòng 1655 của tệp VBoxManageModifyVM.cpp

Nếu tôi ngay lập tức thực hiện lại một lần nữa, nó đã kích hoạt lại bộ điều hợp NAT một lần nữa và chúng tôi lại gặp vấn đề tương tự.

Câu trả lời:


21

eth0vì NAT là một yêu cầu cơ bản của Vagrant ở trạng thái hiện tại . Nhưng bạn có thể ghi đè cấu hình bộ định tuyến mặc định cho eth1.

Từ các tài liệu Vagrant :

Router mặc định

Tùy thuộc vào thiết lập của bạn, bạn có thể muốn ghi đè thủ công cấu hình bộ định tuyến mặc định. Điều này là bắt buộc nếu bạn cần truy cập vào hộp Vagrant từ các mạng khác qua mạng công cộng . Để làm như vậy, bạn có thể sử dụng tập lệnh cung cấp shell:

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

# router mặc định
config.vm.provision "vỏ",
  chạy: "luôn luôn",
  nội tuyến: "tuyến thêm mặc định gw 192.168.0.1"

# bộ định tuyến ipv6 mặc định
config.vm.provision "vỏ",
  chạy: "luôn luôn",
  nội tuyến: "tuyến -A inet6 thêm mặc định gw fc00 :: 1 eth1"

# xóa gw mặc định trên eth0
config.vm.provision "vỏ",
  chạy: "luôn luôn",
  nội tuyến: "eval` route -n | awk '{if ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") in \ "tuyến del mặc định gw \" $ 2;}' `"

Lưu ý ở trên là khá phức tạp và có thể là hệ điều hành khách cụ thể, nhưng chúng tôi ghi lại ý tưởng sơ bộ về cách thực hiện vì đây là một câu hỏi phổ biến.


9

(Xin lỗi, khá ngây thơ về vagrant / virtualbox vì vậy hãy tha thứ cho việc thiếu thuật ngữ mạng thích hợp)

Lựa chọn cầu của bạn : en4) Thunderbolt rất có thể là vấn đề.

Đây là những gì tôi giả sử bạn muốn / cần, hơn là những gì bạn yêu cầu:

  • Khả năng đăng nhập SSH cho vagrant để kiểm soát vm của bạn, từ hộp dev của bạn (máy chủ lưu trữ). Đó là những gì NAT với chuyển tiếp cổng làm. Nó không làm hỏng bất cứ điều gì khác, vì vậy yêu cầu biến mất không phải là tất cả hữu ích. Và điều đó hiển thị trên Adaptor 1 trong VirtualBox.

  • Kết nối từ mạng LAN của bạn, thay vì chỉ máy chủ của bạn. Hãy nói điều gì đó trong phạm vi 192.168.1.xxx. Đó là điều quan trọng, trên Adaptor 2.

  • Bạn chỉ quan tâm đến card mạng / NIC thông thường của mình và không có lý do cụ thể nào để chạy Ethernet qua cổng Thunderbolt của bạn.

tức là khá nhiều những gì bạn sẽ nhận được từ một VirtualBox vm với Bridged và không có Vagrant nào được nhìn thấy.

Đây là SSH ifconfig từ một trong những máy VirtualBox duy nhất tôi có trên mạng LAN. Nó chạy một máy chủ web mà tôi có thể kết nối và máy Mac của tôi có thể SSH vào đó và kết nối với cơ sở dữ liệu trên đó. Tôi sẽ gọi nó là tài liệu tham khảo .

[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

Trong VirtualBox, bảng điều khiển Mạng, cho vm tham chiếu đó, hiển thị Adaptor1 là Cầu nối. Tất cả các bộ điều hợp khác bị vô hiệu hóa.

OK, vì vậy bây giờ tôi sẽ thử kết quả kết nối LAN tương tự từ Vagrant, nhưng tôi chấp nhận rằng tôi sẽ có NAT ở bộ chuyển đổi 1, đó là cơ chế giao tiếp ssh của VB.

Hãy thử số 1 - thất bại.

Điểm khởi đầu là một init mơ hồ .

Sau đó, trong Vagrantfile, tôi chỉ thay đổi 2 điều:

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

Nếu tôi mơ hồ về điều này, tôi nhận được một hộp thoại hỏi sử dụng giao diện nào:

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

Bây giờ, nhìn vào nó, lần đầu tiên tôi chọn 2) vì tôi nghĩ rằng tôi muốn Ethernet và tốt, 1) dường như 'quá Apple'.

Điều này hoạt động, nhưng với một mục IP 10.0.xx.xx không phù hợp, mà ISP của tôi chặn ping, xem bên dưới. Tôi đoán họ thực sự có nghĩa là công khai khi nó nói mạng công cộng.

ssh mơ hồ

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

Hãy thử # 2 - phiên bản chính xác

vagrant dừng lại , sau đó xóa thư mục, tạo lại nó và init . (Tôi thấy rằng việc nhắn tin quá nhiều với mạng có thể gây nhầm lẫn cho hộp thư và / hoặc hộp ảo mà việc xóa và khởi động lại hoàn toàn sẽ khắc phục)

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

Nhưng, lần này, chọn 1) en1: Wi-Fi (AirPort).

ssh mơ hồ

Cái eth1 với 192.168.1.123 trông đẹp hơn nhiều phải không?

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

Và, thực sự, tôi có thể ping 192.168.1.123 từ vm tham chiếu của tôi hoặc từ một máy vật lý khác trong mạng LAN của tôi.

[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 hiển thị NAT trên Bộ điều hợp 1 và Cầu nối trên Bộ điều hợp 2.

Thiết lập cuối cùng -

Đã thêm lựa chọn tự động giao diện cũng như IP tĩnh (mà bạn không cần). Vấn đề được giải quyết, cho tôi ít nhất.

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

EDIT 201902: trên bản dựng mới nhất của tôi, vagrant / virtualbox đã phàn nàn về Wifi (Sân bay) không được tìm thấy:

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

đổi nó thành

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

Sẽ cập nhật sau nếu có gì đó xuất hiện, nhưng nghĩ rằng tôi sẽ cập nhật một chút về tên bộ điều hợp.


Câu trả lời của anh ấy xứng đáng nhận được nhiều tín dụng hơn, thật đơn giản để thêm một bộ chuyển đổi bổ sung, tôi thậm chí còn không nhận được menu (chỉ có 1 thẻ hoạt động).
Glenn Plas

4

Câu trả lời ngắn dường như là không.

Bạn có thể ghi đè bộ điều hợp 1 nhưng ít nhất gặp sự cố với 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

Sản xuất:

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

Thật không may, sau đó nó dường như khóa cấu hình bộ điều hợp mạng nhưng có lẽ bạn sẽ gặp nhiều may mắn hơn tôi.

Nếu bạn làm như vậy, bạn luôn có thể buộc dừng và tải lại với một sửa chữa ssh.host. Ngoài ra, tôi đã nghe nói vagrant dnsnhưng chưa bao giờ thử nó.


3

Tôi tìm thấy cuộc thảo luận này trên StackOverflow.

Đối với tôi, nó là đủ để mở dòng liên quan Vagrantfilevà không ghi chú dòng sau:

config.vm.network "public_network"

và sau đó chạy vagrant reload


2
Nếu bạn nhìn vào cấu hình Vagrantfile của tôi, bạn sẽ thấy rằng cài đặt cấu hình đã có.
SynackSA

Ồ xin lỗi! Tôi bỏ lỡ điều đó.
Tyler

3
Tôi tin rằng nó sẽ luôn có kết nối NAT bởi vì khi bạn thực hiện ssh mơ hồ hoặc bất kỳ việc cung cấp nào, nó sẽ luôn truy cập nó thông qua 127.0.0.1:2222 hoặc bất kỳ cổng nào chuyển tiếp đến 22 trên hộp khách.
Hayden

Đây là vị trí trên câu trả lời cho tôi. nó chỉ thêm một nic
Glenn Plas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.