跳板服务器SFTP公钥认证配置异常,请求技术排查
问题分析与解决方案
核心问题出在你使用的ProxyJump工作机制上——它是客户端侧的隧道转发,相当于你的机器C直接通过J打通的隧道和D建立SSH连接,认证环节是C直接向D提交凭证,完全绕开了J的身份,这就是为什么D会接收到C的公钥,违背了你“J作为跳板身份访问D”的设计。
要实现你预期的“C认证J,J用自身密钥认证D”的链路,需要调整配置如下:
1. 修正本地SSH配置
把d-host的ProxyJump替换成ProxyCommand,让C通过J的ssh命令发起对D的连接,这样D看到的是J的alpha用户的连接请求:
Host j-host HostName 192.168.90.3 User alpha IdentityFile /Users/my/.ssh/id_ed25519 # C的密钥,用于认证J Host d-host HostName 192.168.90.4 User alpha # 通过J的ssh命令连接D,指定J上alpha用户的密钥路径 ProxyCommand ssh -W %h:%p j-host -i /home/alpha/.ssh/id_ed25519
注意:
/home/alpha/.ssh/id_ed25519是J上alpha用户的私钥路径,你需要确保J上的alpha用户拥有这个密钥,且D的alpha用户的authorized_keys里已经添加了J的alpha用户的公钥。
2. 确保D的sshd_config配置生效
你当前的D的配置里PubkeyAuthentication no,但如果要让J的alpha用户用密钥认证D,需要修改这个配置:
Match User alpha AuthorizedKeysFile /home/alpha/.ssh/authorized_keys # 这里存放J的alpha用户公钥 ChrootDirectory /var/www/ ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no PasswordAuthentication yes PubkeyAuthentication yes # 打开公钥认证,仅允许J的公钥通过
重点:
Match块的配置必须用空格缩进(不能用Tab),否则sshd会忽略该规则;同时要确保/home/alpha/.ssh/authorized_keys的权限正确:文件权限设为600,目录权限设为700,所有者为alpha用户。
3. 验证链路有效性
在C上执行以下命令测试连接:
ssh d-host
如果配置正确,会先通过C的密钥认证J,再由J用自身密钥认证D,最终进入D的SFTP环境。
4. 适配FileZilla/CyberDuck等图形化客户端
这些客户端支持导入本地SSH配置,或手动设置参数:
- FileZilla:站点设置选择“SFTP”协议,登录类型选“密钥文件”;在“高级”选项卡中,代理类型选“SSH SOCKS 代理”,代理主机填J的IP,端口22,代理用户alpha,代理密钥文件选C的
id_ed25519;目标主机填D的IP,用户alpha,无需填写目标密钥文件。 - CyberDuck:新建SFTP连接,在“隧道”选项卡勾选“通过SSH隧道连接”,隧道主机填J的IP,用户alpha,密钥文件选C的
id_ed25519;目标主机填D的IP,用户alpha。
内容的提问来源于stack exchange,提问作者Preetam
相关产品推荐
相关产品推荐

