Нужно сделать Bridged Adapter только в Vagrant, без NAT


36

Поэтому у меня возникли проблемы с настройкой Vagrant 'hashicorp / precision64' в моей книге 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"
конец

Это выход "бродяги вверх"

==> по умолчанию: Попытка постепенного отключения ВМ ...
==> по умолчанию: проверка, если поле 'hashicorp / точный64' является актуальным ...
==> default: очистить все ранее установленные перенаправленные порты ...
==> default: очистить все ранее установленные сетевые интерфейсы ...
==> по умолчанию: подготовка сетевых интерфейсов на основе конфигурации ...
    по умолчанию: адаптер 1: nat
    по умолчанию: адаптер 2: мостовой
==> по умолчанию: переадресация портов ...
    по умолчанию: 22 => 2222 (адаптер 1)
==> по умолчанию: загрузка ВМ ...
==> default: ожидание загрузки машины. Это может занять несколько минут...
    по умолчанию: адрес SSH: 127.0.0.1:2222
    по умолчанию: имя пользователя SSH: vagrant
    по умолчанию: SSH метод аутентификации: закрытый ключ
    по умолчанию: Предупреждение: время ожидания соединения. Повторное подключение ...
==> по умолчанию: машина загружена и готова!
GuestAdditions 4.3.10 работает --- ОК.
==> по умолчанию: Проверка гостевых дополнений в ВМ ...
==> по умолчанию: установка имени хоста ...
==> по умолчанию: настройка и включение сетевых интерфейсов ...
==> по умолчанию: монтирование общих папок ...
    по умолчанию: / vagrant => / пользователи / garthm / проекты / vagrant
==> по умолчанию: машина уже подготовлена. Запустите `vagrant provision` или используйте` --provision`
==> по умолчанию: для принудительной инициализации. Поставщики, помеченные для запуска всегда будут работать.

'ifconfig' показывает следующее:

vagrant @ mddirector: ~ $ ifconfig
eth0 Link encap: Ethernet HWaddr 08: 00: 27: 88: 0c: a6
          адрес в сети Интернет: 10.0.2.15 Bcast: 10.0.2.255 Маска: 255.255.255.0
          inet6 адрес: fe80 :: a00: 27ff: fe88: ca6 / 64 Область действия: ссылка
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Метрика: 1
          Пакеты RX: 725 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX: 544 ошибки: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновения: 0 txqueuelen: 1000
          RX-байты: 90824 (90,8 КБ). TX-байты: 63375 (63,3 КБ).

eth1 Link encap: Ethernet HWaddr 08: 00: 27: 2f: bb: 6a
          адрес в сети Интернет: 10.0.24.118 Bcast: 10.0.31.255 Маска: 255.255.248.0
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Метрика: 1
          Пакеты RX: 3490 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX: 7 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновения: 0 txqueuelen: 1000
          RX-байты: 345981 (345,9 КБ). TX-байты: 1102 (1,1 КБ).

lo Link encap: Local Loopback
          адрес в сети: 127.0.0.1 маска: 255.0.0.0
          inet6 адрес: :: 1/128 Область применения: Host
          UP LOOPBACK RUNNING MTU: 16436 Метрика: 1
          Пакеты RX: 0 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX: 0 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновений: 0 txqueuelen: 0
          RX байтов: 0 (0,0 B) TX байтов: 0 (0,0 B)

Моя проблема в том, что я могу пропинговать виртуальную машину с моей хост-машины ( IP: 10.0.24.112), другие люди могут 10.0.24.XXXпропинговать мою IP: 10.10.116.254виртуальную машину тоже ( ), моя виртуальная машина может пропинговать мою devbox ( ), я могу пропинговать настройки виртуальной машины других разработчиков из моей devbox ( не Vagrant, IP: 10.10.116.254), но я не могу пропинговать свою виртуальную машину из своего devbox, а другие разработчики не могут пропинговать мою виртуальную машину из своего devbox.

У них есть настройки виртуальной машины только с сетевым адаптером Bridged, но бродяга по какой-то причине имеет как NAT, так и Bridged, хотя я указал bridged в конфигурации. Как видите, у Vagrant VM есть два IP-адреса, что кажется неправильным. Вы также можете, когда он загружается, он выполняет переадресацию порта на Adapter 1, который является адаптером NAT, что означает, что он звучит так, как будто он использует адаптер NAT по умолчанию для всего.

Как избавиться от адаптера NAT и использовать только мост?

Если я отредактирую настройки VirtualBox и отключу адаптер NAT, то есть есть только адаптер с мостовыми соединениями и загружаю коробку через VirtualBox (то есть: не использую vagrant up), тогда у него есть только eth0 с IP-адресом, который можно проверить на моем devbox что я и ищу. Если я попытаюсь выскочить из окна после редактирования настроек VirtualBox и отключения адаптера NAT, я получу следующую ошибку:

