概念

工作原理

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

代理

在 frp 中,一个代理对应一个需要公开访问的内网服务。一个客户端可以同时配置多个代理,以满足不同的需求。

代理类型

frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:

  • TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。
  • UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。
  • HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。
  • HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。
  • STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
  • SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
  • XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。
  • TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。

每种代理类型适用于不同的使用情境,您可以根据需求选择合适的代理类型来配置 frp。

安装

系统需求

由于采用 Go 语言编写,因此系统需求与最新的 Go 语言对系统和平台的要求一致,具体请参考 Golang System requirements

下载

您可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明。

部署

  1. 解压下载的压缩包。
  2. frpc 复制到内网服务所在的机器上。
  3. frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

开始使用!

  1. 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
  2. 使用以下命令启动服务器:./frps -c ./frps.toml
  3. 使用以下命令启动客户端:./frpc -c ./frpc.toml
  4. 如果需要在后台长期运行,建议结合其他工具,如 systemdsupervisor

如果您是 Windows 用户,需要在命令提示符中执行相同的命令。

有关如何编写配置文件,请参考 示例 部分中的内容。

完整的配置项说明,请参考 Reference 中的内容。

示例

通过 SSH 访问内网机器
通过简单配置 TCP 类型的代理,使用户能够访问内网服务器。

多个 SSH 服务复用同一端口
通过使用 tcpmux 类型的代理,您可以实现多个 SSH 服务通过同一端口进行暴露。这种方法还适用于任何支持 HTTP Connect 代理连接方式的客户端,以实现端口的复用。

通过自定义域名访问内网的 Web 服务
通过简单配置 HTTP 类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。

转发 DNS 查询请求
本示例演示如何通过简单配置 UDP 类型的代理来实现 DNS 查询请求的转发。

转发 Unix 域套接字
通过配置 Unix 域套接字客户端插件,您可以使用 TCP 端口访问内网的 Unix 域套接字服务,例如 Docker Daemon。

对外提供简单的文件访问服务
通过配置 static_file 客户端插件,您可以将本地文件暴露在公网上,以供其他人访问。

为本地 HTTP 服务启用 HTTPS
使用 https2http 插件将本地 HTTP 服务转换为 HTTPS 服务,以供外部访问。

安全地暴露内网服务
通过创建一个只有授权用户能够访问的 SSH 服务代理,实现内网服务的安全暴露。

点对点内网穿透
这个示例将演示如何通过点对点 (P2P) 连接来访问内网服务,流量不会通过服务器中转。