抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

过一段时间要到校外学习,而学校的资源只能在校园内网下才能使用(登录集群可以看到登录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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
bind_port = 7000 # frp监听的端口,默认7000,可改
bind_udp_port = 7400 # UDP通讯端口,可不设置,用于点对点穿透
token = xxxxxxxx # 安全考虑需要设置口令,client端需要用到

dashboard_port = 7500 # frp管理端口,可改
dashboard_user = xxxx # 管理端口认证的用户名,用于身份识别,自己设置
dashboard_pwd = xxxx # 管理端口认证的密码,用于身份识别,自己设置
enable_prometheus = true

subdomain_host = xxx.xxx.xxx # 设置子域名,主要方便登录管理界面。不用ip地址,用域名+端口的方式直接访问

log_file = /usr/local/frp/frps.log # frp日志配置,这里是记录3天的日志信息
log_level = info
log_max_days = 3

子域名设置主要是方便登录管理界面,不是必须的,反正我记不住服务器一长串ip地址…这个域名需要DNS解析后才能使用

后台不挂起运行frps:

1
nohup ./frps -c frps.ini &

这个时候我们是看不到运行日志的,打开刚刚设置的frps.log文件

几个设置端口都监听成功,最后也显示frps started successfully说明开启成功。

2.2 client端配置

frpc.ini配置文件修改如下:

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = xxx.xxx.xxx.xxx # 填写你的service端服务器公网ip,这里我写我的云服务器ip
server_port = 7000 # 前面设置的frp监听端口,需要保持一致
token = xxxxxxxx # 前面设置的口令

[ssh] # 这里只演示ssh端口的映射,其他参考frpc_full.ini
type = tcp # tcp协议
local_ip = 127.0.0.1 # 这个地址代表本机
local_port = 22 # ssh端口,默认22,由你ssh登录的client服务器决定
remote_port = 6000 # 映射的service端服务器的端口,自己定义

注意下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
2
3
4
systemctl start firewalld   # 打开防火墙
firewall-cmd --permanent --add-port=7000/tcp # 永久开放指定的7000端口(其他端口同理)
firewall-cmd --reload # 重启防火墙
firewall-cmd --list-ports # 查看防火墙开放的所有端口

注意一下防火墙端口设定完成后,需要重载防火墙才会生效

我们把自己云服务器的防火墙和端口配置好就行(学校集群你不是root用户你也配置不了,一般来说也不会设置防火墙)

4 frp管理面板

有两种方式可以访问:

    1. service端服务器 ip地址:端口号
    1. 设置子域名后可以用 子域名:端口号

用户名密码认证后,可以看到如下页面:

主要就是看一下连接数量,连接方式,产生的流量等等,具体就不细说了。

开个手机热点,用xshell登陆一下集群,发现显示的登录ip变成了localhost,而不是10开头的A类地址了,说明反向代理成功。

连接速度非常快,而且稳定!以后登录集群就再也不用校园网啦!

5 写在最后

这种用外网服务器做反向代理服务器,通过端口转发的方式访问内网服务器还是有一定安全风险的,该开防火墙开防火墙,小心驶得万年船。

还有,这种方法也有个缺点。打个比方如果你在校外,而学校服务器因为某种不可抗力重启了(比如停电,这在新疆真的太常见了)这就相当于你挂在后台nohup的程序被强制杀掉了。等到管理员重启后,client端的frpc程序就需要再执行一次才能生效,这个时候就只能拜托有学校集群账号的人帮你在后台执行nohup,你才能从外网访问集群。

要应对这种情况,最简单的是你写个开机自启动脚本执行frpc,但是你没有root权限是不可行的…或者你让集群管理员给你su权限,这一般来说也不太可能…如何完美解决这个问题还有待研究

欢迎小伙伴们留言评论~