frp内网映射
下载相匹配FRP版本(本文以0.50为例)
https://github.com/fatedier/frp/releases
wget https://github.com/fatedier/frp/releases/download/v0.50.0/frp_0.50.0_linux_amd64.tar.gz
tar xzvf frp_0.50.0_linux_amd64.tar.gz
mv frp_0.50.0_linux_amd64 frp
上面命令包含直接通过GitHub下载后,解压后将目录重命名为 frp
服务器编辑frps.ini
打开:frps.ini
[common]
bind_port = 7000 //端口
vhost_http_port = 88 //端口
token = 123456 //连接密码
dashboard_user = admin //用户
dashboard_pwd = 123456 //密码
dashboard_port = 7500 //端口
启动frps
# 直接启动
./frps -c frps.ini
# 后台启动
./frps -c frps.ini>/dev/null 2>&1 &
# 或者在root目录下
# 直接启动
/root/frp/frps -c /root/frp/frps.ini
# 后台启动
nohup /root/frp/frps -c /root/frp/frps.ini >/dev/null 2>&1 &
设置 frps 开机自启动
sudo systemctl enable frps
安装客户端frp(根据自己需求下载相关版本)
客户端frpc.ini配置
打开:frpc.ini
[common]
server_addr = IP //外网IP
server_port = 7000 //连接服务器端口
token = 123456 //连接密码,与服务器相同
[ssh] //服务器任务名称,多条不要相同
type = tcp //协议
local_ip = 127.0.0.1 //本地要映射的IP
local_port = 3389 //本地端口
remote_port = 3390 //服务器输出端口
[ssh1]
type = tcp
local_ip = 127.0.0.1
local_port = 81
remote_port = 81
[web]
type = http
local_port = 80
custom_domains = a.com
[web1]
type = https
local_port = 80
custom_domains = b.com
如果想客户端界面,则添加以下命令
# frpc.ini 管理界面 //127.0.0.1 地址为仅限本地,0.0.0.0为不限。admin_addr = 127.0.0.1
admin_port = 7500
admin_user = admin
admin_pwd = admin123
完整代码如下:
[common]
server_addr = IP //外网IP
server_port = 7000 //连接服务器端口
token = 123456 //连接密码,与服务器相同
admin_port = 7500
admin_user = admin
admin_pwd = admin123
[ssh] //服务器任务名称,多条不要相同
type = tcp //协议
local_ip = 127.0.0.1 //本地要映射的IP
local_port = 3389 //本地端口
remote_port = 3390 //服务器输出端口
[ssh1]
type = tcp
local_ip = 127.0.0.1
local_port = 81
remote_port = 81

