当前位置: 首页 > 知识库问答 >
问题:

无法远程连接到EC2 MySQL安装

章博耘
2023-03-14

我的极限,数小时的变化...

我正在尝试访问已安装的运行在EC2实例上的MySQL。经过大量搜索(这似乎最接近我的问题是从远程服务器连接到Amazon EC2上的mysql),我显然遗漏了一些愚蠢的或误解的东西。

EC2 Ubuntu,mysqld运行良好,本地Web/App服务器工作良好,所有连接。我可以从本地的mysql。我需要使用Iron.io对这个开发机器进行外部访问,它需要从外部访问数据库。

我有

  • EC2安全GRUOP全部配置为允许0.0.0.0
  • 我可以SSH/HTTP访问服务器没有问题
  • 配置的mysqld
    • 绑定地址=0.0.0.0(尝试过以下变体)
    • 已从%授予我的非根用户(myuser)的访问权限,例如,授予全部开启权限。到由“密码”标识的MyUser@"%“;刷新权限;

    我试过了

    • 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.*上的所有特权授予由“password”标识的“myuser2”@“%”;
    • 为%重复,我的个人外部IP
    • 将root@“%”添加到列表中并尝试了该用户(基于以下建议:无法远程连接到运行在EC2实例(不是RDS)上的MySQL实例)

    (始终在之后重新启动服务器)

    什么都不起作用,测试总是

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

    不过我注意到

    >

  • 从information_schema.user_privileges中选择*;具有IS_GRANTABLE的myser是否设置为n:但我不认为这是一个限制因素(为什么GRANT不能在MySQL中工作?)
  • netstat-a显示不同的端口和套接字监听!?

    下面的netstat中的侦听端口不是3306,但我已经从外部telnet到该端口,它显示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
    

共有2个答案

罗凯
2023-03-14

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

柴衡
2023-03-14

我找到的最好的工具是sqlyog(也许也是mysql工作台),它实际上会在连接失败时告诉您要从哪里进入。

我喜欢它的原因是它保持了严密的安全性,显示了用户“fred123@hdm38.newyork.comcastbusiness.net”的访问被拒绝。注意,那个主机名,我刚刚编出来的,但它很重要,不管你的是什么。否则就是通配符时间,我不会做的。你可以选择。

这一点很重要,因为我在mysqlcreate user期间使用的是该主机名(hdm38.newyork.comcastbusiness.net),而不是使用通配符,如%

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

1)远程用户正在通过使用适当的用户、主机条目创建的帐户进行连接(查看从mysql.user order by 1,2中选择用户、主机的输出)

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

有了上面的命令,我们现在就有了一个有机会进入的新用户。什么也做不了。无法更改为DB。基本上,它们可以执行以下操作:select now();

2)您已经使用刷新特权执行了授予(至少是前者)

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并且有一个rem d out行#skip-networking。即使您必须创建一行只是为了rem out它,也要这样做。

3/4更改需要重新启动mysql后台进程

5)防火墙问题。因此,对于EC2,您需要您的AWS安全组,它对实例是活动的,以包括端口3306的打开

 类似资料:
  • 我在A机上设置了伪分布式模式的Hadoop和Hbase,我正在B机上运行我的客户端(Java程序)(A机和B机可以互相通信)。但我这样做面临问题。 我的客户端代码如下所示: 配置config=HBaseConfiguration.create(); config.set(“HBase.ZookeePer.quorum”,zookeeperLocation);config.set(“hbase.zo

  • 问题内容: 我正在尝试使用jstatd用jps查询远程JVM,以便最终使用VisualVM对其进行监视。 我让jstatd使用以下安全策略运行: jstatd在带有1.6.0_10版本的HotSpot vm的64位Linux机器上运行。jstatd命令是: 我正在尝试从Windows 7计算机运行jps。由于防火墙的限制,我通过SSH隧道将RMI数据通过隧道传输到我的Windows计算机,这样jp

  • 当我试图将我的一台机器用作WinRM客户端以连接到另一台机器时,我的一台机器出现问题。场景是: Window 7上的问题机器(VM A)已经启用了WinRM(已经运行winrm快速配置,Enable-PSRemoting),然后我将远程机器(VM C)的IP添加到VM A的受信任主机中,然后运行Test-WSMan,我得到这个错误Test-WSMan: 客户端无法连接到请求中指定的目标。验证目标上

  • 问题内容: 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以通过使用本地计算机上的curl来访问Kibana和Elastic search 我得到以下回应 var hashRoute =’/ app / kibana’; var defaultRoute =’/ app / kibana’; var hash = window.location.hash;

  • 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以使用 我得到以下回应 var hashRoute='/app/kibana'; var defaultRoute='/app/kibana'; var hash=window.location.hash; if(hash.length){window.location=hashRoute hash;}其他{wi

  • 问题内容: 每当我尝试启动eclipse调试(用于服务器端代码)时,我都会收到以下错误 无法连接到远程VM。 拒绝连接。 可能是什么问题?我已经尝试了网络上的大多数解决方案,但是都没有解决我的问题。谁能帮我解决这个问题?提前谢谢.. 问题答案: 您正在使用哪个服务器? 就像已经说过的: 在调试配置中,您必须定义服务器的正确端口(GF:9009 / Tomcat:8000) 您必须将服务器的JVM属