情况1:假设你的宿舍有一台windows电脑A,你想在宿舍里远程调试公司Linux服务器B上的一个前后端项目,但这个项目没有部署到公网上,且服务器B也没有图形化界面。
如果你觉得用命令行调试服务器上的程序特别麻烦,想用电脑A的图形化界面对服务器B的程序进行操作,可以参考该篇文章。
情况2:假设你有两台不在同一个局域网下的服务器B和C,你想用服务器B访问服务器C上的前后端项目,而服务器C上的项目没有部署到公网上,故你需要进行内网穿透操作(ssh 隧道),可以参考此篇文章。
最近导师布置了个前后端的项目,项目框架是FastAPI,且项目存放在组里的服务器,我的情况与1相同。
想调试项目的话一般只能通过编写python代码来发送POST/GET等请求,难以使用Postman或浏览器访问路由的方式进行前后端调试,极其不方便。
但俗话说得好,没有王屠夫,就一定得吃带毛猪?
本文将介绍一种端口转发的方法,让服务器上运行的程序所在端口映射到本地电脑的端口上,从而实现在本地进行前后端调试。
最后我也是成功的用宿舍本地电脑的浏览器Chrome和Postman对项目进行图形化界面调试。
官网链接: https://www.termius.com/
Termius是一款连接远程服务器的工具,你可以把你要远程连接的服务器信息保存在Hosts里,方便以后一键连接,连接效果图如下
用Termius主要原因是其自带了端口转发(Port Forwarding)的功能。
什么是端口转发?
假设你的服务器IP是197.0.123.1,你的前后端项目运行在服务器197.0.123.1:19327端口上,那么你在宿舍电脑直接访问197.0.123.1:19327肯定是搜不到该程序的页面的。
而端口转发的作用就是将197.0.123.1:19327映射到你本地端口上,比如映射到127.0.0.1:19327,这样你访问127.0.0.1:19327就能直接访问到197.0.123.1:19327上的内容,就相当于服务器上的程序跑在了你的127.0.0.1:19327端口上面,你后续便可以利用Postman或Chrome直接进行访问调试。
以下是端口转发教程:
首先需要在Termius的Host里点击NEW HOST来保存要连接的服务器的信息,假设我们要连接的远程服务器为197.0.123.1,连接端口为7777(注:连接端口和程序运行端口不是一个东西,就跟ssh连接远程服务器一样需要端口,如果你之前用过ssh命令连接远程服务器却不用填端口,是因为ssh命令默认的连接端口就是22,隐式地帮你填写了)
填写完后双击服务器进行连接:
连接成功后会显示命令行界面:
在命令行运行程序,可以看到程序跑在了服务器的0.0.0.0:19327端口下:
Local port number 为 服务器运行程序的端口19327
Bind address 为 服务器运行程序的本地地址0.0.0.0
Intermedia host 为 上面创建的服务器Host
Destination address 为 宿舍电脑的本地地址127.0.0.1
Destination port number 为 宿舍电脑想要映射的端口19327。注意:本地映射端口最好和服务器的程序端口一致,不然可能出现连接不上的问题,具体为何我也不清楚。
创建完成后,双击规则进行运行,一定要运行起来规则才有用。
此时我们可以发现用Chrome浏览器访问127.0.0.1:19327就访问到了服务器里的0.0.0.0:19327页面
后续就可以愉快的对你的本地端口进行各种POST/GET操作了。
由于服务器大多都没有GUI界面,所以你在服务器A想访问服务器B的运行程序时,没法用上述所说的工具termius,这时候你就要用ssh命令行自带的端口转发功能:
假设你的服务器A的地址是173.1.45.8,用户名是root,你想将服务器B运行在0.0.0.0:19327的程序映射到服务器A本地的localhost:19327端口里,以便你在服务器A直接访问localhost:19327的内容,你可以在服务器B命令行输入以下命令:
ssh -N -R 0.0.0.0:19327:localhost:19327 root@173.1.45.8
该过程需要填写[email protected]的密码。填完后你会发现你的命令窗口下方卡住不动了,其实这是正常的,这正是端口转发的功能保持连接,如果你这时候关掉了窗口,那整个连接就会自己断掉。
至于-N -R的参数代表什么意思,我也不太清楚(但它确实work了 Orz),不误人子弟了,可以自己查一查。
BTW,这里有一篇不错的实际使用资料可以参考:https://www.zhihu.com/people/di-san-miao-mo-de-shuang-qu-zheng-qie-43/posts
以上便是本文的教程,个人对内网穿透等概念理解比较浅显,如有错误,欢迎指出。