【开发便利】让远程Linux服务器能够访问内网git仓库
打通网络壁垒:本地Windows直连内网Git的远程开发终极指南
场景痛点
开发主力是一台云端的 Linux 服务器,代码却存放在无法被公网访问的公司内网 Git 仓库中。
本文利用 Windows 电脑作为“网络桥梁”,搭建一条能自动重连的 SSH 隧道,解决远程开发中的网络隔离问题。
核心思路
利用 Windows 电脑作为跳板,建立一个从它到远程 Linux 服务器的反向 SSH 隧道。当远程服务器访问自己的某个端口时,流量会被加密传输回你的 Windows 电脑,再由你的电脑转发至内网的 Git 服务器,从而打通网络壁垒。
数据流向:
[远程Linux服务器]
-> [SSH隧道]
-> [你的Windows电脑]
-> [公司内网Git服务器]
1. 配置SSH密钥
1.1 在本地 Windows 电脑上生成 SSH 密钥
打开 PowerShell,执行以下命令。如果 C:\Users\你的用户名\.ssh\
目录下已有 id_rsa
和 id_rsa.pub
文件,可跳过此步。
# -N "" 表示创建一个没有密码的密钥,这对于自动化脚本至关重要
ssh-keygen -t rsa -b 4096 -N "" -f C:\Users\[你的用户名]\.ssh\id_rsa
- 这会生成一个没有密码的私钥 (
id_rsa
) 和公钥 (id_rsa.pub
)。
1.2 在远程 Linux 服务器上生成 SSH 密钥
登录你的远程 Linux 服务器,执行相同操作。如果 /root/.ssh/
(或 ~/.ssh/
) 目录下已有密钥,可跳过。
# -N "" 创建一个没有密码的密钥
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
1.3 【关键】将公钥添加到内网 Git 平台
-
添加你的 Windows 电脑公钥
- 在 Windows PowerShell 中,获取公钥内容:
cat C:\Users\[你的用户名]\.ssh\id_rsa.pub
- 复制输出的全部内容。
- 登录你的内网 Git 平台(如 GitLab, Gitea, Gogs),进入 “个人设置” -> “SSH 密钥” 页面,将复制的公钥添加进去。
- 在 Windows PowerShell 中,获取公钥内容:
-
添加你的远程 Linux 服务器公钥
- 在远程 Linux 服务器上,获取公钥内容:
cat ~/.ssh/id_rsa.pub
- 复制输出内容,用同样的方式,将其也添加到内网 Git 平台的 SSH 密钥列表中。
- 在远程 Linux 服务器上,获取公钥内容:
注:为何要添加两个公钥?我们最终的隧道方案会让认证请求回退到 Windows 电脑来处理,因此 Windows 的公钥是必须的。但为了覆盖所有情况并确保
git
命令在服务器上总能找到一个有效的身份,将服务器自身的公钥也添加进去是最为稳妥的做法。
2. 从 Windows 免密登录远程服务器
为了让我们的隧道脚本能自动运行,必须让 Windows 电脑能无需密码地登录到远程 Linux 服务器。
-
在 Windows PowerShell 中,使用
ssh-copy-id
命令将你的 Windows 公钥 传送到远程服务器。# 将 user 和 110.40.228.116 替换为你的实际信息 ssh-copy-id root@110.40.218.106
- 这个过程会要求你输入一次远程服务器的登录密码。
-
测试免密登录。完成后,尝试再次登录,如果直接进入服务器而没有提示输入密码,则配置成功。
ssh root@110.40.228.116
测试
windows执行命令:
# 命令格式: ssh -fN -A -R <远程监听端口>:<目标内网IP>:<目标内网端口> <user>@<远程服务器IP>
ssh -fN -A -R 2222:192.168.222.54:22 user@110.40.218.106
然后登录远程服务器,使用git clone一个仓库,测试是否连通。
git clone ssh://git@localhost:2222/仓库名.git
如果成功则正确
3. 创建轻量级持久化隧道
我们将使用一个“批处理脚本 + VBS启动器”的组合,实现一个无需安装任何软件、双击即可在后台运行、且能自动重连的 SSH 隧道。
3.1 编写“连接与重连”脚本 (start_tunnel.bat
)
在你的 Windows 电脑上(例如桌面)创建一个名为 start_tunnel.bat
的文件,内容如下:
@echo off
rem 设置窗口标题,方便在任务管理器中识别
title SSH Tunnel Connector:loop
echo [%time%] 启动SSH隧道连接...
rem --- 核心SSH命令,请确保-i后面的密钥路径正确 ---
ssh.exe -N -i "C:\Users\[你的用户名]\.ssh\id_rsa" -R 2222:192.168.222.54:22 root@110.40.218.106 -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yesecho [%time%] SSH连接已断开,将在10秒后重连...
rem 等待10秒,防止因连接问题过于频繁地重试
timeout /t 10 /nobreakgoto loop
- 【必须修改】: 将
C:\Users\[你的用户名]\.ssh\id_rsa
替换为第一步中你 Windows 电脑私钥的准确路径。 - 【必须修改】: 将
192.168.222.54
替换为你内网 Git 服务器的 IP 地址。 - 【必须修改】: 将
root@110.40.218.106
替换为你远程 Linux 服务器的用户名和 IP 地址。
3.2 编写“后台隐藏运行”启动器 (run_in_background.vbs
)
在与 start_tunnel.bat
相同的文件夹里,再创建一个名为 run_in_background.vbs
的文件,内容如下:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "C:\Users\[你的用户名]\Desktop\start_tunnel.bat", 0, False
- 【必须修改】: 将
C:\Users\[你的用户名]\Desktop\start_tunnel.bat
替换为你上一步创建的start_tunnel.bat
文件的绝对完整路径。
3.3 使用隧道
- 启动:双击
run_in_background.vbs
文件。隧道将在后台无窗口运行。 - 停止:打开任务管理器 (
Ctrl+Shift+Esc
) -> “详细信息”,结束ssh.exe
进程。
4. 远程开发 - 在服务器上配置 Git
隧道已经联通,现在我们可以在远程服务器上享受开发的乐趣了。
- 通过你喜欢的方式(VSCode Remote, JetBrains Gateway, …)连接到你的远程 Linux 服务器。
- 打开服务器的终端。
4.1 克隆新仓库
使用 localhost
和隧道端口 2222
来代替内网 Git 服务器的 IP 地址。
# 原命令: git clone git@192.168.222.54:path/to/repo.git
# 新命令:
git clone ssh://git@localhost:2222/path/to/repo.git
- 注意:协议头
git@
换成了ssh://git@
,IP 地址后的冒号:
换成了斜杠/
。git
是你在 Git 平台上的用户名。
最后,加班写博客的我祝大家编码愉快!
或者可以使用autossh实现链接的稳定,这个比简单的脚本更好。
可以参考:https://wzx046.github.io/post/70/