1.
概述与前提
说明:本指南以 Linux 本地机(macOS/Ubuntu)、AWS EC2 为例。
前提:你有 AWS 控制台权限、VPC 与子网已就绪、可创建安全组与 EC2 实例。
目标:通过
跳板机(Bastion)安全访问私有子网内实例,不公开 SSH 到 Internet。
2.
准备安全组与网络
创建两个安全组:bastion-sg 与 internal-sg。
bastion-sg:入站允许 TCP 22 来源为你的公网 IP(或公司网段);outbound 可通向 internal-sg。
internal-sg:入站允许 TCP 22 来源为 bastion-sg(使用安全组 ID 作为来源),无公网访问。
3.
本地生成 SSH 密钥对
在本地执行:ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/aws_bastion_key
说明:会生成 aws_bastion_key(私钥)与 aws_bastion_key.pub(公钥),可选填入密码短语。
权限:chmod 600 ~/.ssh/aws_bastion_key,确保私钥权限受保护。
4.
启动跳板机(Bastion)实例
在 AWS 控制台启动 EC2,选择公开子网,指定 bastion-sg,选择或上传密钥对:
- 如果使用 AWS keypair:在“Key pair”选择已有或创建新的,然后下载私钥;
- 如果想用本地公钥:在“Advanced”->User data 使用 cloud-init 将你的 aws_bastion_key.pub 写入 ec2-user 的 authorized_keys,示例 user-data:
#cloud-config
ssh_authorized_keys:\n - "ssh-rsa AAAA... your_email@example.com"
5.
将公钥传到私有实例(目标主机)
启动目标实例到私有子网,安全组为 internal-sg,不分配公网 IP。
方法 A(推荐):先 SSH 到 bastion,再从 bastion 将你的公钥追加到目标实例的 ~/.ssh/authorized_keys:
1) 本地:scp -i ~/.ssh/aws_bastion_key ~/.ssh/id_rsa.pub ec2-user@BASTION_IP:~/
2) 在 bastion:ssh ec2-user@TARGET_PRIVATE_IP 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < id_rsa.pub
设置权限:ssh 到目标后执行 chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys。
6.
使用 ssh-agent 与代理转发(可选)
启动代理:eval "$(ssh-agent -s)" && ssh-add ~/.ssh/aws_bastion_key
使用 -A 启用代理转发:ssh -A -i ~/.ssh/aws_bastion_key ec2-user@BASTION_IP。
注意安全:仅在可信 bastion 上启用 Agent Forwarding,避免将私钥暴露给不受信任的主机。
7.
配置本地 ~/.ssh/config 以使用 ProxyJump
在 ~/.ssh/config 添加示例段:
Host bastion\n HostName BASTION_PUBLIC_IP\n User ec2-user\n IdentityFile ~/.ssh/aws_bastion_key
Host target\n HostName TARGET_PRIVATE_IP\n User ec2-user\n IdentityFile ~/.ssh/your_target_key(如果使用相同公钥则可省)\n ProxyJump bastion
然后执行:ssh target,即会通过跳板自动转发连接。
8.
常见权限与错误排查步骤
Permission denied (publickey):检查 authorized_keys 内容与公钥是否完整、文件权限是否正确。
检查安全组:确认 internal-sg 允许 bastion-sg 的 22 端口访问;确认 bastion 的公网 IP 与本地 ssh 目标一致。
SSH 调试:ssh -vvv -i ~/.ssh/aws_bastion_key ec2-user@BASTION_IP 或 ssh -J ec2-user@BASTION_IP ec2-user@TARGET_PRIVATE_IP 查看详细日志。
9.
维护与安全建议
定期轮换密钥;使用较强算法(RSA 4096 或 ed25519)。
最小化跳板权限:Bastion 只允许必要用户登录,启用 CloudWatch Logs 或登录审计。
如果可能,结合 AWS Systems Manager Session Manager 替代跳板以减少公网暴露。
10.
问:可以把私钥上传到跳板机以便直接 SSH 到私有实例吗?
答:不建议上传私钥到跳板机,上传会增大私钥泄露风险。推荐使用 ssh-agent 转发或在跳板上仅存公钥并在目标实例放置对应公钥,或者使用 ProxyJump 从本地直接代理连接。
11.
问:如何在 AWS 控制台直接把本地公钥写入实例?
答:可在 EC2 启动时使用 cloud-init 的 user-data 将公钥写入 ec2-user 的 ~/.ssh/authorized_keys,或通过 EC2 Instance Connect(支持的 AMI)临时注入公钥进行首次访问,之后把持久公钥追加。
12.
问:连接失败如何逐步定位?
答:先确认网络(安全组、子网路由、NACL);再本地用 ssh -vvv 查看密钥是否匹配;登录 bastion 后测试能否 SSH 到目标;检查目标的 /var/log/secure 或 /var/log/auth.log 获取服务端错误信息。
来源:初学者指南aws 跳板机 公钥 配置SSH密钥与实例访问的完整步骤