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
, является не работает, а это означает, что устаревшее правило по-прежнему сталкивается с "новым", которое пытается создать Бродяга.
Ответы
Ответ 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