You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2连接RDS报1045权限错误 咨询问题原因及SSH隧道必要性

问题原因与解决方法

核心结论

必须在EC2实例内创建SSH隧道才能连接RDS——因为你的RDS明确配置为仅允许通过SSH隧道访问,直接连接会被RDS的安全组/网络策略拦截,同时数据库用户权限也可能限制了非隧道来源的IP。

具体问题点拆解

  • RDS访问控制拦截:你的RDS安全组只开放了来自SSH跳转服务器(bastion主机)的连接请求,EC2实例的私网/公网IP不在允许列表内,直接发起连接会被拒绝。
  • 数据库用户权限限制:db_user的权限可能仅授权给特定IP(比如bastion主机的IP)或localhost,EC2实例的IP不在授权范围内,即使密码正确也会触发Access denied。
  • Laravel配置未适配隧道:当前.env和database.php配置的是直接连接RDS的端点,没有指向本地隧道端口,应用尝试直接连接,自然触发权限拦截。

解决步骤

  1. 在EC2上建立SSH隧道
    假设bastion主机IP为bastion_ip,RDS端点为rds_endpoint,端口3306,执行以下命令后台建立隧道:

    ssh -fN -L 3306:rds_endpoint:3306 ec2-user@bastion_ip
    

    参数说明:

    • -f:后台运行进程
    • -N:仅建立隧道,不执行远程命令
    • -L:将本地3306端口转发至RDS的3306端口
      如需开机自动启动,可将命令加入crontab或创建systemd服务。
  2. 修改Laravel数据库配置
    更新.env文件,将DB_HOST改为本地隧道映射的127.0.0.1:

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=你的数据库名
    DB_USERNAME=db_user
    DB_PASSWORD=你的数据库密码
    

    config/database.php保持默认读取.env参数即可,无需额外修改。

  3. 验证并调整数据库用户权限
    通过SSH登录bastion主机,连接RDS执行权限检查:

    SELECT user, host FROM mysql.user WHERE user = 'db_user';
    

    如果host列是特定IP(比如bastion的IP),需修改为允许隧道来源的访问:

    GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'db_user'@'%' IDENTIFIED BY '你的数据库密码';
    FLUSH PRIVILEGES;
    

    (测试完成后可将%改为更严格的IP范围,提升安全性)

  4. 测试连接并重启应用
    在EC2实例上用命令测试隧道连接:

    mysql -h 127.0.0.1 -u db_user -p
    

    登录成功后,清除Laravel缓存并重启应用:

    php artisan config:clear
    php artisan cache:clear
    

内容的提问来源于stack exchange,提问作者Milon Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:21:32