How to debug "Vagrant cannot forward the specified ports on this VM" message
Asked Answered
L

15

52

I'm trying to start a Vagrant instance and getting the following message:

Vagrant cannot forward the specified ports on this VM, since they
would collide with another VirtualBox virtual machine's forwarded
ports! The forwarded port to 4567 is already in use on the host
machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.forward_port 80, 1234

I opened VirtualBox, but I don't have any running boxes at the moment, so I'm stumped. How can I figure out which process is listening on 4567? Is there a way to list all Vagrant boxes running on my machine?

Thanks, Kevin

Luttrell answered 8/6, 2012 at 17:1 Comment(2)
Make sure your firewall/antivirus is not blocking it. That was my problem.Examinant
vagrant reload is the solution that worked for meBead
T
14

As message says, the port collides with the host box. I would simply change the port to some other value on the host machine. So if I am getting error for

config.vm.forward_port 80, 1234

then I would change it to

config.vm.forward_port 80, 5656

As 1234 might be used on my host machine.

For actually inspecting ports on any machine, I use the tcpview utility for that OS and get to know which port is used where.

Tildi answered 14/6, 2012 at 17:5 Comment(4)
How do you change the port?Television
More complete/modern description at #24128352 tl/dr: config.vm.network "forwarded_port", guest: 22, host: 2201, id: "ssh", auto_correct: trueEricson
Vishal's answer applies for older versions of Vagrants vm: * The following settings shouldn't exist: forward_portEthology
For windows tcpView would be thisSubtle
P
71

You can see what vagrant instances are running on your machine by running

$ vagrant global-status
id       name    provider   state   directory
----------------------------------------------------------------------
a20a0aa  default virtualbox saved   /Users/dude/Downloads/inst-MacOSX
64bc939  default virtualbox saved   /Users/dude/svn/dev-vms/ubuntu14
a94fb0a  default virtualbox running /Users/dude/svn/dev-vms/centos5

If you don't see any VMs running, your conflict is not a vagrant box (that vagrant knows about). The next thing to do is to fire up the VirtualBox UI, and check to see if it has any instances running. If you don't want to run the UI, you can:

ps -ef |grep VBox

If you have VirtualBox instances running, they should be included in that output. You should be able to just kill processes that have VirtualBox in their output. One problem is that one of those processes seems to exist to do keep-alives. Just kill off the highest VirtualBox process. If you have a VirtualBox image running but vagrant doesn't know about it, some Vagrant directories may have been deleted manually, which means Vagrant loses track of the instance.

Peridot answered 1/6, 2013 at 19:13 Comment(4)
One of those cases where the error message is a red herring - thanksLudeman
If you want to kill the VBox processes with a one-liner: ps -ef |grep VBox | awk '{print $2}' | xargs killGertrudgertruda
On mac I had to actually open virutalbox to get rid of the running instance no amount of destroying helped my cause.Radius
after running vagrant global-status run vagrant destroy -f <id> to kill themRawdon
F
23

Watch out, your Vagrantfile is not the only one being used when bringing up a Vagrant box/instance.

When you get this:

~/dev/vagrant user$ vagrant reload
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 8001 is already in use
on the host machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.network :forwarded_port, guest: 8001, host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
~/dev/vagrant user$ 

You are actually not only using the Vagrantfile from ~/dev/vagrant but also the one from your "box" distribution .box file which is typically located here:

~/.vagrant.d/boxes/trusty/0/virtualbox/Vagrantfile

And if you have a look at it you'll see it has plenty of default port mappings:

$ cat ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile
$script = <<SCRIPT
bzr branch lp:jujuredirector/quickstart /tmp/jujuredir
bash /tmp/jujuredir/setup-juju.sh
SCRIPT

Vagrant.configure("2") do |config|
  # This Vagrantfile is auto-generated by 'vagrant package' to contain
  # the MAC address of the box. Custom configuration should be placed in
  # the actual 'Vagrantfile' in this box.

  config.vm.base_mac = "080027DFD2C4"
  config.vm.network :forwarded_port, guest: 22, host: 2122, host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 80, host: 6080, host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 8001, host: 8001, host_ip: "127.0.0.1"
  config.vm.network "private_network", ip: "172.16.250.15"
  config.vm.provision "shell", inline: $script

end

# Load include vagrant file if it exists after the auto-generated
# so it can override any of the settings
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)

So, go ahead and edit this file to remove the offending colliding forwarding port(s):

  config.vm.network :forwarded_port, guest: 22, host: 2122, host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 80, host: 6080, host_ip: "127.0.0.1"
  # config.vm.network :forwarded_port, guest: 8001, host: 8001, host_ip: "127.0.0.1"

By:

~/dev/vagrant user$ cp ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile.old
~/dev/vagrant user$ vi ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile

and watch out for other Vagrantfiles inclusion i.e.:

include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)

And now it works:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'trusty'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1401234565101_12345
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2122 (adapter 1)
    default: 80 => 6080 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Home/user/dev/vagrant/vagrant-docker
==> default: Running provisioner: shell...
    default: Running: inline script
...

Hope this helps.

