过一段时间要到校外学习,而学校的资源只能在校园内网下才能使用(登录集群可以看到登录ip是10开头的A类地址,无法公网ip访问)。为了方便在校外访问校园内网的集群,我手里正好也有一个备案过的服务器和域名,于是自己用frp搭建了一个反向代理服务器,穿透了校园内网,这里记录下自己搭建过程。
其实一开始我打算直接用开发比较成熟的花生壳软件做内网穿透,但是不知道怎么回事,显示连接成功但是ssh远程登陆不上,后来就放弃了,最后决定用自己的服务器和域名穿透(后来我还申请了花生壳学生版,羊毛先薅到以后再说用不用)。
frp是一个go语言写的开源内网穿透和反向代理软件,支持tcp, udp, http, https等协议,支持linux、mac、windows平台,操作也很方便,非常适合我这种小白。
1 下载frp
源代码作者发布在github,点击这里。
选择最新的release版本,注意frp在service端和client端有两个不同的程序和配置文件,service端是你想要做反向代理的有公网ip的服务器,client端是处于内网之下的你想要穿透的服务器。
service端和client端一定要同一个版本。这里我的service端和client端都是linux操作系统,所以我直接下载了linux_arm64.tar.gz(我想顺便远程操控实验室电脑,所以也下载了windows版本,默认windows远程桌面端口号是3389,这个以后再说)。
将tar.gz文件传到两台服务器上,tar -zxvf解压就可以使用了(不需要编译,就是这么简单)。
在service端保留frps程序和相应的ini配置文件,在client端保留frpc程序和相应的ini配置文件(主要防止自己搞错)。配置文件有两种,我们可以选择其中一个;ini是最简单的配置文件,full.ini配置文件中记录了全部配置参数和英文解释,需要的时候可以自己根据情况修改。
2 修改配置文件
网上的教程很多,full.ini也记载了全部的配置方法,我这里只记录下我自己的配置(敏感信息就不展示了)。
2.1 service端配置
frps.ini配置文件修改如下:
1 | [common] |
子域名设置主要是方便登录管理界面,不是必须的,反正我记不住服务器一长串ip地址…这个域名需要DNS解析后才能使用
后台不挂起运行frps:
1 | nohup ./frps -c frps.ini & |
这个时候我们是看不到运行日志的,打开刚刚设置的frps.log文件
几个设置端口都监听成功,最后也显示frps started successfully说明开启成功。
2.2 client端配置
frpc.ini配置文件修改如下:
1 | [common] |
注意下remote_port这个设置的是service端也就是云服务器的端口,通过这个端口访问client端的22端口,也就是端口映射。
同样的后台不挂起运行frpc:
1 | nohup ./frpc -c frpc.ini & |
打开nohup的输出文件:
显示login to service success表示和service端连接成功。
全部设置完成后,理论上我就可以通过云服务器的主机地址+6000端口,通过ssh方式访问学校内网中的集群主机地址+22端口了。
但是我的云服务器比较特殊,还需要进行一步开放防火墙端口。
3 开放serviced服务器端口
如果在2.2这一步配置之后一直连不上service端,那极有可能是service服务器的端口没有开放。
特别注意一点,如果是买的云服务器(比如我买的腾讯云服务器),不仅要在控制台页面开放端口,还需要在linux云服务器开放端口。举个例子,我们这里用到的云服务器端口是7000,7400,7500和6000,首先要在控制台防火墙页面 开放这几个端口。
然后在云服务器上打开防火墙,开放对应端口:
1 | systemctl start firewalld # 打开防火墙 |
注意一下防火墙端口设定完成后,需要重载防火墙才会生效。
我们把自己云服务器的防火墙和端口配置好就行(学校集群你不是root用户你也配置不了,一般来说也不会设置防火墙)。
4 frp管理面板
有两种方式可以访问:
- service端服务器 ip地址:端口号
- 设置子域名后可以用 子域名:端口号
用户名密码认证后,可以看到如下页面:
主要就是看一下连接数量,连接方式,产生的流量等等,具体就不细说了。
开个手机热点,用xshell登陆一下集群,发现显示的登录ip变成了localhost,而不是10开头的A类地址了,说明反向代理成功。
连接速度非常快,而且稳定!以后登录集群就再也不用校园网啦!
5 写在最后
这种用外网服务器做反向代理服务器,通过端口转发的方式访问内网服务器还是有一定安全风险的,该开防火墙开防火墙,小心驶得万年船。
还有,这种方法也有个缺点。打个比方如果你在校外,而学校服务器因为某种不可抗力重启了(比如停电,这在新疆真的太常见了)这就相当于你挂在后台nohup的程序被强制杀掉了。等到管理员重启后,client端的frpc程序就需要再执行一次才能生效,这个时候就只能拜托有学校集群账号的人帮你在后台执行nohup,你才能从外网访问集群。
要应对这种情况,最简单的是你写个开机自启动脚本执行frpc,但是你没有root权限是不可行的…或者你让集群管理员给你su权限,这一般来说也不太可能…如何完美解决这个问题还有待研究