<aside> 💡
公司奇奇怪怪的网络拓扑和安全软件导致我没办法在工作机上的WSL直接访问公司Git仓库,被迫只能在远程开发机上用VScode SSH Remote开发。然而远程机无法访问 Internet,像是 Copilot 这些依赖外网的插件就无法使用。于是想了一个法子:通过远程机作为跳板访问公司仓库。
</aside>
这个头疼的问题可以抽象为这样一个常见问题:A 可以访问 B 上的某个服务 B.service,C 无法访问 B,这时可以通过端口转发使得 C 通过 A 访问 B.service。
对于使用 git 协议通信的 git,我们只要转发请求到仓库的 sshd 监听端口(通常为22)即可。网上查了两种方案:
/etc/ssh/sshd_config
开启端口转发功能。重启 sshd.service
。$ echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config
$ systemctl restart sshd.service
-N
:不用于执行远程命令-f
:转发-L
:本地端口 👇git仓库ip 👇代理服务器的ssh url
$ ssh -N -f -L <local_port>:<repo_ip>:<repo_port> <proxy_user>@<proxy_ip>
👆本地监听的端口 👆转发的目标端口(即为git仓库的SSH端口)
# 记 A.ip=1.1.1.1、B.ip=2.2.2.2、C.ip=3.3.3.3,我打算在2568端口上创建监听套接字
$ ssh -N -f -L 2568:2.2.2.2:22 [email protected]
git clone git@localhost:2568/path/to/repo.git
(要提前将C的公钥传到)SSH 隧道 TCP 转发原理
参考:https://blog.csdn.net/CTLLIN/article/details/126848623 https://ssooking.github.io/2020/05/nc端口转发/
TCP 套接字转发 SSH 协议原理
套接字没有持久化,重启后会丢失,因此每次开机都要创建新的套接字(或者将 socket 加入 systemd 进行管理)。
SSH 隧道有时候会失效,需要重新建立连接。