Folkway answered 5/8, 2014 at 15:40 Comment(1)
Woa, so with Vagrant you cannot "override" the forwarded port? Thats mean I cannot use same box severals times ;(Quits
T
14

As message says, the port collides with the host box. I would simply change the port to some other value on the host machine. So if I am getting error for

config.vm.forward_port 80, 1234

then I would change it to

config.vm.forward_port 80, 5656

As 1234 might be used on my host machine.

For actually inspecting ports on any machine, I use the tcpview utility for that OS and get to know which port is used where.

Tildi answered 14/6, 2012 at 17:5 Comment(4)
How do you change the port?Television
More complete/modern description at #24128352 tl/dr: config.vm.network "forwarded_port", guest: 22, host: 2201, id: "ssh", auto_correct: trueEricson
Vishal's answer applies for older versions of Vagrants vm: * The following settings shouldn't exist: forward_portEthology
For windows tcpView would be thisSubtle
O
8

I ran into this problem and it turned out RubyMine was still holding on to a port. I found out which application was holding on to the port (31337 in my case) by running this command:

lsof -i | grep LISTEN 

Output

node       1396 richard.nienaber    7u  IPv4 0xffffff802808b320      0t0  TCP *:20559 (LISTEN)
Dropbox    1404 richard.nienaber   19u  IPv4 0xffffff8029736c20      0t0  TCP *:17500 (LISTEN)
Dropbox    1404 richard.nienaber   25u  IPv4 0xffffff8027870160      0t0  TCP localhost:26165 (LISTEN)
rubymine  11668 richard.nienaber   39u  IPv6 0xffffff8024d8e700      0t0  TCP *:26162 (LISTEN)
rubymine  11668 richard.nienaber   65u  IPv6 0xffffff8020c6e440      0t0  TCP *:31337 (LISTEN)
rubymine  11668 richard.nienaber  109u  IPv6 0xffffff8024d8df80      0t0  TCP localhost:6942 (LISTEN)
rubymine  11668 richard.nienaber  216u  IPv6 0xffffff8020c6ef80      0t0  TCP localhost:63342 (LISTEN)
Othello answered 3/10, 2012 at 10:25 Comment(1)
And what to do when there is noone listening on that port, but vagrant still complains that port is in use? How it could be possible?Doublet
B
8

Also note that (in Vagrant 1.6.4 at least) there is the folder ~/.vagrant.d/data/fp-leases, with files having names like 8080, 8081 etc. Erasing this folder contents helped me just now.

Balthasar answered 3/11, 2014 at 8:30 Comment(2)
To give a bit more insight , this are the current ports in use for virtual machines, an scenario where this might help is if the directory where the vagrant files was deleted while it was still running, vagrant will still believe that ports are in use because it didn't perform a tear down of the virtual machine, removing this files will "free" those ports for other vagrant machine to use.Ginger
But why does a vagrant destroy not clear the fp-leases associated with the box on version 2.2.4 ? Only every second destroy seems to clear it?Tonguetied
C
5
Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080,
    auto_correct: true
end

The final :auto_correct parameter set to true tells Vagrant to auto correct any collisions. During a vagrant up or vagrant reload, Vagrant will output information about any collisions detections and auto corrections made, so you can take notice and act accordingly.

https://www.vagrantup.com/docs/networking/forwarded_ports.html

Chrysalid answered 2/8, 2019 at 7:37 Comment(1)
This was the solution for my actual problem, where Vagrant seemed to be ignoring whatever I put in the config.vm.network "forwarded_port" line in the config.Taranto
A
3

If you use Proxifier (or a similar app) try closing it first. This was a problem I experienced due to Proxifier on OSX 10.9.

Archibaldo answered 10/9, 2014 at 21:44 Comment(1)
I contacted Proxifier's technical support. They asked me to move the Localhost rule to the top, which solved the problem perfectly.Amuse
G
1

I encountered this issue because I had a VM that was trying to run Postgres, and I had Postgres running on my local machine on port 5432.

After vagrant resume, I got the error:

Vagrant cannot forward the specified ports on this VM, since they would collide with some other application that is already listening on these ports. The forwarded port to 5432 is already in use on the host machine.

Look for what's running on port 5432:

o-ets-webdeveloper:portal me$ lsof -i :5432
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 1389     me    5u  IPv6 0x681a62dc601cf1e3      0t0  TCP localhost:postgresql (LISTEN)
postgres 1389     me    6u  IPv4 0x681a62dc6499362b      0t0  TCP localhost:postgresql (LISTEN)

Turns out it's local Postgres, killing those processes allowed me to run vagrant resume successfully.

Grime answered 26/6, 2018 at 17:44 Comment(0)
S
1

I fixed it this way:

  1. vagrant suspend
  2. Close Project on RubyMine IDE
  3. vagrant resume
  4. Open Recent on RubyMine IDE
Sheepskin answered 26/9, 2018 at 19:30 Comment(0)
M
1

My observation: I did not have any processes running on port 8000, so essentially the port forwarding did not work. Fix: Phil's answer provided a solution

~/.vagrant.d/boxes/ 

The above path had other versions of vagrant files that listed the port 8000. Once I pruned them all using the below command I was able to run vagrant up successfully

vagrant box remove [name] --all
Milstone answered 19/2, 2019 at 16:59 Comment(0)
H
1

The way out:

  1. $ vagrant suspend
  2. $ vagrant resume
Humperdinck answered 19/7, 2019 at 10:34 Comment(0)
V
0

After a host crash

I had this problem (with a configuration that had worked since several weeks before) after my host machine had crashed. I am using the VMware provider.

The problem

The issue was apparently this (I have not understood it 100%):

  • VMware still had the port mappings of the pre-crash Vagrant VM run, which were to IP 192.166.157.131.
  • When Vagrant started, it requested the mappings for a different IP. It could not get them because they were "in use". It reported the ports as taken although Vagrant itself had made the mappings for the same Vagrant box's previous run.
  • No matter what I did on the Vagrant side, the ports would not be released.

The source of the problem (presumably)

Presumably, the source of my problem was my network configuration:

  • Vagrant requested config.vm.network "private_network", ip: 192.169.0.3, which used VMnet5,
  • but port mappings use NAT, which on my machine is VMnet8.

Repair attempt 1

I have deactivated VMnet5 manually and changed my Vagrantfile to request config.vm.network "private_network", ip: 192.169.157.131, the very address that already has the required port mappings. (The cleaner solution would be to use a dynamic IP via config.vm.network "private_network", type: "dhcp", but that is inconvenient for my setup.)

It did not help. Vagrant still complained the ports were unavailable.

Repair attempt 2

I deleted the port mappings in VMware Desktop (Edit -> Virtual Network Editor).

It did not help (would you believe this?). Vagrant still complained the ports were unavailable. netstat -ao indeed still reported the ports as LISTENING.

I killed the process reported by netstat: 14032.
netstat still reported the ports as listening, now by a different process:
I killed that process 13492.
netstat still reported the ports as listening, now by a different process:
I killed that process 13340.
(Note the decreasing process IDs.)

netstat no longer reported the ports as listening.
Vagrant ridiculously still complained the ports were unavailable.
netstat no longer reported the ports as listening even after that Vagrant error message.
Huh?
There should be no trace now of the murky past in which those ports were occupied!

Repair attempt 3

I was next planning to reboot my host machine and hope for the best. But before I did this, I closed the VMware Desktop GUI and gave Vagrant one last try.

And then it worked.

Takeaway: Apparently the VMware infrastructure sometimes holds on to a configuration

  • more closely than one would like
  • and also more closely than its own GUI claims.
Vidrine answered 20/9, 2021 at 10:36 Comment(0)
H
-1

You have to modify your Vagrantfile within your current directory including the following command:

config.vm.network "forwarded_port", guest: 4567, host: <a port not used by your host machine>

Keep in mind that there also a hidden folder (.vagrant.d/) containing settings for your vagrant environment as well as config files for your boxes. Usually this folder is in your home directory.

e.g.

~/.vagrant.d/boxes/<your_box_name>/0/virtualbox/Vagrantfile

Usually this file includes another Vagrantfile located in ~/.vagrant.d/boxes/<your_box_name>/0/virtualbox/include/_Vagrantfile

You have to modify this file as well with the port-forwarding command

Hydria answered 4/2, 2020 at 18:41 Comment(0)
V
-1

Refer to my answer here: https://superuser.com/a/1610804/1252585

Writing the content again:

To list all of the LISTENING ports:

$ netstat -a

Use the following command to find the process ID of the process running on the desired port:

$ netstat -ano | findstr :8080

The result will be displayed as:

$ netstat -ano | findstr :5000
  TCP    0.0.0.0:5000           0.0.0.0:0              LISTENING       18024

Here, 18024 is the PID or Process ID.

Then use the following command to kill the process on the post 8080:

$ taskkill /PID 18024 /F

or $ taskkill //PID 18024 //F

Result will be displayed as:

$ taskkill //PID 18024 //F
SUCCESS: The process with PID 18024 has been terminated.
Vivanvivarium answered 18/12, 2020 at 2:49 Comment(0)
M
-1

Just because you have already another Vagrantfile on your machine so they both use the same port, so what you can do is only open the new Vagrantfile.

Create a forwarded port mapping that allows access to a specific port within the machine from a port on the host machine. In the example below:

# accessing "localhost:8080" will access port 80 on the guest machine.
  config.vm.network "forwarded_port", guest: 3000, host: 3000
  config.vm.network "forwarded_port", guest: 3001, host: 3001
  config.vm.network "forwarded_port", guest: 8080, host: 8080
  config.vm.network "forwarded_port", guest: 5000, host: 5000
  config.vm.network "forwarded_port", guest: 5432, host: 5432 >>> old port 
  config.vm.network "forwarded_port", guest: 5432, host: 1234 >>> new port

Simply change the host from 5432 to anything like 1234.

Machicolation answered 18/10, 2021 at 18:24 Comment(1)
Please fix the formating. Why do you have big bold font here?Paiz

© 2022 - 2024 — McMap. All rights reserved.