Google Cloud实例SSH端口转发遇Permission Denied(public key)问题求助
看起来你碰到了两个关联的小问题:主机真实性验证提示和公钥权限拒绝,我来一步步帮你搞定:
1. 先处理主机真实性无法确定的问题
当你第一次用ssh -L命令连接实例时,SSH会弹出类似这样的提示:
The authenticity of host 'instance_external_ip (xxx.xxx.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这时候直接输入yes回车确认就行,SSH会把主机密钥记录到~/.ssh/known_hosts文件里,下次连接就不会再弹这个提示了。
如果之前连接过同IP/同名的主机导致密钥冲突,你可以先删掉旧的记录:
ssh-keygen -R instance_external_ip
然后重新执行端口转发命令,按提示确认主机真实性即可。
2. 解决Permission Denied (public key)问题
既然你平时能成功SSH连接实例,大概率是手动执行ssh -L时没用到正确的密钥对。Google Cloud的gcloud工具默认会生成并使用~/.ssh/google_compute_engine这个密钥,而普通ssh命令默认用的是~/.ssh/id_rsa,如果这个密钥没被添加到实例的授权列表里,就会触发权限拒绝错误。
这里有两种解决方法:
方法一:直接指定正确的密钥文件
在ssh -L命令里加上-i参数,明确指定gcloud生成的密钥:
ssh -i ~/.ssh/google_compute_engine -L 16006:127.0.0.1:8080 username@instance_external_ip
方法二:让SSH自动匹配Google Cloud密钥
编辑~/.ssh/config文件(如果没有就新建一个),添加以下配置:
Host instance_external_ip IdentityFile ~/.ssh/google_compute_engine User username
保存后,下次直接执行ssh -L 16006:127.0.0.1:8080 instance_external_ip,SSH就会自动用正确的密钥连接了。
额外检查点
- 确保本地私钥文件的权限是600,权限太开放会被SSH拒绝:
chmod 600 ~/.ssh/google_compute_engine - 确认你的公钥已经在实例元数据里:登录Google Cloud控制台,找到实例的元数据标签页,查看
ssh-keys项里是否有你的公钥内容(用gcloud连接的话,通常会自动上传)。
测试端口转发
搞定上面的问题后,重新执行端口转发命令,没有报错的话,你就可以在本地浏览器访问http://127.0.0.1:16006,应该就能正常访问实例上8080端口的服务了。
内容的提问来源于stack exchange,提问作者bigbounty

