Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

利用 ProxyJump 和 SSHFS 实现主机间免密访问:一次完整的排错记录

在一次内部网络文件共享需求中,我需要让 C 主机(Ubuntu)可以像本地访问一样访问 A 主机(某linux系统)上的文件。整个网络结构如下:

  • A 主机通过有线连接局域网 X
  • B 主机(Windows 7,使用了Bitvise作为ssh服务端和客户端)作为跳板机,拥有两张网卡:
    • 有线连接局域网 X,与 A 主机互通
    • 无线连接局域网 Y,与 C 主机互通
  • C 主机通过无线连接局域网 Y

最终目标:C 主机可以通过文件管理器或终端免密访问 A 主机的共享目录。


初步思路与尝试

  1. 尝试通过 SSHFS 挂载远程目录

    1
    sshfs A-via-B:/home/yourAUser ~/mnt/a-via-b

    该命令依赖于 .ssh/config 中定义的 ProxyJump:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Host B
    HostName B_HOST_IP
    User yourBUser
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

    Host A-via-B
    HostName A_HOST_IP
    User yourAUser
    ProxyJump B 
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
  2. 初始连接测试成功,但每次挂载都要输入密码。


为实现免密登录所做的尝试

  1. 使用 ssh-copy-id 实现公钥传输失败: Windows 的 Bitvise SSH Server 不支持 ssh-copy-id -J 中的 -J 选项。

  2. 手动添加公钥到 Bitvise 服务器: 将 C 主机生成的公钥复制进 B 主机 Bitvise 的用户配置中,确保 B 主机能被免密登录。具体配置方式参考下图:
    Bitvise密钥配置

  3. 仍然无法免密连接 A 主机,在执行如下命令时依然提示输入密码:

    1
    ssh -J yourBUser@B_HOST_IP yourAUser@A_HOST_IP
  4. 尝试用 SSH 命令手动追加公钥到 A 主机 authorized_keys

    1
    2
    ssh -J yourBUser@B_HOST_IP yourAUser@A_HOST_IP \
    "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_ed25519.pub

    执行成功后,依然提示密码。


关键问题定位与解决

查看 A 主机日志:

1
sudo tail -f /var/log/auth.log  

发现如下报错:

1
Authentication refused: bad ownership or modes for directory /home/A

这是 SSHD 拒绝使用公钥认证的明确信号:家目录权限设置不安全

✅ 解决办法:修复权限

1
2
3
4
chmod 700 /home/USERNAME
chmod 700 /home/USERNAME/.ssh
chmod 600 /home/USERNAME/.ssh/authorized_keys
chown -R USERNAME:USERNAME /home/USERNAME

执行上述操作后再次尝试连接:

1
ssh -J yourBUser@B_HOST_IP yourAUser@A_HOST_IP

👉 免密登录成功!SSHFS 挂载也无需再输入密码。


总结

本次排错过程经历了:

  1. 正确配置 ProxyJump 和 SSHFS
  2. 在 Windows 跳板机上设置公钥认证(Bitvise)
  3. 手动将公钥复制到目标主机
  4. 排查服务端拒绝认证的根本原因 —— 权限问题

📌 教训:哪怕配置都正确,SSH 也会因权限不符合预期而强制拒绝公钥认证!

希望这篇记录能为遇到类似需求的朋友提供有价值的参考。

评论