frp 内网穿透
实现内网穿透的工具有很多,比如ngrok
,frp
等,这里介绍一下使用frp
实现内网穿透。
注意 文档要看英文文档,英文文档才比较全
下载
在frp releases页面下载适合您的操作系统和体系结构的最新程序。
将frps
二进制文件和服务器配置文件放置在具有公共 IP
地址的服务器 A
上。 将frpc
二进制文件和客户端配置文件放在服务器 B
上,该服务器位于无法从公共互联网直接访问的 LAN
上。
一些防病毒软件错误地将 frpc
标记为恶意软件并将其删除。这是因为 frp
是一种能够创建反向代理的网络工具。防病毒软件有时会标记反向代理,因为它们能够绕过防火墙端口限制。如果您使用防病毒软件,则可能需要在防病毒设置中将 frpc
列入白名单/排除,以避免意外隔离/删除。有关更多详细信息,请参阅frp issues 3637。
通过arch
命令查看系统架构
$ arch
x86_64
选择对应的发行版frp_0.53.0_linux_amd64.tar.gz
下载。
下载后使用scp
上传,其他上传方案也是可以的。
$ scp ./frps.toml tdy-aliyun:/root/matiastang/frp/
frps.toml 100% 16 0.4KB/s 00:00
$ scp ./frps tdy-aliyun:/root/matiastang/frp/
frps
frps
安装
在具有公网 IP
的机器上部署 frps
服务端。
安装systemd
在 Linux
系统下,使用 systemd
可以方便地控制 frps
服务端的启动、停止、配置后台运行以及开机自启动。 MacOS
可以使用brew services
。比如frpc
部署在MacOS
上时,可以用其进行管理。
$ apt install systemd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
libjs-highlight.js libmariadb3 mariadb-common
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
libnss-systemd libpam-systemd libsystemd0 systemd-sysv
Suggested packages:
systemd-container libtss2-rc0
The following packages will be upgraded:
libnss-systemd libpam-systemd libsystemd0 systemd systemd-sysv
5 upgraded, 0 newly installed, 0 to remove and 78 not upgraded.
Need to get 5,245 kB of archives.
After this operation, 4,096 B disk space will be freed.
Do you want to continue? [Y/n] y
Get:1 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-updates/main amd64 systemd-sysv amd64 249.11-0ubuntu3.11 [10.5 kB]
Get:2 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-updates/main amd64 libnss-systemd amd64 249.11-0ubuntu3.11 [133 kB]
Get:3 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-updates/main amd64 libpam-systemd amd64 249.11-0ubuntu3.11 [203 kB]
Get:4 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-updates/main amd64 systemd amd64 249.11-0ubuntu3.11 [4,581 kB]
Get:5 http://mirrors.cloud.aliyuncs.com/ubuntu jammy-updates/main amd64 libsystemd0 amd64 249.11-0ubuntu3.11 [318 kB]
Fetched 5,245 kB in 0s (14.1 MB/s)
(Reading database ... 104078 files and directories currently installed.)
Preparing to unpack .../systemd-sysv_249.11-0ubuntu3.11_amd64.deb ...
Unpacking systemd-sysv (249.11-0ubuntu3.11) over (249.11-0ubuntu3.9) ...
Preparing to unpack .../libnss-systemd_249.11-0ubuntu3.11_amd64.deb ...
Unpacking libnss-systemd:amd64 (249.11-0ubuntu3.11) over (249.11-0ubuntu3.9) ...
Preparing to unpack .../libpam-systemd_249.11-0ubuntu3.11_amd64.deb ...
Unpacking libpam-systemd:amd64 (249.11-0ubuntu3.11) over (249.11-0ubuntu3.9) ...
Preparing to unpack .../systemd_249.11-0ubuntu3.11_amd64.deb ...
Unpacking systemd (249.11-0ubuntu3.11) over (249.11-0ubuntu3.9) ...
Preparing to unpack .../libsystemd0_249.11-0ubuntu3.11_amd64.deb ...
Unpacking libsystemd0:amd64 (249.11-0ubuntu3.11) over (249.11-0ubuntu3.9) ...
Setting up libsystemd0:amd64 (249.11-0ubuntu3.11) ...
Setting up systemd (249.11-0ubuntu3.11) ...
Setting up systemd-sysv (249.11-0ubuntu3.11) ...
Setting up libnss-systemd:amd64 (249.11-0ubuntu3.11) ...
Setting up libpam-systemd:amd64 (249.11-0ubuntu3.11) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.5) ...
Scanning processes...
Scanning candidates...
Scanning linux images...
Running kernel seems to be up-to-date.
Restarting services...
/etc/needrestart/restart.d/systemd-manager
systemctl restart multipathd.service nginx.service packagekit.service polkit.service redis-server.service rsyslog.service ssh.service tuned.service udisks2.service
Service restarts being deferred:
systemctl restart ModemManager.service
/etc/needrestart/restart.d/dbus.service
systemctl restart getty@tty1.service
systemctl restart networkd-dispatcher.service
systemctl restart systemd-logind.service
systemctl restart unattended-upgrades.service
systemctl restart user@0.service
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
创建 frps.service
文件
使用文本编辑器 (如 vim
) 在 /etc/systemd/system
目录下创建一个 frps.service
文件,用于配置 frps
服务。
$ 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
# 将/path/to替换为您的frps安装路径,在frps的安装目录下使用pwd查看路径。如上面我上传到的地址是`/root/matiastang/frp`所以如下配置
ExecStart = /root/matiastang/frp/frps -c /root/matiastang/frp/frps.toml
[Install]
WantedBy = multi-user.target
使用 systemd
命令管理 frps
服务
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
设置 frps 开机自启动
sudo systemctl enable frps
提示 可以通过服务端的nginx
代理用于内网穿透的端口。应该就不用开放其他特殊的端口了。 示例:
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name api.dytech.cn;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /usr/cert/api.tdytech.cn_bundle.pem;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /usr/cert/api.tdytech.cn.key;
#缓存SSL握手产生的参数和加密密钥的时长
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#加密套件优先选择服务器的加密套件
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#HTTP 自动跳转 HTTPS 的安全配置
server {
listen 80;
#请填写绑定证书的域名
server_name api.tdytech.cn;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
直接将80
和443
的代理到本机的8080
端口,穿透到内网。
注意 这里代理的是/
,如果是某个前缀/web/
的web
服务,打包的资源就需要注意,也需要添加前缀。如果是后端服务就不需要这么处理。
frpc安装
MacOS安装frpc
下载frp_0.53.0_darwin_amd64.tar.gz
,并修改frpc.toml
文件。
# 修改为服务器的公网地址
serverAddr = "127.0.0.1"
serverPort = 7000
[[proxies]]
name = "web"
type = "http"
localPort = 3000
remotePort = 8080
# 修改为公网域名
customDomains = ["www.example.cn"]
frpc
操作脚本
#!/bin/bash
###
# @Author: matiastang
# @Date: 2023-12-21 16:43:16
# @LastEditors: matiastang
# @LastEditTime: 2023-12-21 16:50:35
# @FilePath: /HulkPress/Users/matias/matias/MT/MTGithub/tool/frpc/frpc.sh
# @Description: MacOS 脚本启动停止frpc服务
###
FRPC_HOME="$HOME/matias/MT/MTGithub/tool/frpc"
client="$FRPC_HOME/frpc"
toml="$FRPC_HOME/frpc.toml"
log="$FRPC_HOME/log"
if [ "$1" = "start" ];then
nohup $client -c $toml > "$log/nohup_frpc.log" 2>&1 &
echo "frpc start success"
elif [ "$1" = "status" ];then
ps aux | grep frpc | grep -v grep | grep -v $1
echo "frpc status success"
elif [ "$1" = "reload" ];then
echo "frpc" `$client reload -c $toml`
elif [ "$1" = "restart" ];then
ps aux | grep frpc | grep -v grep | grep -v $1 | awk '{print $2}' | xargs kill -9
rm -rf "$log/frpc.log"
rm -rf "$log/nohup_frpc.log"
nohup $client -c $toml > "$log/nohup_frpc.log" 2>&1 &
echo "frpc restart success"
elif [ "$1" = "stop" ];then
ps aux | grep frpc | grep -v grep | grep -v $1 | awk '{print $2}' | xargs kill -9
rm -rf "$log/frpc.log"
rm -rf "$log/nohup_frpc.log"
echo "frpc stop success"
else
other_commands="$client $@"
$other_commands
fi
切换到frpc.sh
所在目录,运行测试一下
$ ./frpc.sh start
zsh: permission denied: ./frpc.sh
修改文件的权限
$ chmod 755 ./frpc.sh
$ ll
total 29568
-rwxr-xr-x@ 1 matias staff 14M 12 14 21:00 frpc
-rwxr-xr-x 1 matias staff 1.2K 12 21 16:50 frpc.sh
-rw-r--r--@ 1 matias staff 235B 12 21 16:27 frpc.toml
再次运行
$ ./frpc.sh start
弹窗提示:无法打开“frpc”,因为无法验证开发者。
重要 这是被系统拦截了,在系统的安全与隐私
的通用
中,允许运行。
再次运行
$ ./frpc.sh start
frpc start success
直接运行
$ nohup ./frpc -c frpc.toml > ./nohup_frpc.log 2>&1 &
[1] 28462
(base) ⚙ ~/matias/MT/MTGithub/tool/frpc
[1] + 28462 exit 1 nohup ./frpc -c frpc.toml > ./nohup_frpc.log 2>&1
$ cat nohup_frpc.log
2023/12/21 17:03:23 [I] [root.go:141] start frpc service for config file [frpc.toml]
2023/12/21 17:03:23 [I] [service.go:288] try to connect to server...
2023/12/21 17:03:33 [W] [service.go:291] connect to server error: dial tcp 8.134.116.20:7000: i/o timeout
2023/12/21 17:03:33 [I] [root.go:159] frpc service for config file [frpc.toml] stopped
login to the server failed: dial tcp 8.134.116.20:7000: i/o timeout. With loginFailExit enabled, no additional retries will be attempted
链接超时了,所以要先启动frps
且在安全组里开放7000
和8080
端口后再试。
切到服务器启动frps
$ systemctl start frps
安全组开放7000
和8080
端口后再试
$ nohup ./frpc -c frpc.toml > ./nohup_frpc.log 2>&1 &
[1] 29059
$ nohup ./frpc -c frpc.toml > ./nohup_frpc.log 2>&1 &
[1] 30034
kill
掉frpc
$ kill -9 29059
[1] + 29059 killed nohup ./frpc -c frpc.toml > ./nohup_frpc.log 2>&1
访问http://*.*.*.*:8080/
The page you requested was not found.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
The server is powered by frp.
Faithfully yours, frp.
更新customDomains
为绑定的域名,这里必须要一样,开始写错了,没访问成功。
再次运行
$ nohup ./frpc -c frpc.toml > ./nohup_frpc.log 2>&1 &
[1] 34950
再次访问http://*.*.*.*:8080/
,成功了。
添加软链到系统环境变量
sudo ln -s $HOME/matias/MT/MTGithub/tool/frpc/frpc.sh /usr/local/bin/frpc
sudo ln -s /Users/matias/matias/MT/MTGithub/tool/frpc/frpc.sh /usr/local/bin/frpc
which frpc
/usr/local/bin/frpc
# 启动frpc服务
$ frpc start
# 查看frpc启动状态
$ frpc status
# 重启frpc服务
$ frpc restart
# 停止frpc服务
$ frpc stop
添加认证方式,需要在frps.toml
和frpc.toml
中都配置,且配置一样的token
auth.method = "token"
auth.token = "password"
配置frp服务端仪表盘
frps.toml
添加如下配置。
$ cat frps.toml
# 服务端监听端口
bindPort = 7000
# http代理监听端口
vhostHTTPPort = 8080
# 服务端仪表盘配置
# 端口
webServer.port = 7500
# 地址
webServer.addr = "0.0.0.0"
# dashboard's username and password are both optional
# 用户名
webServer.user = "admin"
# 密码
webServer.password = "admin001"
重启frp
# 重启frp
sudo systemctl restart frps
访问http://[serverAddr]:7500
即可查看仪表盘。
配置证书 在frps.toml
文件中添加如下配置
# 服务端tls证书配置
# webServer.tls.certFile = "/usr/cert/[***].pem"
# webServer.tls.keyFile = "/usr/cert/[***].key"
webServer.tls.certFile = "server.crt"
webServer.tls.keyFile = "server.key"
https
访问
访问https://[serverAddr]:7500
即可查看仪表盘。
配置frp客户端仪表盘
在frpc.toml
中添加相关代码
# 客户端仪表盘
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin001"
访问http://127.0.0.1:7400
并没有响应。
$ lsof -i :7400
发现端口7400
没有被占用,表面服务没启动成功。所以访问不了。
排查了一圈发现,原理是webServer
相关配置写的位置不对。我放在了文件的最下面。中间有一些[[proxies]]
。这样的话就没启动服务,需要吧webServer
提到顶部和serverAddr
一级的位置!应该是.toml
文件的不同位置解析出来的结果不一样,如果换成.json
应该就不容易出错。
重新配置之后能http://127.0.0.1:7400
正常访问了。 本地服务启动成功后,日志文件中有个admin server listen on 127.0.0.1:7400
的提示。
$ cat nohup_frpc.log
2023/12/22 16:18:03 [I] [root.go:141] start frpc service for config file [frpc.toml]
2023/12/22 16:18:03 [I] [service.go:288] try to connect to server...
2023/12/22 16:18:03 [I] [service.go:279] [3e9cb769fb0b986e] login to server success, get run id [3e9cb769fb0b986e]
2023/12/22 16:18:03 [I] [proxy_manager.go:173] [3e9cb769fb0b986e] proxy added: [web_http web_https]
2023/12/22 16:18:03 [I] [service.go:177] admin server listen on 127.0.0.1:7400
2023/12/22 16:18:03 [I] [control.go:169] [3e9cb769fb0b986e] [web_https] start proxy success
2023/12/22 16:18:03 [I] [control.go:169] [3e9cb769fb0b986e] [web_http] start proxy success
2023/12/22 16:18:17 [I] [admin_api.go:170] Http request [/api/status]
2023/12/22 16:18:17 [I] [admin_api.go:172] Http response [/api/status]
2023/12/22 16:18:23 [I] [admin_api.go:203] Http get request [/api/config]
2023/12/22 16:18:23 [I] [admin_api.go:205] Http get response [/api/config], code [200]
2023/12/22 16:18:25 [I] [admin_api.go:170] Http request [/api/status]
2023/12/22 16:18:25 [I] [admin_api.go:172] Http response [/api/status]
2023/12/22 16:18:26 [I] [admin_api.go:203] Http get request [/api/config]
2023/12/22 16:18:26 [I] [admin_api.go:205] Http get response [/api/config], code [200]
最终配置
frps.toml
配置
开放了两个端口:8080
用于监听http
代理,8443
用于监听https
代理。 配置了frps
监控服务。
$ cat frps.toml
# 服务端监听端口
bindPort = 7000
# http代理监听端口
vhostHTTPPort = 8080
# https代理监听端口
vhostHTTPSPort = 8443
# 服务端仪表盘配置
# 端口
webServer.port = 7500
# 地址(这里需要注意,需要绑定到所有网络上,外网访问)
webServer.addr = "0.0.0.0"
# dashboard's username and password are both optional
# 用户名
webServer.user = "admin"
# 密码
webServer.password = "admin001"
# 证书配置
webServer.tls.certFile = "/usr/cert/***.pem"
webServer.tls.keyFile = "/usr/cert/***.key"
frpc.toml
配置
serverAddr = "*.*.*.*"
serverPort = 7000
# 客户端仪表盘
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin001"
[[proxies]]
name = "web_http"
type = "http"
localPort = 3000
remotePort = 8080
customDomains = ["域名"]
[[proxies]]
name = "web_https"
type = "https"
remotePort = 8443
customDomains = ["域名"]
[proxies.plugin]
type = "https2http"
# 本地应用端口
localAddr = "127.0.0.1:3000"
# HTTPS 证书相关的配置,修改证书文件路径(证书要是customDomains中配置域名的证书)
crtPath = "/Users/matias/matias/matiasResources/certificates/***.pem"
keyPath = "/Users/matias/matias/matiasResources/certificates/***.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
.toml参数说明
# 必须包含 IPv6 的文字地址或主机名
# 在方括号中,如"[::1]:80"、"[ipv6-host]:http"或"[ipv6-host%zone]:80"
# 对于单个"bind_addr"字段,不需要方括号,如"bind_addr = ::"。
bindAddr = "0.0.0.0"
bindPort = 7000
# 用于 kcp 协议的 udp 端口,可以与 'bind_port' 相同。
# 如果未设置,kcp 在 frps 中被禁用。
kcpBindPort = 7000
# 用于 quic 协议的 udp 端口。
# 如果没有设置,quic 在 frps 中被禁用。
# quicBindPort = 7002
# 指定代理监听哪个地址,默认值与bind_addr相同
# proxy_bind_addr = "127.0.0.1"
# quic协议选项
# transport.quic.keepalivePeriod = 10
# transport.quic.maxIdleTimeout = 30
# transport.quic.maxIncomingStreams = 100000
# 心跳配置,不建议修改默认值
# heartbeat_timeout 默认值为 90。设置负值即可禁用。
# transport.heartbeatTimeout = 90
# 每个代理中的池计数将不超过 maxPoolCount。
transport.maxPoolCount = 5
# 如果使用tcp流复用,默认为true
# transport.tcpMux = true
# 指定 tcp mux 的保持活动间隔。
# 仅当 tcpMux 为 true 时才有效。
# transport.tcpMuxKeepaliveInterval = 60
# tcpKeepalive 指定 frpc 和 frps 之间活动网络连接的 keep-alive 探测之间的时间间隔。
# 如果为负,则禁用保持活动探测。
# transport.tcpKeepalive = 7200
# Transport.tls.force 指定是否只接受 TLS 加密的连接。 默认情况下,该值为 false。
tls.force = false
# transport.tls.certFile = "server.crt"
# transport.tls.keyFile = "server.key"
# transport.tls.trustedCaFile = "ca.crt"
# 如果要支持虚拟主机,必须设置监听的http端口(可选)
# 注意:http端口和https端口可以与bind_port相同
vhostHTTPPort = 80
vhostHTTPSPort = 443
# vhost http服务器的响应头超时(秒),默认为60秒
# vhostHTTPTimeout = 60
# tcpmuxHTTPConnectPort 指定服务器监听 TCP 的端口
# HTTP CONNECT 请求。 如果值为0,服务器不会复用TCP
# 单个端口上的请求。 如果不是 - 它将监听这个值
# HTTP CONNECT 请求。 默认情况下,该值为 0。
# tcpmuxHTTPConnectPort = 1337
# 如果 tcpmux_passthrough 为 true,frps 不会对流量进行任何更新。
# tcpmuxPassthrough = false
# 配置Web服务器以启用frps的仪表板。
# 仅当设置了 webServer.port 时,仪表板才可用。
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
# webServer.tls.certFile = "server.crt"
# webServer.tls.keyFile = "server.key"
# dashboard assets directory(only for debug mode)
# webServer.assetsDir = "./static"
# 在仪表板监听器中启用 golang pprof 处理程序。
# 必须首先设置仪表板端口
# webServer.pprofEnable = false
#enablePrometheus 将在 /metrics api 中导出 webServer 上的 prometheus 指标。
# enablePrometheus = true
# 控制台或真实日志文件路径,如 ./frps.log
log.to = "./frps.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# 当 log.to 为控制台时禁用日志颜色,默认为 false
log.disablePrintColor = false
#DetailedErrorsToClient 定义是否将特定错误(带有调试信息)发送到 frpc。 默认情况下,该值为 true。
detailedErrorsToClient = true
# auth.method 指定使用什么身份验证方法对 frpc 和 frps 进行身份验证。
# 如果指定了"token" - 令牌将被读入登录消息。
# 如果指定"oidc" - 将使用 OIDC 设置颁发 OIDC(开放 ID 连接)令牌。 默认情况下,该值为"token"。
auth.method = "token"
# auth.additionalScopes 指定包含身份验证信息的附加范围。
# 可选值为 HeartBeats、NewWorkConns。
# auth.additionalScopes = ["HeartBeats", "NewWorkConns"]
# auth token
auth.token ="123456"
# oidc 发行者指定验证 OIDC 令牌的发行者。
# auth.oidc.issuer = ""
# oidcaudience 指定验证时 OIDC 令牌应包含的受众。
# auth.oidc.audience = ""
# oidc SkipExpiryCheck 指定是否在 OIDC 令牌过期时跳过检查。
# auth.oidc.skipExpiryCheck = false
# oidc skipIssuerCheck 指定是否跳过检查 OIDC 令牌的颁发者声明是否与 OidcIssuer 中指定的颁发者匹配。
# auth.oidc.skipIssuerCheck = false
# userConnTimeout 指定等待工作连接的最长时间。
# userConnTimeout = 10
# 只允许 frpc 绑定您列出的端口。 默认情况下,不会有任何限制。
# allowPorts = [
# { start = 2000, end = 3000 },
# { single = 3001 },
# { single = 3003 },
# { start = 4000, end = 50000 }
# ]
# 每个客户端可以使用的最大端口数,默认值为0表示无限制
maxPortsPerClient = 0
# 如果subDomainHost不为空,则可以在frpc的配置文件中设置type为http或https时的子域名
# subDomainHost = "frps.com"
# subdomain为test时,路由使用的host为test.frps.com
# subDomainHost = "*.proxy.frps.com"
# subdomain为test时,路由使用的host为test.proxy.frps.com
# HTTP 请求的自定义 404 页面
# custom404Page = "/path/to/404.html"
# 指定udp数据包大小,单位为字节。 如果未设置,则默认值为 1500。
# 这个参数在客户端和服务器之间应该是相同的。
# 它影响 udp 和 sudp 代理。
udpPacketSize = 1500
# NAT打洞策略数据的保留时间。
natholeAnalysisDataReserveHours = 168
# [[http插件]]
# name = "user-manager"
# addr = "127.0.0.1:9000"
# path = "/handler"
# ops = ["Login"]
# [[http插件]]
# name = "port-manager"
# addr = "127.0.0.1:9001"
# path = "/handler"
# ops = ["NewProxy"]
验证
# 配置使用之前记得验证一下,是否正常
$ ./frps verify -c frps.toml