====== frp ====== ---- frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。 {{ :wiki:frp_architecture.png |}} ====== 为什么选择frp ====== ---- 通过在具有公网 IP 的节点上部署 frp 服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性: 多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。 TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。 代理组间的负载均衡。 端口复用:多个服务可以通过同一个服务端端口暴露。 P2P 通信:流量不必经过服务器中转,充分利用带宽资源。 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。 ====== 概念 ====== ---- 了解以下概念有助于更好地理解和使用 frp。 ===== 工作原理 ===== frp 主要由两个组件组成:[[frpc_conf|客户端(frpc)]] 和 [[frps_conf|服务端(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。 ====== 安装 ====== ---- ===== 下载 ===== 您可以从 GitHub 的 [[https://github.com/fatedier/frp/releases|Release]] 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明。 部署 解压下载的压缩包。 将 frpc 复制到内网服务所在的机器上。 将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。 ===== 开始使用! ===== 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。 使用以下命令启动服务器:./frps -c ./frps.toml。 使用以下命令启动客户端:./frpc -c ./frpc.toml。 如果需要在后台长期运行,建议结合其他工具,如 systemd 和 supervisor。 ==== 使用 systemd ==== ---- 此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。 在 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 写入内容 [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 [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 通过遵循上述步骤,您可以轻松地使用 systemd 来管理 frps 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。 ====== 示例 ====== ---- 在这里,您将找到多个常见的使用场景和配置示例,可供您用来亲自部署和体验这些示例。 [[frp_ssh|通过SSH访问内网机器]] 通过简单配置 TCP 类型的代理,使用户能够访问内网服务器。 [[frp_multiple-ssh|多个SSH服务复用同一端口]] 通过使用 tcpmux 类型的代理,您可以实现多个 SSH 服务通过同一端口进行暴露。这种方法还适用于任何支持 HTTP Connect 代理连接方式的客户端,以实现端口的复用。 [[frp_vhost-http|通过自定义域名访问内网的 Web 服务]] 通过简单配置HTTP类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。 [[frp_dns|转发 DNS 查询请求]] 本示例演示如何通过简单配置 UDP 类型的代理来实现 DNS 查询请求的转发。 [[frp_unix-domain-socket|转发Unix域套接字]] 通过配置 Unix 域套接字客户端插件,您可以使用 TCP 端口访问内网的 Unix 域套接字服务,例如 Docker Daemon。 [[frp_static-file|对外提供简单的文件访问服务]] 通过配置 static_file 客户端插件,您可以将本地文件暴露在公网上,以供其他人访问。 [[frp_https2http|为本地 HTTP 服务启用 HTTPS]] 使用 https2http 插件将本地 HTTP 服务转换为 HTTPS 服务,以供外部访问。 [[frp_stcp|安全地暴露内网服务]] 通过创建一个只有授权用户能够访问的 SSH 服务代理,实现内网服务的安全暴露。 [[frp_xtcp|点对点内网穿透]] 这个示例将演示如何通过点对点 (P2P) 连接来访问内网服务,流量不会通过服务器中转。 ====== 相关网站 ====== ---- [[https://github.com/fatedier/frp|源码]] [[https://gofrp.org/zh-cn/|官网]] ====== 相关 ====== ---- [[p2p通信技术]] [[网络地址转换器|NAT]]