13
votes

I am trying to setup port forwarding in Vagrantfile to connect to guest mysqld from host system, but get reading initial communication packet error. Host: Yosemite, Guest: Trusty, vagrant 1.7.4

Vagrantfile(host):

config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 3306, host: 3309

my.ini(guest):

bind-address            = 127.0.0.1

8080 forwarding works like a charm.

mysql -h127.0.0.1 -uroot -p from guest also works.

mysql -h127.0.0.1 -P 3309 -uroot -p from host results with reading initial communication packet error.

When I telnet from host, the connection instantly closes:

$ telnet localhost 3309
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

Port forwarding works when I ssh to vagrant box from host:

$ssh vagrant@127.0.0.1 -p 2222 -L3308:localhost:3306 

Then I can connect from host mysql -h127.0.0.1 -P3308 -uroot -p without problems, which I use as a temporary workaround.

3
do you have firewall rules that would block traffic on those ports ?Frederic Henri
@FrédéricHenri no, it was my first suspect. There is no single iptable rule. Anyway, I tried to tunnel with ssh, and it works without problems.Alex Blex
right but with the tunneling you still use the ssh port.Frederic Henri
well, even with ssh tunnel over 2222, it should use 3306 on guest system to connect to mysqld, and 3309 on host for client. Anyway, I confirm there is no iptable rules on guest, and firewall is turned off on host.Alex Blex

3 Answers

22
votes

was finally able to make it work -

edit the /etc/mysql/my.cnf file and make sure, either

  • you have bind-address = 0.0.0.0
  • or you comment the line #bind-address ...

You may need to add it to the mysqld section of the my.cnf file:

[mysqld]
bind-address = 0.0.0.0

make sure to restart your mysql server after the change

$ sudo service mysql restart

Then you can connect from your host - so I first had an error like

$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
ERROR 1130 (HY000): Host '172.16.42.2' is not allowed to connect to this MySQL server

so I came back to the guest and did

vagrant@precise64:~$ mysql -h127.0.0.1 -uroot -p
...
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.42.2' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Then I had no issue to connect from the host machine

$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.44-0ubuntu0.12.04.1 (Ubuntu)
2
votes

The first answer is right but not enough.when I connect MySQL, I get a error:

Host '10.0.2.2' is not allowed to connect to this MySQL server

Solution:

create user 'root'@'10.0.2.2' identified by 'password';

grant all privileges on . to 'root'@'10.0.2.2' with grant option;

flush privileges;

aha, all problems are solved,

2
votes

Personally I don't bother with modifying MySQL for development Vagrant boxes - it's time consuming and difficult to script in a provisioner meaning you have to do it by hand every time you vagrany destroy or a new developer starts contributing. Instead, I connect via SSH Tunnel which is made super easy using Vagrant's generated private_key file. No additional post-install tweaking necessary.

Follow these steps to SSH Tunnel with SequelPro, MySql Workbench, or any other client that supports SSH connectivity:

  • Choose SSH connection option
  • The "Host" in SSH mode becomes localhost or specifically 127.0.0.1 (more predictable cross-os)
  • The username/password is the database username/password. For development you can just use root and the password is defined/created in the provisioner (see snippet below)
  • The SSH username is Vagrant
  • No SSH password - just use the private_key for the Vagrant machine instead, located in .vagrant/machines/default/virtualbox in the root of your VM project; note that on most OS's this directory, and all starting with a . are hidden

To automate installation and root password creation, add this to your Vagrant provisioner script file (config.vm.provision in Vagrantfile), commonly named provisioner.sh:

debconf-set-selections <<< 'mysql-server mysql-server/root_password password SuperSecretPasswordHere'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password SuperSecretPasswordHere'

apt-get install -y mysql-server

Hope this helps save someone else some time!