无法远程连接到EC2 MySQL安装

时间:2015-08-08 02:51:00

标签: mysql amazon-ec2

我的系绳结束,变化的时间......

我正在尝试访问在EC2实例上运行的已安装的MySQL。很多搜索(这似乎最接近我的问题Connect to mysql on Amazon EC2 from a remote server),而且我显然遗漏了一些愚蠢或误解的东西。

EC2 Ubuntu,mysqld运行良好,本地web / app服务器工作正常所有连接。我可以从本地mysql。我需要使用iron.io来外部访问这个开发机器,需要从外部访问数据库。

我有

  • ec2 security gruops all configured allow 0.0.0.0
  • 我可以ssh / http到达服务器没问题
  • 配置了mysqld
    • 绑定地址= 0.0.0.0(已尝试过以下变体)
    • 从%获得非root用户(myuser)的访问权限 例如全部授予至myuser @'%'通过'密码识别'; FLUSH PRIVILEGES;
  • 确保我的ubuntu实例iptables未配置     例如我只使用ec2安全组来保护实例)

我试过了

  • ssh进入服务器
  • telnet到mysqld端口3306上的公共IP以确保其收听 - 请参阅下面的说明
  • 删除/etc/mysql/my.cnf
  • 中的绑定地址
  • 检查它不是sock v端口错误:始终通过端口连接(本地检查,例如mysql -h - localhost -u root -p --port = 3306)
  • 绑定地址0.0.0.0
  • 绑定地址EC2本地IP,例如172。
  • 绑定地址EC2外部IP例如51.X
  • 上的mysql用户授予权限
  • mysql用户授予我个人外部ip的权限
  • 创建另一个用户,并仅将priviledgs授予特定数据库 在mydb上授予所有特权。* to' myuser2' @'%'通过'密码';
  • 识别
  • 重复%,我的个人外部IP
  • 添加root @'%'到列表并尝试该用户(基于此建议:Can't Connect to MySQL instance Remotely that is running on EC2 Instance (Not RDS)

(之后始终重启服务器)

没有任何作用,测试总是

$ mysql --host = 54.x.x.x --port = 3306 --user = myuser -p   输入密码:   错误1045(28000):拒绝访问用户' myuser' @' 54.x.x.x' (使用密码:是)

然而我注意到了

  1. 来自information_schema.user_privileges的SELECT *;将IS_GRANTABLE设置为N的myser:但我不认为这是一个限制因素(Why is GRANT not working in MySQL?
  2. netstat -a显示了一个不同的端口&套接字听!?

    下面netstat中的监听端口不是3306但是我已经在该端口外部进行了telc,它显示了mysql正在侦听

  3. 有人可以建议我错过的任何步骤吗?

    db priviledges的摘录,my.cnf

    # user_privileges
    # e.g. SELECT * from information_schema.user_privileges;
    +--------------------------------+---------------+-------------------------+--------------+
    | GRANTEE                        | TABLE_CATALOG | PRIVILEGE_TYPE          |  q1 |
    +--------------------------------+---------------+-------------------------+--------------+
    | 'root'@'localhost'             | def           | SELECT                  | YES          |
    ...
    | 'myuser'@'%'                 | def           | SELECT                  | NO           |
    | 'myuser'@'%'                 | def           | INSERT                  | NO           |
    | 'myuser'@'%'                 | def           | UPDATE                  | NO           |
    
    
    # 
    ]$ netstat -a | grep 'mysql'
    tcp        0      0 *:mysql                 *:*                     LISTEN     
    unix  2      [ ACC ]     STREAM     LISTENING     61212    /var/run/mysqld/mysqld.sock
    
    
    $ telnet 54.x.x.x 3306
    Trying 54.x.x.x...
    Connected to ec2-54-x-x-x.us-west-2.compute.amazonaws.com.
    Escape character is '^]'.
    [
    5.5.44-0ubuntu0.14.04.1+c<>d^+W?1*!e\{wdp&hZmysql_native_password
    
    
    # my.cnf
    [mysqld]
    #
    # * Basic Settings
    #
    user            = mysql
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    port            = 3306
    basedir         = /usr
    datadir         = /var/lib/mysql
    tmpdir          = /tmp
    lc-messages-dir = /usr/share/mysql
    #skip-external-locking
    #
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    #bind-address           = localhost
    # donts seem to work
    bind-address            = 0.0.0.0
    # does not work
    # ec2 external ip
    #bind-address            = 54.x.x.x
    # ec2 internal ip
    #bind-address            = 172.x.x.x
    

3 个答案:

答案 0 :(得分:3)

我发现的最好的工具是sqlyog,(也许是mysql工作台),它实际上会告诉您在失败的连接上进入的主机名。

我喜欢它的原因是它保持安全,显示类似的东西 用户“fred123@hdm38.newyork.comcastbusiness.net”拒绝访问。注意,那个主机名,我刚刚组成,但重要的是,无论你的是什么。否则它是通配时间,我不会做的。你可以选择。

这很重要,因为主机名( hdm38.newyork.comcastbusiness.net )是我在mysql create user中使用的那个,而不是使用像%

这样的通配符

我让上面的连接失败,但我注意到主机名在上面。你会在下面看到它。

快速核对清单

1)您的远程用户通过使用适当的user,host条目创建的帐户进行连接(查看select user,host from mysql.user order by 1,2的输出)

CREATE USER 'santa'@'hdm38.newyork.comcastbusiness.net' IDENTIFIED BY 'mypassword';

通过上述命令,我们现在有了一个有机会进入的新用户。无法做任何事情。无法更改为db。基本上他们可以做select now();

之类的事情

2)您使用grants(至少是前者)

执行了flush privileges
GRANT ALL PRIVILEGES ON mydb123.* TO 'santa'@'hdm38.newyork.comcastbusiness.net';

我们使用上述命令的用户现在可以在mydb123数据库/模式中执行任何操作。在手册中探索上面的Grant命令,以便为您创建的用户微调访问权限。

如果您不熟悉mysql安全性,请在研究之前不要包含WITH GRANT OPTION

对于步骤1和2,有些人会说上面的主机名为'%'。这意味着圣诞老人可以从任何主机连接。这是你的选择。一旦你到达某个地方并开始研究就开始紧张,放松。

3)您修改了 my.cnf ,并将bind-address更改为127.0.0.1localhost,转而支持0.0.0.0

如果bind-address不是0.0.0.0,则只与ssh连接

4)您修改了 my.cnf 并有一个rem'd out line #skip-networking。即使您必须创建该行只是为了将其删除,也要这样做。

3/4更改需要mysql守护程序重启

5)防火墙问题。因此,对于EC2,您需要对该实例有效的AWS Security Group包括端口3306的开放

答案 1 :(得分:2)

我在Amazon Linux上遇到了与mysqld 5.6.37相同的问题,解决方案是将bind-address = 0.0.0.0行添加到/etc/my.cnf[mysqld][mysqld_safe]以上

答案 2 :(得分:1)

谢谢Drew

0.0.0.0中的绑定地址更改为my.cnf解决了我的问题。我已经安装了virtualmin,因此不必完成所有MySQL用户创建和授予权限部分,在GUI的帮助下完成。但是我无法远程连接到MySQL服务器。

我有另一个VPS,它没有与MySQL服务器远程连接的问题,我无法找到远程连接到这个EC2实例的MySQL服务器的解决方案。过去几天我一直在寻找解决方案,当我按照你的指示更改绑定地址,然后重新启动MySQL服务器时,一切都运行正常。

再次感谢。