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 这个选项名字起得很直白——清理所有转发,让连接干干净净的。
另外 ServerAliveInterval 和 ServerAliveCountMax 这两个参数也建议加上,防止连接长时间空闲被中间设备掐断。