Подтвердить что ты не робот

LIST правила natpf в Virtualbox/Vagrant

Я часто получаю такие ошибки при запуске Vagrant:

VBoxManage: error: A NAT rule of this name already exists
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component     NATEngine, interface INATEngine, callee nsISupports
VBoxManage: error: Context: "AddRedirect(Bstr(strName).raw(), proto,    Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(),       RTStrToUInt16(strGuestPort))" at line 1524 of file VBoxManageModifyVM.cpp

Я хотел бы удалить все правила пересылки портов перед тем, как сделать vagrant up, но у меня возникли проблемы с правилами LISTING natpf. Есть ли способ сделать это с помощью vboxmanage или через некоторые объекты в Vagrant?

Обновление: бродячая версия 1.3.4. Я могу реплицировать проблему следующим образом: запустить vm обычным способом (vagrant up) и принудительно отключить vm во время установки (это, например, имитирует, например, неудачную установку). Затем в системе остается правило перенаправления портов natpf1. Единственный способ его очистки - это как vboxmanage modifyvm #{vmid} --natpf1 delete rule_name, но вы должны знать имя правила заранее... Кроме того, правило остается после vagrant destroy, и кажется, что моя функция очистки natpf1 Ruby, присутствующая в Vagrant.configure, является не работает, а это означает, что устаревшее правило по-прежнему сталкивается с "новым", которое пытается создать Бродяга.

4b9b3361

Ответ 1

Я пришел сюда с той же проблемой; с вашей подсказкой об удалении правила, я обнаружил, что вы можете использовать GUI VirtualBox, чтобы найти правила и удалить их.

Конечно, это работает только при работе с машиной с графическим интерфейсом.

  • Откройте диспетчер VirtualBox
  • Откройте настройки для соответствующего поля (rmb → настройки или значок шестеренки)
  • Выберите Network из списка слева и откройте диалог Port Forwarding

Здесь вы сможете напрямую удалить правила.

http://i.stack.imgur.com/6fQQc.png


Посмотрев на правила, кажется, что они просто получают имя, равное установленному порту. Таким образом, вы также можете посмотреть Vagrantfile и найти такую ​​строку:

db.vm.network :forwarded_port, guest: 5432, host: 5432

И предположим, что имя правила будет 5432. Имя правила для пересылки ssh-порта 22 называется ssh

$ vboxmanage modifyvm "vbox-id" --natpf1 delete "5432"

Ответ 2

Это сделало для меня работу:

VBoxManage showvminfo $VM_NAME --machinereadable | awk -F '[",]' '/^Forwarding/ { printf ("Rule %s host port %d forwards to guest port %d\n", $2, $5, $7); }'

Ответ 3

Вы можете перечислить правила nat с помощью следующей команды:

VBoxManage showvminfo #{vmid}

Затем вы получаете много информации о своей виртуальной машине, включая правила пересылки, например:

NIC 1 Rule(1):   name = ssh, protocol = tcp, host ip = 127.0.0.1, host port = 2022, guest ip = , guest port = 22

Ответ 4

Вы можете удалить правило из командной строки, выпустив:

VBoxManage controlvm "boot2docker-vm" natpf1 delete "tcp-port80"

Последний параметр в кавычках - это имя правила, которое вы хотите удалить.

Ответ 5

Расширяя ответ андрея, здесь перечислены правила для всех ваших виртуальных машин

for vm in 'vboxmanage list vms | awk -F'"' '$0=$2''
do
    echo "Rules for VM $vm"
    VBoxManage showvminfo $vm --machinereadable | awk -F '[",]' '/^Forwarding/ { printf ("Rule %s host port %-5d forwards to guest port %-5d\n", $2, $5, $7); }'
    printf '\n'
done