Forward new port on running vagrant / virtualbox machine

Vagrant is great for starting up virtual machines for development. A quick and easy setup is to use basic networking with port forwarding so you can serve a website or web application on a port and use a browser on the host machine to see the work in progress.

Say you want to serve your site on port 3000, use this in your Vagrantfile:

Vagrant.configure("2") do |config| "forwarded_port", guest: 3000, host: 3000

Then, after vagrant up and setting up your development environment on the VM to serve your site on port 3000, you can browse to http://localhost:3000 to view it from the host machine.

If, however, you decide you want another project or service on another port, say another site, but this time from port 3001, it can be a pain to add this to your Vagrantfile and do a vagrant reload. Instead, it’s possible to do this with VirtualBox directly (as long as you’re using VirtualBox as your provider).

The VirtualBox docs hint that this is possible. But, the doc linked to does not give an example. Lucky, the command line VBoxManage utility help shows the arguments needed. So to forward a new port from the guest to the host on a running Vagrant / Virtual Box VM run this from the command line (either make sure VBoxManage is in your path or use the full path to the executable)

VBoxManage controlvm "VM name" natpf1 "guestname,tcp,,3001,,3001"

The command options are the same as those to VBoxManage modifyvm "VM name" --natpf1.

To remove a forwarded port if it’s no longer required, you can run:

VBoxManage controlvm "VM name" natpf1 delete guestname

To help you find the VirtualBox name of your VM, to see a list of machines, run:

VBoxManage list vms

You can also see and change VM information including changing the port forwarding settings through the Oracle VM VirtualBox Manager GUI.

If you decide you want this change to be permanent the next time you do vagrant up, don’t forget to add the port forwarding information to your Vagrantfile as well.