【问题标题】:Cannot connect remotely to EC2 MySQL installation无法远程连接到 EC2 MySQL 安装
【发布时间】:2015-10-31 13:44:07
【问题描述】:

我的束缚结束,数小时的变化......

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

EC2 Ubuntu,mysqld 运行良好,本地 Web/应用程序服务器运行良好,所有连接都正常。我可以从本地mysql。我需要对这台开发机器进行外部访问,因为使用需要从外部访问数据库的 iron.io。

我有

  • ec2 安全组全部配置允许 0.0.0.0
  • 我可以通过 ssh/http 访问服务器没有问题
  • 配置mysqld
    • 绑定地址=0.0.0.0(已尝试以下变体)
    • 从 % 为我的非 root 用户 (myuser) 授予访问权限 例如GRANT ALL ON . to myuser@'%' IDENTIFIED BY 'password';刷新特权;
  • 确保我的 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 的权限
  • 创建另一个用户,并且只将权限授予特定数据库 将 mydb.* 上的所有权限授予 'myuser2'@'%' 由 'password' 识别;
  • 重复 %,我的个人外部 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 输入密码: ERROR 1045 (28000): Access denied for user 'myuser'@'54.x.x.x' (使用密码: YES)

我注意到了

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

    下面 netstat 中的监听端口不是 3306,但我已经从外部远程登录到该端口,它显示 mysql 正在监听

谁能建议我错过的任何步骤?

db 权限的摘录,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

【问题讨论】:

  • 你会因为无法识别错误消息不代表的含义而造成很多不必要的麻烦。您在这里没有连接、路由、安全组、网络、端口与套接字或任何类似问题。错误 1045 访问被拒绝意味着您确实连接到服务器,并且它不喜欢您的用户名+主机+密码。列表结束。创建一个非特权测试帐户,新用户名。 GRANT USAGE ON *.* TO 'foo'@'%' IDENTIFIED BY 'bar';。以“foo”身份登录。有用吗?
  • ....羊...是的。但我还是很困惑。我最初创建了“myuser”,例如我从 % 授予了我的非 root 用户 (myuser) 的访问权限,例如全部授予。 to myuser@'%' IDENTIFIED BY 'password'; ...我错过了什么 - 有什么不同?
  • SELECT * FROM MySQL.user; 并查看结果。 MySQL 上的“帐户”并不像通常假设的那样仅由用户名定义。它实际上是用户名 + 主机,但也有一些可能违反直觉的匹配规则。这就是为什么我建议使用不同的用户名。我假设您拥有比您预期更多的“myuser”帐户,可能使用不同的密码。
  • GRANT USAGE 是一个“特殊”授权,默认情况下允许一个帐户登录到服务器,但没有别的。我建议只是为了简单起见。
  • "..username +host.." 这是一个有趣的见解,因为我几乎可以保证它会因使用密码等而感到困惑。感谢您抽出宝贵的时间。

标签: mysql amazon-ec2


【解决方案1】:

我发现的最好的工具是 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';

使用上面的命令,我们现在有一个有机会进入的新用户。不能做任何事情。无法更改为分贝。基本上他们可以做select now();

之类的事情

2) 你已经执行了grantsflush privileges(至少是前者)

GRANT ALL PRIVILEGES ON mydb123.* TO 'santa'@'hdm38.newyork.comcastbusiness.net';

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

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

有些人会说在第 1 步和第 2 步中,上面的主机名是 '%'。这意味着圣诞老人可以从任何主机连接。这是你的选择。开始紧绷,到达某个地方并完成研究后放松。

3) 您修改了 my.cnf 并将bind-address127.0.0.1localhost 改为0.0.0.0

如果bind-address不是0.0.0.0,你只是用ssh连接

4) 您已修改 my.cnf 并删除了一行 #skip-networking。即使您必须创建线条只是为了将其移除,也请执行此操作。

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

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

【讨论】:

    【解决方案2】:

    谢谢Drew

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

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

    再次感谢。

    【讨论】:

      【解决方案3】:

      我在 Amazon Linux 上使用 mysqld 5.6.37 时一直遇到同样的问题,解决方案是将行 bind-address = 0.0.0.0 添加到 /etc/my.cnf 下方 [mysqld] 但高于 [mysqld_safe]

      【讨论】:

        猜你喜欢
        • 2016-01-20
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 2021-04-17
        相关资源
        最近更新 更多