前言
什么场景下需要使用Frp服务呢?显然是后端服务器没有公网ipv4或ipv6的情况下,需要一个具有公网ip的服务器充作中转服务器来中转流量,以便在公网环境下访问无公网ip的服务器上的服务
这里介绍一个开源项目frp
frp(Fast Reverse Proxy) 是一款开源的高性能反向代理工具,它允许您在不同网络之间建立安全的通信通道,用于实现端口映射、内网穿透和远程访问等多种网络连接需求。
主要功能:
反向代理服务:frp 允许您将外部流量转发到内部网络中的应用程序或服务,使外部用户可以访问您的内部资源,如Web服务器、数据库或其他应用程序。
端口映射:您可以使用 frp 轻松设置端口映射,将外部请求转发到内部设备的特定端口,这对于在不同网络之间共享服务非常有用。
内网穿透:frp 支持内网穿透,使您可以通过公共互联网轻松访问位于受限网络中的设备或服务,无需复杂的网络配置。
TCP/UDP 支持:frp 不仅支持 TCP 流量的代理,还支持 UDP 流量,适用于各种应用场景,如在线游戏或实时通信。
安全性:frp 支持使用加密协议来保护数据传输的安全性,如TLS/SSL,以确保通信过程中的数据保密性和完整性。
多用户支持:frp 允许您配置多个用户和权限,以细粒度控制对代理服务的访问权限,增强安全性。
跨平台:frp 可在多个操作系统上运行,包括Linux、Windows和macOS,因此适用于各种不同的环境。
开源和自定义配置:frp 是开源软件,允许您根据特定需求自定义配置,以满足各种使用情况。
活跃的社区支持:frp 有一个积极的开发社区,提供广泛的文档和支持,以帮助用户快速入门和解决问题。
这里我准备了一个上下行对等的带宽峰值200mbps的阿里云云服务器作为服务端,部署Frp server;
以及我家里的24小时开机的家庭服务器作为客户端,部署Frp client;
家庭服务器上部署的服务通过云服务器中转穿透,使得公网情况下得以访问。
安装Frp server(服务端)
在阿里云云服务器作为服务端,部署Frp server
以1Panel为例,在应用市场直接搜索Frp即可(应用市场收录了Frp),如果你想脱离面板部署或使用Docker部署,请查询Frp官方文档


请注意:
服务端口 上对应的服务是客户端与服务端后期通信的端口
密钥 用于客户端与服务端握手鉴权
Dashboard 是Web UI面板服务端口
用户名和密码 是登录Web UI面板的用户名和密码
安装后到Frp server的项目目录中,找到frps.toml,这是其配置文件,打开后应如下图所示

由于安装后网络默认是host模式,所以直接监听服务器的ip
这里只需要注意一个点——认证token要和客户端的一样
此外,穿透HTTP(S)服务时,服务端一定要设置vhostHTTP(S)Port,否则穿透服务会启动失败
接下来在家庭服务器上安装Frp client
安装Frp client(客户端)
还是用1Panel做示例,

服务端ip和端口照上文服务端实际情况的填写即可,
密钥也与上文服务端的配置填写一致,
这里把Web UI暴露在7400端口,我们用局域网ip+端口的形式访问,比如http://10.0.1x.1xx:7400/
访问后,填写Configure(配置信息) ,然后点击Upload(更新配置),之后服务端和客户端通信便正常链接了

此时查看一下服务端的Web UI,可以看到我们的客户端配置的服务已经被记录并运行着,如下图所示

Frp client(客户端)配置信息填写样例
这里其实可以通过参照项目预留文件frpc_full.toml来进行填写
比如我想穿透我的博客服务,该博客服务在局域网10.0.1x.1xx:120xx上,那么在Configure(配置信息)里应该填写以下代码
[[proxies]]
name="blog"
type="tcp"
localIP="10.0.1x.1xx"
localPort=120xx
remotePort=600xx其中:
name是服务名称,type设置为tcp(也有http https等,具体根据实际情况和需求来填写),localIP和localPort就是你内网/后端服务的ip和端口;
remotePort则是这个服务在服务端上的中转端口,这里样例设置为60001,比如你的服务端的公网IP是101.101.101.101,后续可以在公网环境用101.101.101.101:600xx来访问你设置的内网穿透出来的服务。
这里再提供一些配置信息样例,可以根据需求来直接更改使用,详情参照项目内预留文件frpc_full.toml来进行填写:
TCP穿透样例
[[proxies]]
name = "ssh_random"
type = "tcp"
localIP = "192.168.31.100"
localPort = 22
# If remotePort is 0, frps will assign a random port for you
remotePort = 0UDP穿透样例
[[proxies]]
name = "dns"
type = "udp"
localIP = "114.114.114.114"
localPort = 53
remotePort = 6002HTTP穿透样例
[[proxies]]
name = "web01"
type = "http"
localIP = "127.0.0.1"
localPort = 80
# http username and password are safety certification for http protocol
# if not set, you can access this customDomains without certification
httpUser = "admin"
httpPassword = "admin"
# if domain for frps is frps.com, then you can access [web01] proxy by URL http://web01.frps.com
subdomain = "web01"
customDomains = ["web01.yourdomain.com"]
# locations is only available for http type
locations = ["/", "/pic"]
# route requests to this service if http basic auto user is abc
# routeByHTTPUser = abc
hostHeaderRewrite = "example.com"
requestHeaders.set.x-from-where = "frp"
healthCheck.type = "http"
# frpc will send a GET http request '/status' to local http service
# http service is alive when it return 2xx http response code
healthCheck.path = "/status"
healthCheck.intervalSeconds = 10
healthCheck.maxFailed = 3
healthCheck.timeoutSeconds = 3
# set health check headers
healthCheck.httpHeaders=[
{ name = "x-from-where", value = "frp" }
]HTTPS穿透样例
[[proxies]]
name = "web02"
type = "https"
localIP = "127.0.0.1"
localPort = 8000
subdomain = "web02"
customDomains = ["web02.yourdomain.com"]
# if not empty, frpc will use proxy protocol to transfer connection info to your local service
# v1 or v2 or empty
transport.proxyProtocolVersion = "v2"
评论