FRP最新版已经更新好久了,但网上的攻略大多数还是老版本,配置文件还是frps.ini时代的,所以来记录一个最新版的FRP内网穿透攻略。

软件安装

本来想用docker直接部署,结果找了半天没有一个镜像源是新版的,甚至最新的一个都已经是2022年的版本,遂放弃,去使用github上的官方版本。

首先找到FRP的官方仓库地址:

https://github.com/fatedier/frp

在发行版(Release)里下载对应操作系统的版本:

frp_0.58.1_linux_amd64.tar.gz linux端的文件
frp_0.58.1_windows_amd64.zip windows端的软件

需要注意的是FRP的压缩包里同时包含了服务端和客户端的文件/程序,我这次只在Linux端部署服务端(有公网IP、负责转发),只在Windows端部署客户端(有需要映射的接口)。将里面的文件解压出来,放在以后要用的专属目录里。在服务端,我们只会用到frps和frps.toml;在客户端,我们只会用到frpc.exe和frpc.toml(后者都是前者的配置文件)。

前期准备

在一切开始之前,你应该先规划好要使用的端口(会比较多),并在你的云服务器提供商、管理面板(如有)的防火墙策略里放行他们。如果严格按照本教程,至少要放行:

  • 7000 这是frp默认的服务端监听端口

  • 7500 这是我设置的网页看板端口,可以通过图形化界面监控

  • 6060 这是我设置的第一个隧道映射到服务器的端口

编写配置文件

服务端配置 frps

进入文件存放的目录,编写frps.toml。

>> vim frps.toml

bindPort = 7000					
	#服务端的监听端口,客户端需要与此一致,默认为7000

auth.token = "your_token"		
	#通过token验证,客户端只有与此token一致才能访问

transport.tls.enable = false	
	#是否启用tls,自某个版本后默认为true,需要显式的否定来关闭

webServer.addr = "0.0.0.0"		
	#网页看板地址(默认取服务器本地地址)
webServer.port = 7500			
	#网页看板端口
webServer.user = "admin"		
	#网页看板用户名
webServer.password = "paw"		
	#网页看板密码(此密码为明文存储,建议使用非常用密码)

退出编辑界面,在同目录下输入./frps -c ./frps.toml来启动程序。访问http://your_addr:7500查看网页看板是否成功启动,若启动则服务端已经配置完毕。

客户端配置frps

进入文件存放的目录,编写frpc.toml。

serverAddr = "x.x.x.x"   		
	#服务器地址
serverPort = 7000   			
	#服务器的监听端口,需要与服务端配置一致

auth.method = "token"			
	#设置验证方法为token
auth.token = "your_token"   	
	#token,与服务端设置的必须完全一致

transport.tls.enable = false	
	#是否启用tls,自某个版本后默认为true,需要显式的否定来关闭

#以下是创建隧道,可以创建多个隧道,系统默认会提供一个开放于:22用于ssh访问的隧道
[[proxies]]
name = "xxx"					
	#隧道名称,自定义,但不能重复
type = "tcp"					
	#隧道类型,可用tcp, udp, http, https, tcpmux, stcp, sudp, xtcp
localIP = "127.0.0.1"			
	#本地IP地址,如果要使用非本机IP可以自行修改
localPort = 9000				
	#本地端口:[本机]本机要使用的监听端口
remotePort = 6060				
	#远程端口:[服务器]要将本机端口映射成服务器的端口

保存文件并退出,在目录文件夹内右键选择在终端中打开,并输入./frpc -c ./frpc.toml来启动程序。你每创建了一个隧道,下方的提示文字就会多一行来提示你隧道xxx已创建成功。

配置启动程序(自启动)

如果每次都重新敲启动命令来启动未免也太麻烦了,在本例中,对于服务端,若未设置screen程序会在断开连接时自动停止;对于客户端,每次启动都需要保持一个命令行窗口打开,很容易误操作将其关闭。因此,将frp配置为服务会使程序方便很多。

服务端配置为Service

在服务器端,我们将frps注册为系统服务,这样就可以利用linux的systemctl来控制他的启动、关闭、设置开机自动启动了。首先在system下编写一个服务类文件。以下是官方文档提供的标准格式:

>> sudo vim /etc/systemd/system/frps.service

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml

[Install]
WantedBy = multi-user.target

需要特别注意frps的安装路径,因为我的目录文件夹也叫frps,而frps主程序没有后缀名,所以应该是./frps/frps,因为这个问题在后面的启动步骤卡了好久。全部配置完成后,就可以用以下命令来管理名为frp server(或你自定义的名字)服务了。常用的控制命令如下:

sudo systemctl start frps			
	#启动frps
sudo systemctl stop frps			
	#停用frps
sudo systemctl restart frps			
	#重启frps
sudo systemctl status frps			
	#查看frps状态
sudo systemctl enable frps			
	#设置frps开机自启

重启服务器,利用sudo systemctl status frps查看服务运行情况,若为active则服务端已经成功配置完毕。

客户端配置为服务

在Windows端注册服务需要用到第三方软件,我选用的是winsw(Windows Service Wrapper),首先前往github获取他的最新发行版:

https://github.com/winsw/winsw

在Release中选择WinSW-x64.exe并下载。将该文件复制到你的frpc目录下,并重命名一个你能记得住的有意义的名字,譬如:frpc_service.exe。随后,新建一个frpc_service.xml(注意:文件名要和之前改的exe完全一致)

<service>
	<id>frpc_service</id>									
		<!-- 服务ID,需要唯一 -->
	<name>frpc_service</name>								
		<!-- 服务名称,需要你能记住 -->
	<description>frpc内网穿透客户端服务</description>		
		<!-- 服务描述,写给你自己看的 -->
	<startmode>Automatic</startmode>						
		<!-- 启动模式若设为自动,会开机自启 -->
	<executable>frpc.exe</executable>						
		<!-- 执行文件 -->
	<arguments>-c frpc.toml</arguments>						
		<!-- 要使用的配置文件 -->
</service>

保存frpc_service.xml后,以管理员身份启动cmd,进入到该目录,运行:

frpc-service.exe install

看到出现提示:

Installing service 'frpc_service(frpc_service)'...
Service 'frpc_service(frpc_service)'was installed successfully.

说明已经在你的windows系统里成功注册了服务。重启电脑后,打开服务(或service.msc),找到你刚才注册的名称,若为运行中,则说明客户端配置完成。

总结

在正式开始使用之前,检查你的云服务器提供商、管理面板(如有)的防火墙策略,将上述设置的7000、7500、6060端口放行,如果你设置了更多的隧道,也要将他们映射的端口放行。

现在,如果完全按照以上文件配置,你的两台电脑/服务器上应该已经拥有了:

  1. 客户端设备:一个名为frpc的系统服务,他会在你的设备开机时启动,将你设备的9000端口映射到服务端的6060端口。该隧道通过名为your_token的token验证,不使用tls进行验证。你可以将你需要的服务(譬如MC服务器、文件系统等等)设置到9000端口上,通过服务器的6060端口远程访问。

  2. 服务端设备:一个名为frps的系统服务,他会在你的设备开机时启动,通过7000端口接收来自客户端的映射请求,并将客户端的9000端口映射到自己的6060端口,让你可以通过服务器的公网端口访问你的客户端服务(譬如MC服务器、文件系统等等)。

如果你设置了更多的隧道、且他们都成功启动,他们也将映射到各自指定的端口上(如无冲突)。

本文中关于在Windows端将frpc配置为系统服务参考了:

https://blog.csdn.net/qq_42058138/article/details/131550438