打通網絡壁壘:本地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/