<aside> 💡

公司奇奇怪怪的网络拓扑和安全软件导致我没办法在工作机上的WSL直接访问公司Git仓库,被迫只能在远程开发机上用VScode SSH Remote开发。然而远程机无法访问 Internet,像是 Copilot 这些依赖外网的插件就无法使用。于是想了一个法子:通过远程机作为跳板访问公司仓库。

</aside>

这个头疼的问题可以抽象为这样一个常见问题:A 可以访问 B 上的某个服务 B.service,C 无法访问 B,这时可以通过端口转发使得 C 通过 A 访问 B.service。

对于使用 git 协议通信的 git,我们只要转发请求到仓库的 sshd 监听端口(通常为22)即可。网上查了两种方案:

  1. SSH 内置的隧道转发功能(只支持使用SSH协议的服务,比如这里的git)
  2. TCP 套接字转发+SSH协议(使用 socat/nc 在代理服务器上创建转发套接字)

SSH 隧道

$ echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config
$ systemctl restart sshd.service
                            👇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]

SSH 隧道 TCP 转发原理

SSH 隧道 TCP 转发原理

参考:https://www.cnblogs.com/f-ck-need-u/p/10482832.html

TCP 套接字转发

参考:https://blog.csdn.net/CTLLIN/article/details/126848623 https://ssooking.github.io/2020/05/nc端口转发/

TCP 套接字转发 SSH 协议原理

TCP 套接字转发 SSH 协议原理

注意事项

套接字没有持久化,重启后会丢失,因此每次开机都要创建新的套接字(或者将 socket 加入 systemd 进行管理)。

SSH 隧道有时候会失效,需要重新建立连接。