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


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

<!--more-->

## 问题现场

配置好 ProxyJump 之后执行 git pull，直接报错：

```bash
$ 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` 应该是这样的：

```text
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`：

```text
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` 这个选项名字起得很直白——清理所有转发，让连接干干净净的。

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