客户端端FRP启动(以Linux为例)
/root/frp/frpc -c /root/frp/frpc.ini
# 后台运行
nohup /root/frp/frpc -c /root/frp/frpc.ini >/dev/null 2>&1 &
# 使用 jobs 命令查看后台运行的程序
jobs
关闭运行
服务器端
killall -I frps
客户端:
killall -I frpc
通过自定义域名访问部署于内网的 Web 服务
有时需要在公有网络通过域名访问我们在本地环境搭建的 Web 服务,但是由于本地环境机器并没有公网 IP,无法将域名直接解析到本地的机器。
现在通过 FRP 就可以很容易实现这一功能,这里以 HTTP 服务为例:首先修改 FRP 服务端配置文件,通过 vhost_http_port 参数来设置 HTTP 访问端口,这里将 HTTP 访问端口设为 8080。
[web]
type = http
local_port = 80
custom_domains =a.com
这里通过 local_port 和 custom_domains 参数来设置本地机器上 Web 服务对应的端口和自定义的域名,这里我们分别设置端口为 80,对应域名为 a.com。
最后将 mike.hi-linux.com 的域名 A 记录解析到 FRP 服务器的公网 IP 上,现在便可以通过 http://mike.hi-linux.com:8080 这个 URL 访问到处于内网机器上对应的 Web 服务。
注:HTTPS 服务配置方法类似,只需将服务端的 vhost_http_port 新增一行或者替换为 vhost_https_port, type 设置为 https 即可。
通过密码保护你的 Web 服务
由于所有客户端共用一个 FRP 服务端的 HTTP 服务端口,任何知道你的域名和 URL 的人都能访问到你部署在内网的 Web 服务,但是在某些场景下需要确保只有限定的用户才能访问。
FRP 支持通过 HTTP Basic Auth 来保护你的 Web 服务,使用户需要通过用户名和密码才能访问到你的服务。需要实现此功能主要需要在 FRP 客户端的配置文件中添加用户名和密码的设置。
编辑客户端frpc.ini
[web]
type = http
local_port = 80
custom_domains = a.com
# 设置认证的用户名
http_user = abc
# 设置认证的密码
http_pwd = abc
这时访问 http://a.com:8080 这个 URL 时就需要输入配置的用户名和密码才能访问。
注:该功能目前仅限于 HTTP 类型的代理。
给 Web 服务增加自定义二级域名
在多人同时使用一个 FRP 服务端实现 Web 服务时,通过自定义二级域名的方式来使用会更加方便。
通过在 FRP 服务端的配置文件中配置 subdomain_host参数就可以启用该特性。之后在 FRP 客户端的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。
然后只需要将 *.{subdomain_host} 解析到 FRP 服务端所在服务器。之后用户可以通过 subdomain 自行指定自己的 Web 服务所需要使用的二级域名,并通过 {subdomain}.{subdomain_host} 来访问自己的 Web 服务。
首先我们在 FRP 服务端配置 subdomain_host 参数:
# 编辑服务端frps.ini
[common]
subdomain_host = a.com
其次在 FRP 客户端配置文件配置 subdomain 参数:
$ vim frpc.ini
[web]
type = http
local_port = 80
subdomain = test
然后将泛域名 *.a.com 解析到 FRP 服务端所在服务器的公网 IP 地址。FRP 服务端 和 FRP 客户端都启动成功后,通过 test.a.com 就可以访问到内网的 Web 服务。
注:
1.同一个 HTTP 或 HTTPS 类型的代理中 custom_domains 和 subdomain 可以同时配置。
2.需要注意的是如果 FPR 服务端配置了 subdomain_host,则 custom_domains 中不能是属于 subdomain_host 的子域名或者泛域名。
修改 Host Header
通常情况下 FRP 不会修改转发的任何数据。但有一些后端服务会根据 HTTP 请求 header 中的 host 字段来展现不同的网站,例如 Nginx 的虚拟主机服务,启用 host-header 的修改功能可以动态修改 HTTP 请求中的 host 字段。
实现此功能只需要在 FRP 客户端配置文件中定义 host_header_rewrite 参数。
$ vim frpc.ini
[web]
type = http
local_port = 80
custom_domains = test.a.com
host_header_rewrite = dev.a.com
原来 HTTP 请求中的 host 字段 test.a.com 转发到后端服务时会被替换为 dev.a.com。
注:该功能仅限于 HTTP 类型的代理。
URL 路由
FRP 支持根据请求的 URL 路径路由转发到不同的后端服务。要实现这个功能可通过 FRP 客户端配置文件中的 locations 字段来指定。
$ vim frpc.ini
[web1]
type = http
local_port = 80
custom_domains = web.a.com
locations = /
[web2]
type = http
local_port = 81
custom_domains = web.a.com
locations = /news,/about
按照上述的示例配置后,web.a.com 这个域名下所有以 /news 以及 /about 作为前缀的 URL请求都会被转发到后端 web2 所在的后端服务,其余的请求会被转发到 web1 所在的后端服务。
通过 UDP 访问内网机器
DNS 查询请求通常使用 UDP 协议,FRP 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。这里以转发到 Google 的 DNS 查询服务器 8.8.8.8 的 UDP 端口为例。
首先修改 FRP 客户端配置文件,并增加如下内容:
$ vim frpc.ini
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6001
注:要转发到内网 DNS 服务器只需把 local_ip 改成对应 IP 即可。
其次重新启动 FRP 客户端,
最后通过 dig 命令测试 UDP 包转发是否成功,预期会返回 www.google.com 域名的解析结果:
$ dig @4.3.2.1 -p 6001 www.google.com
...
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 79 IN A 69.63.184.30
...
给 FRP 服务端增加一个 Dashboard
通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示,要使用这个功能首先需要在 FRP 服务端配置文件中指定 Dashboard 服务使用的端口:
$ vim frps.ini
[common]
# 指定 Dashboard 的监听的 IP 地址
dashboard_addr = 0.0.0.0
# 指定 Dashboard 的监听的端口
dashboard_port = 7500
# 指定访问 Dashboard 的用户名
dashboard_user = admin
# 指定访问 Dashboard 的端口
dashboard_pwd = admin
其次重新启动 FRP 服务端:
最后通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
给 FRP 服务端加上身份验证
默认情况下只要知道 FRP 服务端开放的端口,任意 FRP 客户端都可以随意在服务端上注册端口映射,这样对于在公网上的 FRP 服务来说显然不太安全。FRP 提供了身份验证机制来提高 FRP 服务端的安全性。要启用这一特性也很简单,只需在 FRP 服务端和 FRP 客户端的 common 配置中启用 privilege_token 参数就行。
[common]
privilege_token = 12345678
启用这一特性后,只有 FRP 服务端和 FRP 客户端的 common 配置中的 privilege_token 参数一致身份验证才会通过,FRP 客户端才能成功在 FRP 服务端注册端口映射。否则就会注册失败,出现类似下面的错误:
2024/01/25 17:29:27 [I] [proxy_manager.go:284] proxy removed: []
2024/01/25 17:29:27 [I] [proxy_manager.go:294] proxy added: [ssh web dns unix_domain_socket]
2024/01/25 17:29:27 [I] [proxy_manager.go:317] visitor removed: []
2024/01/25 17:29:27 [I] [proxy_manager.go:326] visitor added: []
2024/01/25 17:29:27 [E] [control.go:230] authorization failed
2024/01/25 17:29:27 [W] [control.go:109] login to server failed: authorization failed
authorization failed
注:需要注意的是 FRP 客户端所在机器和 FRP 服务端所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用。这个超时时间可以在配置文件中通过 authentication_timeout 这个参数来修改,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 FRP 服务端将不对身份验证报文的时间戳进行超时校验。
FRP 客户端热加载配置文件
当修改了 FRP 客户端中的配置文件,从 0.15 版本开始可以通过 frpc reload 命令来动态加载配置文件,通常会在 10 秒内完成代理的更新。
启用此功能需要在 FRP 客户端配置文件中启用 admin 端口,用于提供 API 服务。配置如下:
$ vim frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400
重启 FRP 客户端,以后就可通过热加载方式进行 FRP 客户端配置变更了,等待一段时间后客户端会根据新的配置文件创建、更新、删除代理。
注:需要注意的是 [common] 中的参数除了 start 外目前无法被修改。
启用 admin_addr 后,还可以通过 frpc status -c ./frpc.ini 命令在 FRP 客户端很方便的查看当前代理状态信息。
给 FRP 服务端增加端口白名单
为了防止 FRP 端口被滥用,FRP 提供了指定允许哪些端口被分配的功能。可通过 FRP 服务端的配置文件中 privilege_allow_ports 参数来指定:
$ vim frps.ini
[common]
privilege_allow_ports = 2000-3000,3001,3003,4000-5000
privilege_allow_ports 可以配置允许使用的某个指定端口或者是一个范围内的所有端口,以 , 分隔,指定的范围以 – 分隔。
当使用不允许的端口注册时,就会注册失败。出现类似以下错误:
$ ./frpc status -c ./frpc.ini
Proxy Status...
TCP
Name Status LocalAddr Plugin RemoteAddr Error
ssh start error 127.0.0.1:22 4.3.2.1:60000 port not allowed
unix_domain_socket start error unix_domain_socket 4.3.2.1:60002 port not allowed
启用 TCP 多路复用
从 v0.10.0 版本开始,客户端和服务器端之间的连接支持多路复用,不再需要为每一个用户请求创建一个连接,使连接建立的延迟降低,并且避免了大量文件描述符的占用,使 FRP 可以承载更高的并发数。
该功能默认启用,如需关闭可以在 FRP 服务端配置文件和 FRP 客户端配置文件中配置,该配置项在服务端和客户端必须一致:
# frps.ini 和 frpc.ini 中
[common]
tcp_mux = false
FRP 底层通信启用 KCP 协议
FRP 从 v0.12.0 版本开始,底层通信协议支持选择 KCP 协议,在弱网络环境下传输效率会提升明显,但是会有一些额外的流量消耗。
要开启 KCP 协议支持,首先要在 FRP 服务端配置文件中启用 KCP 协议支持:
$ vim frps.ini
[common]
bind_port = 7000
# 指定一个 UDP 端口用于接收客户端请求 KCP 绑定的是 UDP 端口,可以和 bind_port 一样
kcp_bind_port = 7000
其次是在 FRP 客户端配置文件指定需要使用的协议类型,目前只支持 TCP 和 KCP。其它代理配置不需要变更:
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
# server_port 指定为 FRP 服务端里 kcp_bind_port 指定的端口
server_port = 7000
# 指定需要使用的协议类型,默认类型为 TCP
protocol = kcp
给 FRP 服务端配置连接池
默认情况下,当用户请求建立连接后,FRP 服务端才会请求 FRP 客户端主动与后端服务建立一个连接。
当为指定的 FRP 服务端启用连接池功能后,FRP 会预先和后端服务建立起指定数量的连接,每次接收到用户请求后,会从连接池中取出一个连接和用户连接关联起来,避免了等待与后端服务建立连接以及 FRP 客户端 和 FRP 服务端之间传递控制信息的时间。
首先需要在 FRP 服务端配置文件中设置每个代理可以创建的连接池上限,避免大量资源占用,客户端设置超过此配置后会被调整到当前值:
$ vim frps.ini
[common]
max_pool_count = 5
其次在 FRP 客户端配置文件中为客户端启用连接池,指定预创建连接的数量:
$ vim frpc.ini
[common]
pool_count = 1
加密与压缩
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,可通过设置 use_encryption = true,将 FRP 客户端 与 FRP 服务端之间的通信内容加密传输,将会有效防止流量被拦截。
如果传输的报文长度较长,通过设置 use_compression = true 对传输内容进行压缩,可以有效减小 FRP 客户端 与 FRP 服务端之间的网络流量,来加快流量转发速度,但是会额外消耗一些 CPU 资源。
这两个功能默认是不开启的,需要在 FRP 客户端配置文件中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用的是 snappy。
$ vim frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
通过 FRP 客户端代理其它内网机器访问外网
FRP 客户端内置了 http_proxy 和 socks5 插件,通过这两个插件可以使其它内网机器通过 FPR 客户端的的网络访问互联网。
要启用此功能,首先需要在 FRP 客户端配置文件中启用相关插件,这里以 http_proxy 插件为例:
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy
其次将需要通过这个代理访问外网的内部机器的代理地址设置为 4.3.2.1:6000,这样就可以通过 FRP 客户端机器的网络访问互联网了。
注:
1.http_proxy 插件也支持认证机制,如果需要启用认证可通过配置参数 plugin_http_user和 plugin_http_passwd 启用。
2.如需启用 Socks5 代理,只需将 plugin 的值更换为 socks5 即可。
通过代理连接 FRP 服务端
在只能通过代理访问外网的环境内,FRP 客户端支持通过 HTTP_PROXY 参数来配置代理和 FRP 服务端进行通信。要使用此功能可以通过设置系统环境变量 HTTP_PROXY 或者通过在 FRP 客户端的配置文件中设置 http_proxy 参数来使用此功能。
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
protocol = tcp
http_proxy = http://user:pwd@4.3.2.2:8080
注:仅在 protocol = tcp 时生效,暂时不支持 kcp 协议。
安全地暴露内网服务
对于一些比较敏感的服务如果直接暴露于公网上将会存在安全隐患,FRP 也提供了一种安全的转发方式 STCP。使用 STCP (secret tcp) 类型的代理可以避免让任何人都能访问到穿透到公网的内网服务,要使用 STCP 模式访问者需要单独运行另外一个 FRP 客户端。
下面就以创建一个只有自己能访问到的 SSH 服务代理为例,FRP 服务端和其它的部署步骤相同,主要区别是在 FRP 客户端上。
首先配置 FRP 客户端,和常规 TCP 转发不同的是这里不需要指定远程端口。
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
其次在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[secret_ssh_visitor]
type = stcp
# STCP 的访问者
role = visitor
# 要访问的 STCP 代理的名字,和前面定义的相同。
server_name = secret_ssh
# 和前面定义的要一致
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6005
最后在本机启动一个 FRP 客户端,这样就可以通过本机 6005 端口对内网机器 SSH 服务进行访问,假设用户名为 mike:
$ ./frpc -c ./frpc.ini
2024/01/26 15:03:24 [I] [proxy_manager.go:284] proxy removed: []
2024/01/26 15:03:24 [I] [proxy_manager.go:294] proxy added: []
2024/01/26 15:03:24 [I] [proxy_manager.go:317] visitor removed: []
2024/01/26 15:03:24 [I] [proxy_manager.go:326] visitor added: [secret_ssh_visitor]
2024/01/26 15:03:24 [I] [control.go:240] [60d2af2f68196537] login to server success, get run id [60d2af2f68196537], server udp port [0]
2024/01/26 15:03:24 [I] [proxy_manager.go:235] [60d2af2f68196537] try to start visitor [secret_ssh_visitor]
2024/01/26 15:03:24 [I] [proxy_manager.go:243] [secret_ssh_visitor] start visitor success
$ ssh -oPort=6005 mike@127.0.0.1
点对点内网穿透
在传输大量数据时如果都经过服务器中转的话,这样会对服务器端带宽压力比较大。FRP 提供了一种新的代理类型 XTCP 来解决这个问题,XTCP 模式下可以在传输大量数据时让流量不经过服务器中转。
使用方式同 STCP 类似,需要在传输数据的两端都部署上 FRP 客户端上用于建立直接的连接。
首先在 FRP 服务端配置上增加一个 UDP 端口用于支持该类型的客户端:
$ vim frps.ini
bind_udp_port = 7001
其次配置 FRP 客户端,和常规 TCP 转发不同的是这里不需要指定远程端口。
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[p2p_ssh]
type = xtcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
然后在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[p2p_ssh_visitor]
type = xtcp
# XTCP 的访问者
role = visitor
# 要访问的 XTCP 代理的名字
server_name = p2p_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6006
最后在本机启动一个 FRP 客户端,这样就可以通过本机 6006 端口对内网机器 SSH 服务进行访问,假设用户名为 mike:
$ ./frpc -c ./frpc.ini
2024/01/26 16:01:52 [I] [proxy_manager.go:326] visitor added: [p2p_ssh_visitor secret_ssh_visitor]
2024/01/26 16:01:52 [I] [control.go:240] [7c7e06878e11cc3c] login to server success, get run id [7c7e06878e11cc3c], server udp port [7001]
2024/01/26 16:01:52 [I] [proxy_manager.go:235] [7c7e06878e11cc3c] try to start visitor [p2p_ssh_visitor]
2024/01/26 16:01:52 [I] [proxy_manager.go:243] [p2p_ssh_visitor] start visitor success
2024/01/26 16:01:52 [I] [proxy_manager.go:235] [7c7e06878e11cc3c] try to start visitor [secret_ssh_visitor]
2024/01/26 16:01:52 [I] [proxy_manager.go:243] [secret_ssh_visitor] start visitor success
$ ssh -oPort=6006 mike@127.0.0.1
注:目前 XTCP 模式还处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 STCP 的方式。
下载一键部署脚本
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
安装 FRP 服务端
这个一键部署脚本比较好用,为了提高国内用户下载安装包速度还提供了阿里云节点的安装源。整个脚本使用起来也比较简单,对一些常用的 FRP 服务端配置参数都做了交互式选择让用户可以方便的根据自己实际情况进行选择。脚本比较贴心的一点是对默认的公网地址进行了检测,省去了手动输入的麻烦。
配置 FRP 服务端
./install-frps.sh config
更新 FRP 服务端
./install-frps.sh update
卸载 FRP 服务端
./install-frps.sh uninstall
FRP 服务端日常管理
FRP 服务端安装完成后,一键部署脚本还提供了一个日常管理 FRP 服务端的管理脚本来进行日常的启动、重启、停止等操作,非常的方便。
Usage: /etc/init.d/frps {start|stop|restart|status|config|version}
服务端 frps 相关命令
#显示版本号
./frps -v
#显示帮助说明
./frps -h
#启动 frps ,关闭SSH窗口即停止运行
./frps -c ./frps.ini
#frps服务端后台运行
nohup ./frps -c ./frps.ini >/dev/null 2>&1 &
#查看服务端 frps.ini 配置文件
cat frps.ini
#frps服务端进程状态
ps -ef |grep frps|grep -v grep
#frps服务端-停止
ps -ef |grep frps|grep -v grep |awk '{print $2}'|xargs kill -9
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
客户端 frpc 相关命令
./frpc -v #显示版本号
./frpc -h #显示帮助说明
./frpc -c ./frpc.ini #启动 frpc ,关闭SSH窗口即停止运行
nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 & #frpc客户端后台运行
cat frpc.ini #查看客户端 frpc.ini 配置文件
ps -ef |grep frpc|grep -v grep #frpc客户端进程状态
ps -ef |grep frpc|grep -v grep |awk '{print $2}'|xargs kill -9 #frpc客户端-停止
客户端后台运行及开机自启
frpc运行时始终有一个命令行窗口运行在前台,影响美观,我们可以使用一个批处理文件来将其运行在后台,而且可以双击执行,每次打开frpc不用再自己输命令了。
在任何一个目录下新建一个文本文件并将其重命名为“frpc.bat”,编辑,粘贴如下内容并保存。
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:frp
frpc -c frpc.ini
exit
设置服务自启动
在 Linux 系统下,使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。
以下是具体的操作步骤:
1、安装 systemd
如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd
# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd
2、创建 frps.service 文件
使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。
$ sudo vim /etc/systemd/system/frps.service
写入内容
[Service]
Type=simple
ExecStart=/home/ubuntu/frp_0.59.0_linux_amd64/frps -c /home/ubuntu/frp_0.59.0_linux_amd64/frps.toml
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit
[Install]
WantedBy=multi-user.target
3、使用 systemd 命令管理 frps 服务
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
4、设置 frps 开机自启动
sudo systemctl enable frps
确认 frp 服务端是否正在运行
ps aux | grep frps
![]()
使用 netstat 或 ss 命令检查端口监听状态。
sudo netstat -tulnp | grep 7000 #7000改为自己的端口
sudo ss -tulnp | grep 7000 #7000改为自己的端口


