如何通过经ALB访问的EC2实例建立到RDS的SSH隧道?
问题解答:通过ALB建立SSH隧道及替代方案
核心结论
不能通过Application Load Balancer (ALB) 建立SSH隧道。ALB是七层负载均衡,仅处理HTTP/HTTPS协议流量,不支持SSH(TCP 22端口)的转发,因此无法作为SSH隧道的入口。
推荐方案
方案1:使用AWS Systems Manager (SSM) 实现端口转发
这是最安全且无需额外资源的方案,适配你的私有子网EC2场景:
- 前提:Elastic Beanstalk的Amazon Linux 2/2023实例默认预装了SSM Agent,只需给EC2实例的IAM角色添加
AmazonSSMManagedInstanceCore权限 - 操作步骤:
- 本地安装并配置AWS CLI(确保已配置有效凭证)
- 执行以下命令建立到RDS的端口转发(替换占位符为你的实际信息):
aws ssm start-session --target <EC2实例ID> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber": ["3306"], "localPortNumber": ["3306"], "host": ["<RDS实例端点>"]}' - 直接用MySQL客户端连接
localhost:3306即可,无需额外SSH隧道配置
方案2:部署堡垒主机
如果偏好传统SSH方式,可在公有子网部署堡垒主机:
- 配置步骤:
- 在公有子网创建一台EC2堡垒主机,安全组仅开放22端口给你的本地IP
- 配置安全组规则:
- 堡垒主机安全组允许访问私有子网EC2的22端口
- 私有子网EC2安全组允许堡垒主机的SSH访问
- RDS安全组允许私有子网EC2的3306端口访问
- 本地通过堡垒主机建立SSH隧道到RDS(替换占位符):
ssh -i "你的密钥文件.pem" -L 3306:<RDS实例端点>:3306 ec2-user@<堡垒主机公网IP>
localhost:3306访问RDS。
Elastic Beanstalk环境提示
- 优先选择SSM方案,无需修改现有Elastic Beanstalk的负载均衡或子网配置
- ALB不支持TCP协议的非HTTP/HTTPS转发,请勿尝试修改ALB监听规则适配SSH流量(如需TCP转发需使用Network Load Balancer,但Elastic Beanstalk默认配置为ALB)
内容的提问来源于stack exchange,提问作者Samuel Davies
相关产品推荐
相关产品推荐

