webdevqa.jp.net

Virtualbox / Vagrantのnatpfルールを一覧表示します

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を実行する前に、すべてのポート転送ルールを削除したいのですが、natpfルールを一覧表示するのに問題があります。 vboxmanageを使用して、またはVagrantのいくつかの機能を介してそれを行う方法はありますか?

更新:Vagrantバージョン1.3.4。次のように問題を再現できます:通常の方法(vagrant up)でvmのインストールを開始し、インストール中にvmの電源を強制的にオフにします(これは、インストールの失敗をシミュレートします)。次に、natpf1ポート転送ルールがシステムに残されます。クリーンアップする唯一の方法はvboxmanage modifyvm #{vmid} --natpf1 delete rule_nameのようなものですが、ルール名を事前に知っておく必要があります...さらに、ルールはvagrant destroyの後もそこにとどまり、私のRuby natpf1クリア機能が存在するようですin Vagrant.configureは実行されません。つまり、古いルールは、Vagrantが作成しようとする「新しい」ルールとまだ衝突します。

16
LetMeSOThat4U

私は同じ問題でここに来ました。ルールの削除に関するヒントを参考にして、VirtualBoxGUIを使用してルールを見つけて削除できることがわかりました。

もちろん、これはGUIデスクトップを備えたマシンで作業している場合にのみ機能します。

  • 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"
8
mhogerheijde

これは私のために仕事を成し遂げました:

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

次のコマンドでNATルールを一覧表示できます。

VBoxManage showvminfo #{vmid}

次に、転送ルールを含むVM)に関する多くの情報を取得します。次に例を示します。

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

Andrewの答えを拡張すると、すべてのVMのルールが一覧表示されます

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
0

次のコマンドを発行して、コマンドラインからルールを削除できます。

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

引用符で囲まれた最後のパラメーターは、削除するルール名です。

0
doron grinstein