Произошла ошибка при выполнении `VBoxManage`, интерфейса командной строки, используемого Vagrant
для управления VirtualBox. Команда и stderr показаны ниже.

Команда: ["modifyvm", "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, вызываемый nsISupports
VBoxManage: error: Context: "AddRedirect (Bstr (strName) .raw (), proto, Bstr (strHostIp) .raw (), RTStrToUInt16 (strHostPort), Bstr (strGuestIp) .raw (), RTStrToUIuP) ( строка 1655 файла VBoxManageModifyVM.cpp

Если я немедленно снова выполню vagrant, он снова включит адаптер NAT, и мы снова столкнемся с той же проблемой.

Ответы:


21

eth0поскольку NAT является фундаментальным требованием Vagrant в его текущем состоянии . Но вы можете переопределить конфигурацию маршрутизатора по умолчанию для eth1.

Из Бродячих документов :

Маршрутизатор по умолчанию

В зависимости от настроек, вы можете переопределить конфигурацию маршрутизатора по умолчанию вручную. Это необходимо, если вам нужен доступ к Vagrant из других сетей через общедоступную сеть . Для этого вы можете использовать скрипт инициатора оболочки:

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

# роутер по умолчанию
config.vm.provision "shell",
  запустить: "всегда",
  встроенный: «маршрут добавить по умолчанию gw 192.168.0.1»

# роутер по умолчанию ipv6
config.vm.provision "shell",
  запустить: "всегда",
  inline: "route -A inet6 добавить gw fc00 :: 1 eth1 по умолчанию"

# удалить gw по умолчанию на eth0
config.vm.provision "shell",
  запустить: "всегда",
  inline: "eval` route -n | awk '{if ($ 8 == \ "eth0 \" && $ 2! = \ "0.0.0.0 \") print \ "route del default gw \" $ 2;}' `"

Обратите внимание, что вышесказанное довольно сложно и может зависеть от гостевой ОС, но мы документируем приблизительное представление о том, как это сделать, потому что это общий вопрос.


9

(Извините, довольно наивно про vagrant / virtualbox, так что простите за отсутствие правильной сетевой терминологии)

Ваш выбор моста: en4) Вероятнее всего, проблема с Thunderbolt .

Вот что я предполагаю, что вы хотите / нуждаетесь, а не то, что вы просили:

  • Возможность входа по SSH для vagrant для управления вашим виртуальным компьютером из вашего окна разработчика (хоста). Вот что делает NAT с переадресацией портов. Это ничего не портит, так что просить об этом не так уж и полезно. И это видно на адаптере 1 в VirtualBox.

  • Подключение из локальной сети, а не только с вашего хоста. Давайте скажем что-нибудь в диапазоне 192.168.1.xxx. Вот что важно, на адаптере 2.

  • Вы просто заботитесь о своей обычной сетевой карте / сетевой карте и у вас нет особых причин использовать Ethernet через порт Thunderbolt.

то есть в значительной степени то, что вы получите от VirtualBox vm с Bridged и без Vagrant.

Вот SSH ifconfig с одной из тех машин VirtualBox, которые есть в моей локальной сети. Он запускает веб-сервер, к которому я могу подключиться, и мой 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 на панели Network для этого эталонного vm отображается Adapter1 как Bridged. Все остальные адаптеры отключены.

Хорошо, теперь я собираюсь попробовать тот же результат подключения к локальной сети от Vagrant, но я согласен, что у меня будет NAT на адаптере 1, это механизм связи vagrant-VB ssh.

Попробуйте # 1 - что не получается.

Отправной точкой является бродячий инициат .

Затем в 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, на которую пингует мой провайдер, см. Ниже. Я предполагаю, что они действительно подразумевают общественность, когда это говорит публичная сеть.

бродячий сш

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 - правильная версия

vagrant halt , затем удалите каталог, создайте его снова и vagrant init . (Я обнаружил, что слишком большой беспорядок с сетью может сбить с толку vagrant и / или virtualbox, который исправит полное удаление и перезапуск)

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

Но на этот раз выберите 1) en1: Wi-Fi (AirPort).

бродячий сш

Это 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

И действительно, я могу пропинговать 192.168.1.123 из моего эталонного vm или с другого физического компьютера в моей локальной сети.

[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: в моей последней сборке vagrant / virtualbox жаловались на то, что 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 активная карта).
Гленн Плас

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, потому что, когда вы выполняете vagrant ssh или какую-либо инициализацию, он всегда будет обращаться к нему через 127.0.0.1:2222 или через любой порт, который он перенаправляет на 22 на гостевой ящик.
Хайден,

Это место для ответа для меня. это просто добавляет ник
Гленн Плас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.