新版frp进行内网穿透/反向代理及原理解析
一、前言
- 因 frp 0.52.0 版本后支持 TOML、YAML 和 JSON 配置文件,并弃用 INI 配置文件,将在未来版本中删除对 INI 的支持
- 所以可能互联网上0.52.0版本以前的教程将在未来全部失效(如果你就用老版本当我没说)
- 为了稳定与新功能,本篇的frps/frpc将全部采用 TOML 配置文件演示
写这篇文章是想直接访问处在局域网环境,不具备公网ip的NAS系统。正巧手里头有一个阿里云的云服务器,在配置了frp内网穿透成功后,将配置教程作以记录。
在实现内网穿透之前,先确保手上有两样东西:
- 1台有公网ip的服务器
- 1台在内网的服务器(可以是虚拟机)
二、原理解析
注:有讲解错误的地方欢迎指正
1、问题
外网主机没办法直接访问到内网资源,由于NAT机制的原因

那如何能够成功访问内网?这里需要用到一个反向代理,将内网某端口转发到公网vps上,然后你对公网vps监听端口的访问就等同于对内网服务器转发出来的端口的访问

2、frp流程图

3、Frp请求原理
1)frpc启动后向frps请求建立长连接并保持,若连接失败,则重新尝试建立连接
2)frps收到请求后,建立一个listener监听公网的请求
3)客户端向frps发送请求,frps接受到请求后,发送给frpc
4)frpc收到之后向frps发送请求,并且在请求开头指明连接去向
5)frps接收到frpc的连接请求把新建立的连接和来自公网的连接进行流量相互转发
三、frps服务端配置
1、Linux环境
(1)下载并解压
wget -c https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_linux_amd64.tar.gz
tar -zxvf frp_0.61.2_linux_amd64.tar.gz #解压文件
mv frp_0.61.2_linux_amd64 /usr/local #将frp目录移动到/usr/local下
mv /usr/local/frp_0.61.2_linux_amd64 /usr/local/frps #将frp目录改名成frps
(2)配置frps.toml
#服务端监听端口,用于和client端通信的
bindPort = 5443
#服务端监听地址,用于接收 frpc 的连接,默认监听 0.0.0.0。
bindAddr = "0.0.0.0"
# 服务端监听 KCP 协议端口,用于接收配置了使用 KCP 协议的 frpc 连接。端口可和 bindPort 相同,未配置时默认禁用 KCP
kcpBindPort = 5443
# 服务端监听 QUIC 协议端口,用于接收配置了使用 QUIC 协议的 frpc 连接。未配置时默认禁用 QUIC
quicBindPort = 7002
#HTTP 类型代理监听的端口,启用后才能支持 HTTP 类型的代理。
vhostHTTPPort = 1080
#HTTPS 类型代理监听的端口,启用后才能支持 HTTPS 类型的代理。
vhostHTTPSPort = 10443
# HTTP 类型代理在服务端的 ResponseHeader 超时时间,默认为 60s。
vhostHTTPTimeout = 60
#允许客户端设置的最大连接池大小,如果客户端配置的值大于此值,会被强制修改为最大值,默认为 5。
maxPoolCount = 50
#tcpmux 类型且复用器为 httpconnect 的代理监听的端口。
tcpmuxHTTPConnectPort = 16337
#对于 tcpmux 类型的代理是否透传 CONNECT 请求,默认false。
tcpmuxPassthrough = false
# 二级域名后缀。
#subDomainHost = "frps.com"
# 自定义 404 错误页面地址。
#custom404Page = "/path/to/404.html"
# 是否提供 Prometheus 监控接口,需要同时启用了 webServer 后才会生效。
enablePrometheus = true
# 服务端返回详细错误信息给客户端,默认为 true。
detailedErrorsToClient = true
# 用户建立连接后等待客户端响应的超时时间,单位秒,默认为 10 秒。
# userConnTimeout = 10
#代理 UDP 服务时支持的最大包长度,默认为 1500,服务端和客户端的值需要一致。
udpPacketSize = 1500
# 打洞策略数据的保留时间,默认为 168 小时,即 7 天。
natholeAnalysisDataReserveHours = 168
# 限制单个客户端最大同时存在的代理数,默认无限制。
maxPortsPerClient = 0
# 允许代理绑定的服务端端口。
allowPorts = [
{ start = 10000, end = 15000 }, #端口范围设置为10000-15000可用
{ start = 30000, end = 40000 }, #同理,可设置多个端口范围开放
{ single = 25565 }, #单端口设置,指定25565端口可用
{ single = 25566 } #同理,可以设置多个单端口开放
]
# 鉴权配置
[auth]
## 鉴权方式,可选值为 token 或 oidc,未配置默认为 token。
method = "token"
# 鉴权信息附加范围,可选值为 HeartBeats 和 NewWorkConns
additionalScopes = ["HeartBeats", "NewWorkConns"]
# 在 method 为 token 时生效,客户端需要设置一样的值才能鉴权通过。
token = "frp990103"
## oidc 鉴权配置。
[oidc]
### oidc issuer specifies the issuer to verify OIDC tokens with.
oidc.issuer = ""
### oidc audience specifies the audience OIDC tokens should contain when validated.
oidc.audience = ""
### oidc skipExpiryCheck specifies whether to skip checking if the OIDC token is expired.
oidc.skipExpiryCheck = false
### oidc skipIssuerCheck specifies whether to skip checking if the OIDC token's issuer claim matches the issuer specified in OidcIssuer.
oidc.skipIssuerCheck = false
#后台管理面板配置
[webServer]
# webServer 监听地址,默认为 127.0.0.1。
addr = "0.0.0.0"
# webServer 监听端口。
port = 6443
# HTTP BasicAuth 用户名。
user = "admin"
# HTTP BasicAuth 密码。
password = "frp990103"
# 静态资源目录,Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源。
#assetsDir = "./static"
# 启动 Go HTTP pprof,用于应用调试。
#pprofEnable = false
# Dashboard 启用 HTTPS 的 TLS 相关配置。
# TLS 证书文件路径。
# tls.certFile = "server.crt"
# TLS 密钥文件路径。
# tls.keyFile = "server.key"
#ssh 隧道网关配置。
[sshTunnelGateway]
#SSH 服务器监听端口。
#bindPort = 6000
#privateKeyFile = "/etc/ssh/ssh_host_rsa_key"
#autoGenPrivateKeyPath = "/etc/ssh/ssh_host_rsa_key"
#authorizedKeysFile = "/etc/ssh/authorized_keys"
# 日志配置
[log]
# 日志输出文件路径,如果为 console,则会将日志打印在标准输出中。
to = "/var/log/frps.log"
# 日志级别,可选值为 trace, debug, info, warn, error,默认级别为 info。
level = "info"
# 日志文件最多保留天数,默认为 3 天。
maxDays = 30
# 禁用标准输出中的日志颜色。
disablePrintColor = false
#网络层配置
[transport]
# tcp mux 的心跳检查间隔时间,单位秒。
tcpMuxKeepaliveInterval = 60
# 和客户端底层 TCP 连接的 keepalive 间隔时间,单位秒,配置为负数表示不启用。
tcpKeepalive = 7200
#允许客户端设置的最大连接池大小,如果客户端配置的值大于此值,会被强制修改为最大值,默认为 5。
maxPoolCount = 5
# 服务端和客户端心跳连接的超时时间,单位秒,默认为 90 秒。
heartbeatTimeout = 90
# 是否启用 tcp mux
tcpMux = true
#QUIC 协议配置参数。
#quic.keepalivePeriod = 10
#quic.maxIdleTimeout = 30
#quic.maxIncomingStreams = 100000
#服务端 TLS 协议配置。
#是否只接受启用了TLS的客户端连接
#tls.force = false
#TLS 协议配置
#TLS 证书文件路径。
#tls.certFile = "server.crt"
#TLS 密钥文件路径。
#tls.keyFile = "server.key"
#CA 证书文件路径。
#tls.trustedCaFile = "ca.crt"
# 服务端 HTTP 插件配置。
#[[httpPlugins]]
## 插件名称。
#name = "user-manager"
## 插件接口的地址。
#addr = "127.0.0.1:9000"
## 插件接口的 Path。
#path = "/handler"
## 插件需要生效的操作列表,具体可选值请参考服务端插件的说明文档。
#ops = ["Login"]
#[[httpPlugins]]
#name = "port-manager"
#addr = "127.0.0.1:9001"
#path = "/handler"
#ops = ["NewProxy"]
(3)启动
./frps -c frps.toml
(4)验证是否启动成功
访问:http://服务器IP:后台管理端口” ,输入用户名和密码可以查看连接状态
(5)配置 systemctl 服务设置开机自启
vi /etc/systemd/system/frps.service
#填入以下内容
[Unit]
Description=frps
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frps/frps -c /usr/local/frps/frps.toml #填写frps的安装目录
Restart=always
[Install]
WantedBy=multi-user.target
使用以下命令控制 frps 服务
systemctl enable frps #开启开机自启动frps服务
systemctl disable frps #关闭开机自启动frps服务
systemctl start frps #启动frps服务
systemctl stop frps #停止frps服务
systemctl status frps #查看frps服务状态
2、Windows环境
- 前往 GitHub 下载frps
- arm/arm64对应arm架构(不会有人用Windows on ARM吧),amd64对应x86架构
- 如果遇到GitHub无法打开的情况下可以使用本站提供的 123Pan 下载
(1)配置frps.toml文件
bindPort = 7000 #服务端监听端口
auth.method = "token" #服务端连接身份认证,默认token
auth.token = "mint" #服务端token密码
vhostHTTPPort = 80
vhostHTTPSPort = 443
transport.tls.force = false #是否只接受启用了TLS的客户端连接
transport.maxPortsPerClient = 20 #每个客户端可以创建多少隧道
allowPorts = [
{ start = 10000, end = 15000 }, #端口范围设置为10000-15000可用
{ start = 30000, end = 40000 }, #同理,可设置多个端口范围开放
{ single = 25565 }, #单端口设置,指定25565端口可用
{ single = 25566 } #同理,可以设置多个单端口开放
]
(2)配置启动文件
这里有两种方法,一种是配置好 xxx.bat 后放在C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
目录下,这样可以在用户登录后自动启动 xxx.bat 这种方法简单直接
还有一种方法,直接使用 nssm.exe 配置frps为系统服务,这种方法可以无需登录用户账号后台运行
建议第二种方法,为了稳妥,两种方法都演示一遍
方式一: 在frps目录下新建 xxx.bat 文件,把下方内容填进去
frps -c frps.toml
右键创建快捷方式后将快捷方式扔进下方目录即可
C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
如果之后要更新 frps.toml 配置文件,把cmd窗口关闭重启 xxx.bat 就没问题了
方式二:打开 nssm官网 下载 nssm.exe ,国内访问较慢可使用本站提供的 123Pan 下载
解压后在win64/32找到 nssm.exe 放在a目录里,打开 cmd 后cd到a目录下运行
nssm install frpsCMD
输完命令回车后会弹个窗口,根据实际情况按下图填后按 Install service 即可
之后到 任务管理器→服务 中找到 frpc 服务后右键开始就没问题了。如果之后要更新 frps.toml 配置文件,再次找到此处右键重新启动就没问题了
四、frpc客户端配置
1、Linux环境
上面下载到的frpc
和frpc.toml
文件拷贝到客户机进行配置
(1)配置frpc.toml
# 用户名,设置此参数后,代理名称会被修改为 {user}.{proxyName},避免代理名称和其他用户冲突。
user = "your_name"
# 连接服务端的地址。
serverAddr = "0.0.0.0"
# 连接服务端的端口,默认为 7000。
serverPort = 7000
# xtcp 打洞所需的 stun 服务器地址,默认为 stun.easyvoip.com:3478。
#natHoleStunServer = "stun.easyvoip.com:3478"
# 使用 DNS 服务器地址,默认使用系统配置的 DNS 服务器,指定此参数可以强制替换为自定义的 DNS 服务器地址。
dnsServer = "8.8.8.8"
# 第一次登陆失败后是否退出,默认为 true。
loginFailExit = true
# 指定启用部分代理,当配置了较多代理,但是只希望启用其中部分时可以通过此参数指定,默认为全部启用。
#start = ["ssh", "dns"]
# 代理 UDP 服务时支持的最大包长度,默认为 1500,服务端和客户端需要保持配置一致。
udpPacketSize = 1500
# 附加元数据,会传递给服务端插件,提供附加能力。
metadatas.var1 = "abc"
metadatas.var2 = "123"
# 指定额外的配置文件目录,其中的 proxy 和 visitor 配置会被读取加载。
#includes = ["./confd/*.ini"]
# 鉴权配置
[auth]
## 鉴权方式,可选值为 token 或 oidc,默认为 token。
method = "token"
## 鉴权信息附加范围,可选值为 HeartBeats 和 NewWorkConns
additionalScopes = ["HeartBeats", "NewWorkConns"]
## 在 method 为 token 时生效,客户端需要设置一样的值才能鉴权通过。
token = "12345678"
## oidc 鉴权配置。
### oidc.clientID specifies the client ID to use to get a token in OIDC authentication.
oidc.clientID = ""
### oidc.clientSecret specifies the client secret to use to get a token in OIDC authentication.
oidc.clientSecret = ""
### oidc.audience specifies the audience of the token in OIDC authentication.
oidc.audience = ""
### oidc.scope specifies the permisssions of the token in OIDC authentication if AuthenticationMethod == "oidc". By default, this value is "".
oidc.scope = ""
### oidc.tokenEndpointURL specifies the URL which implements OIDC Token Endpoint.It will be used to get an OIDC token.
oidc.tokenEndpointURL = ""
### oidc.additionalEndpointParams specifies additional parameters to be sent to the OIDC Token Endpoint.
### For example, if you want to specify the "audience" parameter, you can set as follow.
### frp will add "audience=" "var1=" to the additional parameters.
oidc.additionalEndpointParams.audience = "https://dev.auth.com/api/v2/"
oidc.additionalEndpointParams.var1 = "foobar"
# 日志配置
[log]
# 日志输出文件路径,如果为 console,则会将日志打印在标准输出中。
to = "/var/log/frps.log"
# 日志级别,可选值为 trace, debug, info, warn, error,默认级别为 info。
level = "info"
# 日志文件最多保留天数,默认为 3 天。
maxDays = 30
# 禁用标准输出中的日志颜色。
disablePrintColor = false
# 客户端 AdminServer 配置。
[webServer]
## webServer 监听地址,默认为 127.0.0.1。
addr = "127.0.0.1"
## webServer 监听端口。
port = 7400
## HTTP BasicAuth 用户名。
user = "admin"
## HTTP BasicAuth 密码。
password = "admin"
## 静态资源目录,Dashboard 使用的资源默认打包在二进制文件中,通过指定此参数使用自定义的静态资源。
assetsDir = "./static"
## 启动 Go HTTP pprof,用于应用调试。
pprofEnable = false
# 客户端网络层配置。
[transport]
# 和 frps 之间的通信协议,可选值为 tcp, kcp, quic, websocket, wss。默认为 tcp。
protocol = "tcp"
# 连接服务端的超时时间,默认为 10s。
dialServerTimeout = 10
## 和服务端底层 TCP 连接的 keepalive 间隔时间,单位秒。
dialServerKeepalive = 7200
## 连接服务端时所绑定的本地 IP。
connectServerLocalIP = "0.0.0.0"
## 连接池大小。
poolCount = 5
#全局配置,传输加密,加密算法采用 aes-128-cfb
useEncryption = true
#全局配置,传输压缩,压缩算法采用 snappy
useCompression = true
## 向服务端发送心跳包的间隔时间,默认为 30s。建议启用 tcp_mux_keepalive_interval,将此值设置为 -1。
heartbeatInterval = 30
## 和服务端心跳的超时时间,默认为 90s。
heartbeatTimeout = 90
## TCP 多路复用,默认启用。
tcpMux = true
## tcp_mux 的心跳检查间隔时间。
tcpMuxKeepaliveInterval = 60
## 连接服务端使用的代理地址,格式为 {protocol}://user:passwd@192.168.1.128:8080 protocol 目前支持 http、socks5、ntlm。
#proxyURL = "http://user:passwd@192.168.1.128:8080"
#proxyURL = "socks5://user:passwd@192.168.1.128:1080"
#proxyURL = "ntlm://user:passwd@192.168.1.128:2080"
## QUIC 协议配置参数。
quic.keepalivePeriod = 10
quic.maxIdleTimeout = 30
quic.maxIncomingStreams = 100000
## 客户端 TLS 协议配置。
### 是否和服务端之间启用 TLS 连接,默认启用。
#tls.enable = true
### 启用 TLS 连接时,不发送 0x17 特殊字节。默认为 true。当配置为 true 时,无法和 vhostHTTPSPort 端口复用。
#tls.disableCustomTLSFirstByte = true
### TLS 证书文件路径。
#tls.certFile = "client.crt"
### TLS 密钥文件路径。
#tls.keyFile = "client.key"
### CA 证书文件路径。
#tls.trustedCaFile = "ca.crt"
### TLS Server 名称。
#tls.serverName = "example.com"
# 代理配置,不同的代理类型对应不同的配置
## TCP代理配置
[[proxies]]
### 代理名称。
name = "ssh"
### 代理类型,可选值为 tcp, udp, http, https, tcpmux, stcp, sudp, xtcp。
type = "tcp"
#代理的注释信息,会被展示在 server 的 dashboard 中。
annotations = map[string]string
### 附加元数据,会传递给服务端插件,提供附加能力。
metadatas.var1 = "abc"
metadatas.var2 = "123"
### 被代理的本地服务 IP,默认为 127.0.0.1。
localIP = "127.0.0.1"
### 被代理的本地服务端口。
localPort = 22
### 服务端绑定的端口,用户访问服务端此端口的流量会被转发到对应的本地服务。若配置为0则或随机分配端口
remotePort = 6001
### 代理网络层配置。
#### 设置单个 proxy 的带宽限流,单位为 MB 或 KB,0 表示不限制,如果启用,默认会作用于对应的 frpc。
transport.bandwidthLimit = "1MB"
#### 限流类型,客户端限流或服务端限流,可选值为 client 和 server,默认为客户端限流。
transport.bandwidthLimitMode = "client"
#### 是否启用加密功能,启用后该代理和服务端之间的通信内容都会被加密传输,如果 frpc 启用了全局 TLS,则不需要再启用此参数。
transport.useEncryption = false
#### 是否启用压缩功能,启用后该代理和服务端之间的通信内容都会被压缩传输,压缩算法采用 snappy。
transport.useCompression = false
#启用 proxy protocol 协议的版本,可选值为 v1 和 v2。如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容。
transport.proxyProtocolVersion = v1
### 负载均衡配置。
#### 负载均衡分组名称,用户请求会以轮询的方式发送给同一个 group 中的代理。
loadBalancer.group = "test_group"
#### 负载均衡分组密钥,用于对负载均衡分组进行鉴权,groupKey 相同的代理才会被加入到同一个分组中。
loadBalancer.groupKey = "123456"
### 健康检查配置。
#### 健康检查类型,可选值为 tcp 和 http,配置后启用健康检查功能,tcp 是连接成功则认为服务健康,http 要求接口返回 2xx 的状态码则认为服务健康。
healthCheck.type = "tcp"
#### 健康检查超时时间(秒),默认为 3s。
healthCheck.timeoutSeconds = 3
#### 健康检查连续错误次数,连续检查错误多少次认为服务不健康,默认为 1。
healthCheck.maxFailed = 3
#### 健康检查周期(秒),每隔多长时间进行一次健康检查,默认为 10s。
healthCheck.intervalSeconds = 10
####健康检查的 HTTP 接口,如果健康检查类型是 http,则需要配置此参数,指定发送 http 请求的 path,例如 /health。
healthCheck.path = "/health"
## UDP代理配置
[[proxies]]
name = "dns"
type = "udp"
localIP = "114.114.114.114"
localPort = 53
remotePort = 6002
## HTTP 配置
[[proxies]]
name = "web01"
type = "http"
localIP = "127.0.0.1"
localPort = 80
### HTTP Basic Auth 用户名。
httpUser = "admin"
### HTTP Basic Auth 密码。
httpPassword = "admin"
### 子域名。
subdomain = "web01"
### 自定义域名列表。
customDomains = ["web01.yourdomain.com"]
### URL 路由配置。
locations = ["/", "/pic"]
### 根据 HTTP Basic Auth user 路由。
routeByHTTPUser = abc
### 替换 Host Header。
hostHeaderRewrite = "example.com"
### 对请求 Header 的操作配置。
#### 在 Header 中设置指定的 KV 值。
requestHeaders.set.x-from-where = "frp"
### 健康检查配置。
healthCheck.type = "http"
#### 健康检查的 HTTP 接口,如果健康检查类型是 http,则需要配置此参数,指定发送 http 请求的 path,例如 /health。
healthCheck.path = "/status"
healthCheck.intervalSeconds = 10
healthCheck.maxFailed = 3
healthCheck.timeoutSeconds = 3
## HTTPS 配置
[[proxies]]
name = "web02"
type = "https"
localIP = "127.0.0.1"
localPort = 8000
subdomain = "web02"
customDomains = ["web02.yourdomain.com"]
# 启用 proxy protocol 协议的版本,可选值为 v1 和 v2。如果启用,则 frpc 和本地服务建立连接后会发送 proxy protocol 的协议,包含了原请求的 IP 地址和端口等内容。
proxyProtocolVersion = "v2"
## TCPMux 配置
[[proxies]]
name = "tcpmuxhttpconnect"
type = "tcpmux"
multiplexer = "httpconnect"
localIP = "127.0.0.1"
localPort = 10701
customDomains = ["tunnel1"]
# routeByHTTPUser = "user1"
[[proxies]]
name = "plugin_unix_domain_socket"
type = "tcp"
remotePort = 6003
# if plugin is defined, localIP and localPort is useless
# plugin will handle connections got from frps
[proxies.plugin]
type = "unix_domain_socket"
unixPath = "/var/run/docker.sock"
[[proxies]]
name = "plugin_http_proxy"
type = "tcp"
remotePort = 6004
[proxies.plugin]
type = "http_proxy"
httpUser = "abc"
httpPassword = "abc"
[[proxies]]
name = "plugin_socks5"
type = "tcp"
remotePort = 6005
[proxies.plugin]
type = "socks5"
username = "abc"
password = "abc"
[[proxies]]
name = "plugin_static_file"
type = "tcp"
remotePort = 6006
[proxies.plugin]
type = "static_file"
localPath = "/var/www/blog"
stripPrefix = "static"
httpUser = "abc"
httpPassword = "abc"
[[proxies]]
name = "plugin_https2http"
type = "https"
customDomains = ["test.yourdomain.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
[[proxies]]
name = "plugin_https2https"
type = "https"
customDomains = ["test.yourdomain.com"]
[proxies.plugin]
type = "https2https"
localAddr = "127.0.0.1:443"
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
[[proxies]]
name = "plugin_http2https"
type = "http"
customDomains = ["test.yourdomain.com"]
[proxies.plugin]
type = "http2https"
localAddr = "127.0.0.1:443"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
[[proxies]]
name = "secret_tcp"
# If the type is secret tcp, remotePort is useless
# Who want to connect local port should deploy another frpc with stcp proxy and role is visitor
type = "stcp"
# secretKey is used for authentication for visitors
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# If not empty, only visitors from specified users can connect.
# Otherwise, visitors from same user can connect. '*' means allow all users.
allowUsers = ["*"]
[[proxies]]
name = "p2p_tcp"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# If not empty, only visitors from specified users can connect.
# Otherwise, visitors from same user can connect. '*' means allow all users.
allowUsers = ["user1", "user2"]
# 访问者配置,不同的访问者类型对应不同的配置
## STCP 配置
[[visitors]]
### 访问者名称。
name = "secret_tcp_visitor"
### 访问者类型,可选值为 stcp, sudp, xtcp。
type = "stcp"
### 要访问的 proxy 名称。
serverName = "secret_tcp"
### 密钥,服务端和访问端的密钥需要一致,访问端才能访问到服务端。
secretKey = "abcdefg"
### visitor 监听的本地地址,通过访问监听的地址和端口,连接到远端代理的服务。
bindAddr = "127.0.0.1"
### visitor 监听的本地端口,如果为 -1,表示不需要监听物理端口,通常可以用于作为其他 visitor 的 fallback。
bindPort = 9000
## XTCP 配置
[[visitors]]
name = "p2p_tcp_visitor"
type = "xtcp"
### 要访问的 proxy 所属的用户名,如果为空,则默认为当前用户。
serverUser = "user1"
serverName = "p2p_tcp"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 9001
### 是否保持隧道打开,如果开启,会定期检查隧道状态并尝试保持打开。
keepTunnelOpen = false
### 每小时尝试打开隧道的次数,默认值为 8。
maxRetriesAnHour = 8
### 重试打开隧道的最小间隔时间,单位: 秒,默认为 90s。
minRetryInterval = 90
### 回退到的其他 visitor 名称。
fallbackTo = "stcp_visitor"
### 连接建立超过多长时间(ms) 后回退到其他 visitor。
fallbackTimeoutMs = 500
(2)配置 systemctl 服务设置开机自启
vi /etc/systemd/system/frpc.service
#填入以下内容
[Unit]
Description=frpc
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frpc/frpc -c /usr/local/frpc/frpc.toml #填写frpc的安装目录
Restart=always
[Install]
WantedBy=multi-user.target
使用以下命令控制 frpc 服务
systemctl enable frpc #开启开机自启动frpc服务
systemctl disable frpc #关闭开机自启动frpc服务
systemctl start frpc #启动frpc服务
systemctl stop frpc #停止frpc服务
systemctl status frpc #查看frpc服务状态
2、Windows环境
(1)配置frpc.toml
serverAddr = "1.1.1.1" #服务器地址
serverPort = 7000 #服务器端口
auth.method = "token" #服务端连接身份认证,默认token
auth.token = "test123" #服务端token密码,密码不正确将无法连接服务器
transport.tls.enable = false #是否和服务端之间启用TLS连接
transport.tls.disableCustomTLSFirstByte = false
#默认为true,当配置为true时,无法和vhostHTTPSPort端口复用
[[proxies]]
name = "rdp" #隧道名称,可自定义,不能重复
type = "tcp" #隧道类型,可用tcp, udp, http, https, tcpmux, stcp, sudp, xtcp
localIP = "127.0.0.1" #本地IP地址,如果是本机就127.0.0.1
localPort = 3389 #本地端口,本地服务端口
remotePort = 23389 #远程端口,连接隧道时用的端口
transport.useEncryption = true #传输加密,加密算法采用 aes-128-cfb
transport.useCompression = true #传输压缩,压缩算法采用 snappy
2、配置启动文件
参考frps启动文件配置方法