目录

Git SSH 踩坑记:ProxyJump 连接被掐断的解决办法

之前把代码仓库从公网搬到了内网服务器,结果 git 操作全废了。这台机器只能通过跳板机访问,刚开始以为配个 ProxyJump 就完事了,没想到踩了个大坑。

配置好 ProxyJump 之后执行 git pull,直接报错:

$ git pull origin main
Connection closed by UNKNOWN port 65535
fatal: Could not read from remote repository.

或者这样:

Killed by signal 1

当时第一反应是网络问题,ping 跳板机没问题,SSH 到跳板机也没问题,怎么一连上就断?

先确认一下,~/.ssh/config 应该是这样的:

Host jump-server
    HostName jump.example.com
    User my_user

Host git-server
    HostName git.example.com
    User git
    ProxyJump jump-server

这个配置本身没问题,SSH 的 ProxyJump 语法就是让流量先走跳板机再转发到目标机器。但问题出在后面。

SSH 连接成功后,客户端会默认尝试设置一些"额外的东西"——端口转发、X11 转发、Agent Forwarding 之类。但内网服务器(或者你本地的代理软件)安全策略比较严,直接拒绝这些请求。

SSH 这边一看:好家伙,请求被拒,是不是被劫持了?直接发 SIGHUP 掐断连接,先保安全再说。

所以问题不在网络本身,而是 SSH 的自动转发机制和安全策略打架了。

很简单,关掉那些多余的转发就行。在配置里加上 ClearAllForwardings yes

Host jump-server
    HostName jump.example.com
    User my_user

Host git-server
    HostName git.example.com
    User git
    ProxyJump jump-server
    ClearAllForwardings yes
    ServerAliveInterval 30
    ServerAliveCountMax 5

加完直接 git pull 试一下,应该就通了。

SSH 的很多默认行为是为了方便,但在复杂网络环境下反而会惹麻烦。ClearAllForwardings yes 这个选项名字起得很直白——清理所有转发,让连接干干净净的。

另外 ServerAliveIntervalServerAliveCountMax 这两个参数也建议加上,防止连接长时间空闲被中间设备掐断。