最近一年的时间里,我所做的两个项目的服务和一个游戏服务器(后面简称:项目应用)需要公开到公网上,由于我家的宽带并没有公网IP地址并且也无法申请到动态的公网IP,因此需要一个软件或者是协议将服务和游戏挂到公网上。
早期有了解过 Apache 和 Nginx 可以实现反向代理,利用 SSH 连接的方式将项目应用连接至服务器,并实现从公网访问。但多次发现SSH的连接并不稳定,就算安装了 autossh 插件也会经常出现断连的情况。因此在大半年的时间里,在有动态公网的环境下尝试使用过 DDOS服务,还有许多许多其他的方式,例如:编写Python脚本实时监测连接状态,在更换IP地址的时候强制更新代理的地址,或者是采用P2P的方式,客户机和服务器直连,效果都不尽人意。
因此需要换其他的方式来将项目应用挂在公网上,于是乎采用 FRP 也就是FRP内网穿透工具来将项目应用挂在公网上。
FRP 是一个可用于内网穿透的,对外网提供服务的高性能反向代理应用,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。
在搭建一个完整的 FRP 服务之前,我们需要提前准备一些东西:
首先,我们先从 FRP 的 Github 地址下载用于服务器端的安装包,Github Releases 页面,截止编写该文档,官方已经更新到0.39.0版本。
这里选择linux_amd64.tar.gz
下载即可。通过FTP上传到 /usr/local
目录下。
进入到该目录下,可以看到下面这个样子:
红色的就是我们的压缩包,接着我们来解压
tar -xvf frp_0.39.0_linux_amd64.tar
解压完成之后可以看到左边有一个不带有任何后缀的文件夹,我们来cd进入文件夹。
可以看到文件夹目录如下所示:
frp_0.39.0_linux_amd64
|- frpc
|- frpc_full.ini
|- frpc.ini
|- frps
|- frps_full.ini
|- frps.ini
|- LICENSE
|- systemd
服务器端只需要编辑frps.ini
,我们可以用vim打开也可以使用FTP下载到本地之后使用VSCode打开。
默认的状态下是
[common]
bind_port = 7000
[common]
代表这部分是必须有的,bind_port
这个端口是用来设定 FRP 服务端端口的,我这里设定的是17465
端口
[common]
bind_port = 17465
你也可以加上token
来进行简单的身份验证,不然谁都可以用你的这台服务器做内网穿透。
服务器端作为服务端,可以删掉一些不必要的客户端文件,以免以后启动的时候选错配置文件。
rm -f frpc
rm -f frpc.ini
我们为了能让服务在关掉SSH连接之后依然能够运行,需要让服务在后台运行。这里使用screen
指令,这个模块Ubuntu本身是不涵盖的,需要自行安装:
apt-get update
在Update完成之后进行安装
apt-get install screen
这个时候就已经安装完成了。这里放几个常用的screen
指令:
screen -S name 启动一个名字为name的screen
screen -S name -X quit 删除某个session
screen -ls 是列出所有的screen
screen -r name或者id 可以回到某个screen了(如不行先detached: screen -d name)
键盘 ctrl + a + d 可以回到前一个screen,当时在当前screen运行的程序不会停止
我们新建一个screen
screen -S frps
然后进入到 FRP 目录里,输入下面的指令启动服务
./frps -c ./frps.ini
服务成功启动!
这个时候键盘按下ctrl + a + d
返回,之后就可以退出SSH了,而程序并不会因此中断。
首先,我们先从 FRP 的 Github 地址下载用于客户端的安装包,Github Releases 页面,截止编写该文档,官方已经更新到0.39.0版本。
这里选择windows_amd64.zip
即可,然后将文件解压到一个你中意的文件夹内,注意文件夹层次别太深。
客户端只需要配置frpc
相关的文件,这里打开frpc.ini
,我的配置如下
[common]
server_addr = x.x.x.x
server_port = 17465
[minecraft]
type = tcp
local_ip = 127.0.0.1
local_port = 25565
remote_port = 17778
上述的配置需要与服务端的配置相吻合
[common]
中的server_addr
填写的是刚才服务端的IP地址,server_port
填写的是服务端的bind_port
。
[minecraft]
中的local_port
填写的是ssh的端口,remote_port
则是远程连接时要输入的端口,通过frp服务映射到local_port
。
保存配置,在文件夹里打开cmd.exe
,然后输入下面的命令启动客户端。
frpc.exe -c frpc.ini
这个时候应该能在服务端看到下面的字样,表示连接成功。红色部分是打码。
方便客户端启动,写了一个简单的bat
文件,命名为frp-client.bat
,内容如下
@echo off
@title frp client service
frpc.exe -c frpc.ini
pause
保存双击启动之后,点击最小化即可,frp
服务就启动了。
请检查Ubuntu的防火墙是否为开启状态,若开启,请开放端口。若开放了端口或者没有开启防火墙,请登录云服务提供商的平台检查服务商的防火墙有无出入站端口设置。如果没有设置端口,请进行设置。
如果还是不行,请检查客户端电脑的防火墙出入站设置。