frp: 开源内网穿透工具,支持 TCP/UDP/HTTP/P2P

frp 是一款开源的内网穿透工具,用于将位于 NAT 或防火墙后面的本地服务器暴露到公网。目前在 GitHub 上获得了超过 10 万 Star。

正文顶部截图

解决什么问题

家里或公司的服务器处于内网环境,外部网络无法直接访问。传统的解决办法是配置路由器端口映射或搭建 VPN,操作繁琐且受运营商限制。frp 的思路是:在一台有公网 IP 的服务器上部署服务端(frps),在内网机器上部署客户端(frpc),通过两者之间的连接把内网端口映射到公网。

支持的协议

frp 目前支持 TCP、UDP、HTTP、HTTPS 四种协议。HTTP 和 HTTPS 代理支持通过域名转发请求,可以把本地的 Web 服务映射到自定义域名上。还有 STCP(安全 TCP)和 XTCP(P2P)模式。STCP 需要预共享密钥才能访问,适合不想把服务直接暴露到公网的场景。XTCP 在两台客户端之间建立点对点直连,服务端只负责协商,实际数据不经过服务端中转。

README区域截图

上手过程

frp 由 Go 语言编写,只有两个二进制文件:frps(服务端)和 frpc(客户端)。从 Release 页面下载对应平台的版本后,写一份 TOML 配置文件就能启动。

以暴露 SSH 服务为例,服务端配置只需指定监听端口:

bindPort = 7000

客户端配置指向服务端地址,声明要映射的本地端口:

serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

启动两端程序后,通过 ssh -oPort=6000 user@服务器IP 就能连上内网机器。

配置文件支持 TOML、YAML、JSON 三种格式,也支持在配置中引用环境变量和拆分成多个文件。

功能概览

frp 的功能覆盖面比较广:

  • 服务端仪表盘:通过 Web 界面查看连接状态和流量统计
  • 客户端管理界面:在浏览器中管理代理配置,支持运行时动态增删
  • 认证机制:支持 Token 和 OIDC 两种认证方式
  • TLS 加密:客户端和服务端之间可以启用 TLS 通信
  • 热重载:修改配置后无需重启,自动加载新配置
  • 带宽限制:可以按代理设置流量上限
  • TCP 复用和连接池:减少连接建立开销
  • 负载均衡:多个后端服务之间分发流量
  • 健康检查:自动检测后端服务状态
  • KCP 和 QUIC 协议支持:在高延迟或弱网环境下提升传输效率
  • SSH 隧道网关:通过 SSH 协议建立隧道

配置中还可以通过插件机制扩展功能,比如把 Unix Domain Socket 暴露为 TCP 端口,或为本地 HTTP 服务自动配置 HTTPS 证书。

适用场景

常见的使用场景包括:远程访问家中电脑、把本地开发环境暴露给同事测试、为没有公网 IP 的服务器搭建 Web 服务入口、跨网络访问数据库或管理面板等。STCP 和 XTCP 模式适合对安全性有要求的场景,数据不经过公网服务器中转。

frp 目前正在开发 v2 版本,计划对核心代理层做重新设计,引入更灵活的插件体系。当前 v1 版本持续维护中,可以用于生产环境。

frp 目前正在开发 v2 版本,计划对核心代理层做重新设计,引入更灵活的插件体系。当前 v1 版本持续维护中,可以用于生产环境。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