在Virtualbox/Vagrant中列出natpf规则

Let*_*t4U 15 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
Run Code Online (Sandbox Code Playgroud)

我想在做之前删除所有端口转发规则vagrant up,但是我在列出natpf规则时遇到了麻烦.有没有办法vboxmanage在Vagrant中使用或通过一些设施来做到这一点?

更新:Vagrant版本1.3.4.我可以按如下方式复制问题:启动vm安装normal way(vagrant up)并在安装期间强制关闭vm(这模拟了例如安装失败).然后natpf1端口转发规则留在系统中.清理它的唯一方法是vboxmanage modifyvm #{vmid} --natpf1 delete rule_name,但是你必须事先知道规则名称...此外,规则保留在那之后vagrant destroy,似乎我的Ruby natpf1清除功能Vagrant.configure不会运行,这意味着陈旧的规则仍然与Vagrant试图创造的"新鲜"冲突相冲突.

And*_*lfe 10

这完成了我的工作:

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


mho*_*jde 8

我带着同样的问题来到这里; 有关删除规则的提示我发现您可以使用VirtualBox GUI查找规则并删除它们.

当然,这仅适用于使用GUI桌面的计算机.

  • 打开VirtualBox管理器
  • 打开相关方框的设置(rmb - >设置或齿轮图标)
  • Network从左侧列表中选择并打开Port Forwarding对话框

从这里,您将能够直接删除规则.

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


看看这些规则,它们似乎只是得到一个等于所设置端口的名称.所以你也可以查看Vagrantfile,并搜索这样一行:

db.vm.network :forwarded_port, guest: 5432, host: 5432
Run Code Online (Sandbox Code Playgroud)

并猜测规则的名称将是5432.调用用于转发ssh端口22的规则的名称ssh

$ vboxmanage modifyvm "vbox-id" --natpf1 delete "5432"
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以通过以下命令列出 nat 规则:

VBoxManage showvminfo #{vmid}
Run Code Online (Sandbox Code Playgroud)

然后你会得到很多关于你的 VM 的信息,包括转发规则,例如:

NIC 1 Rule(1):   name = ssh, protocol = tcp, host ip = 127.0.0.1, host port = 2022, guest ip = , guest port = 22
Run Code Online (Sandbox Code Playgroud)