目录
前言
梳理
正文
【本文也适用Linux穿Linux】
我配置是这样,有台阿里云,Linux系统,然后实验室有台3090的服务器,装的是win10系统,但接的是教育网宽带,相当于被NAT了,没有自己的公网IP,无法直接访问到。所以想在家也能使用组内GPU服务器,一个自然想法就是使用阿里云内网穿透组内win10,然后自己笔记本再ssh接入阿里云,让阿里云转发ssh流量,实现控制组内GPU。
这里不得不吐槽win10,其实你去网上搜教程,大部分都是win/mac/linux客户端,然后使用公网linux穿内网linux,就没听过使用公网linux穿内网windows的。后面的踩坑也验证了这点:
我也不知道踩坑查资料开了多少标签,反正开了关关了开,最后成功穿透后剩下就是上面情况(实际看过的应该是好几倍)
如你所见,几乎所有出现在搜索引擎上的内网穿透远程开发的文章我都看了,最后得出了下面的方案实现公网linux穿内网windows。实际上公网linux穿内网linux很容易,网上一堆教程,实现的方式也多种多样,但你也知道windows总是有些奇奇怪怪的地方,所以公网linux穿内网windows可以把人都整自闭。
首先说一些不建议采取的路线
1.网上一系列在Vscode里使用ProxyCommand、ProxyJump命令穿透的
2.使用ssh -fCNL与ssh -fCNR系列等原生ssh命令建立转发隧道的
其实回过头看会发现,网上那些文章,他们各自的网络环境都不太一样,有的是公网跳板机和目标机在同一内网,只是跳板机同时具有内网和公网IP,有的是公网跳板机是云主机,和目标机不在同一内网,但这些他们在文章中都不会提起。有的告诉你加什么到配置文件,注释什么配置,但却永远不会把关键地方的完整配置告诉你,因为他们可能自己都忘了改了哪些,或者自己都不知道哪些关键配置还可能起作用,所以有时候直接跟着他们步骤走会觉得有些奇怪。网上那些文章也许对linux穿linux会成功,但linux穿win,不用再试了,帮你试烂了。
如果你和本文的网络情况类似(云主机跳板,和目标机不在同一网段),那内网穿透的关键在于跳板机与内网目标机的连接。如何理解?好比下图红色框内部分,一旦你建立了内网主机与阿里云的ssh转发隧道,两者在用户的使用体验看来似乎融为了一体,就感觉好像把实验室的主机搬到了阿里云上给你访问一样,这就是ssh转发隧道建立后对通信细节的屏蔽,对用户使用透明化。
对于上图来说,假设目标服务端口是80端口的Tomcat服务,或者是22端口的ssh服务,一旦你建立了内网穿透的隧道(通过内网穿透客户端与服务端端口),那么你访问阿里云的远程暴露端口就相当于访问内网主机的目标服务端口,从使用体验上就像远程暴露端口和目标服务端口“融为了一体”,或者像把目标服务端口搬到了远程暴露端口上。
还不形象?
举个更具体的例子,假设远程暴露端口是阿里云上的4441端口,目标服务端口是内网主机的22端口,现在我想在家把笔记本上的文件传到内网主机的DELL用户中,如果不建立内网穿透隧道,那我需要从家出发,跑到实验室,连上和对应wifi和内网主机在同一网段下,然后使用
scp file.docx [email protected]:C:/Users/DELL/file.docx
命令将文件传过去。
但建立穿透隧道后你就可以直接在家使用
scp file.docx [email protected]:C:/Users/DELL/file.docx
命令直接将文件拷贝过去。其中47.107.xx.xx是阿里云ip。可以看到,唯一变动的部分就是ip,这是不是就好像直接把内网主机搬到阿里云上给你访问一样?
同样隧道建立后就与你用什么操作系统、什么软件访问整体无关了,你在Win下用IDEA,或者你在Mac下用Vscode,或者在Ubuntu下用Pycharm,甚至在安卓上使用Termux都是一样的,你只需要ssh远程暴露端口即可。
本文最终选择frp作为内网穿透的构建工具,为什么?因为只有linux和linux才能通过原生ssh命令建立ssh转发隧道,所以这使得ProxyCommand之类的根本建立不了。而frp又是跨平台,所以是实现linux穿win的可行方案。
去github上下载win和linux的frp版本
分别解压后将使用win的frp客户端连接linux的frp服务端
在阿里云Linux上,在frps.ini里添加
[common]
bind_port = 4442
其中4442端口对应梳理部分那张图的内网穿透服务端端口,我随便设的,前提是端口已放行。添加完后可以cat检查下
[root@izwz99t7wh8lhysugop73tt ~]# cat frp/
frpc frpc.ini frps_full.ini LICENSE systemd/
frpc_full.ini frps frps.ini nohup.out
[root@izwz99t7wh8lhysugop73tt ~]# cat frp/frps.ini
[common]
bind_port = 4442
[root@izwz99t7wh8lhysugop73tt ~]#
然后使用
nohup ./frps -c ./frps.ini &
命令开启frp服务端。
在win上,编辑frpc.ini
添加下述内容到frpc.ini后保存
[common]
server_addr = 47.107.xx.xx
server_port = 4442[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 4441
其中4441对应梳理部分图中的远程暴露端口,给你笔记本访问的,local_port对应目标服务端口,就是到底用tomcat的web服务,还是ssh服务,这里建立ssh转发隧道,故为22
按住shift,右键frp的根目录,选择powershell打开(最好powershell,别cmd),输入frpc.exe -c frpc.ini启动客户端连接,成功后输出start proxy success
然后在你笔记本上输入
ssh -p 4441 [email protected]
就可以访问啦
jackzhang@jackdeMacBook-Pro ~ %
jackzhang@jackdeMacBook-Pro ~ % ssh -p 4441 [email protected]
Microsoft Windows [版本 10.0.19042.1110]
(c) Microsoft Corporation。保留所有权利。
dell@DESKTOP-UGLLMLF C:\Users\DELL>
dell@DESKTOP-UGLLMLF C:\Users\DELL>
dell@DESKTOP-UGLLMLF C:\Users\DELL>
没看到输入密码是因为我配置了秘钥免密登陆,在远程开发中,使用秘钥免密登陆几乎是必须的,Vscode没秘钥似乎还不让连,所以建立配置秘钥免密登陆,可以参考这篇:Linux、Windows、Mac非root普通用户使用秘钥免密SSH登录
那问题来了,要配置哪些主机到哪些主机的秘钥免密登陆?
我这边配置了内网win10到阿里云Linux间的双向秘钥免密登陆(互换公钥),以及我Mac笔记本到内网win10的秘钥免密登陆(即Mac的公钥添加到win10的DELL用户下的authorized_keys文件里),反正是成功穿透了。
还要注意配置成功后ssh的是[email protected],是Win10的用户名+Linux的IP,这个很重要,搞混了可连不上。
至于Vscode,下载Remote Development插件
会提示你输入一个ssh命令
你把那个ssh -p 4441 [email protected]命令输进去,Vscode就会自动生成相应的配置,至此,你就可以通过Vscode直接进行远程开发了。
你在Mac上键入的git clone巴拉巴拉的命令实际上在win10上执行,把项目下载到win10后,设置use_cuda=True之类的,直接一键运行按钮,代码就在win10上用GPU跑起来啦。