frp是一款高性能开源内网穿透工具,GitHub 105k+ Stars,支持TCP/UDP/HTTP/HTTPS全协议。可将NAT或防火墙后的本地服务暴露到公网,提供P2P直连、负载均衡、TLS加密等高级功能,是开发者和运维人员的远程访问必备神器,文末附详细使用教程

🎤 引言

有没有遇到过这种抓狂的情况:

  • 家里的 NAS 存了几百 G 的资料,出门在外想访问却苦于没有公网 IP
  • 本地开发了个 Web 项目,想让产品经理看一眼效果,只能截图发过去,交互根本展示不了
  • 公司内网有个测试环境,合作方想联调,只能跑到公司现场

这些场景的核心痛点都是:内网服务怎么暴露到公网?

传统方案要么申请公网 IP(运营商基本不给了),要么买云服务器做跳板(流量费贵),要么用 ngrok 这类商业服务(免费版限制多)。

frp 的出现,把这个过程简化到了极致——一个二进制文件 + 几行配置,搞定所有问题。


⭐ 核心功能

frp(Fast Reverse Proxy)是一个用 Go 语言编写的高性能反向代理应用,GitHub 上已经斩获 105k+ Stars,是内网穿透领域当之无愧的王者。

协议支持全面

  • TCP/UDP 端口转发(SSH、数据库、游戏服务器都能透)
  • HTTP/HTTPS 域名映射(Web 服务一键外网访问)
  • 支持 WebSocket、gRPC 等现代协议
  • 甚至能转发 DNS 查询和 Unix Domain Socket

高级特性丰富

  • P2P 直连模式:xtcp 协议让两端直接通信,不走服务器中转,延迟更低、不耗服务器流量
  • 负载均衡:同一服务可部署多个实例,自动分配流量,支持健康检查
  • 加密与压缩:支持 TLS 加密传输,可开启流量压缩节省带宽(实测压缩率 30-60%)
  • 身份认证:Token 认证、OIDC 集成,防止未授权访问
  • 带宽限速:可按代理粒度限制上传/下载速度,避免单用户占满带宽

管理功能完善

  • 服务端 Dashboard:Web 界面实时查看所有连接状态、流量统计
  • 客户端 Admin UI:本地管理代理配置,支持热重载
  • Prometheus 监控:Metrics 数据直接对接 Grafana 可视化

📥 安装与使用

frp 采用经典的 C/S 架构,需要在公网服务器部署 frps(服务端),在内网机器部署 frpc(客户端)。

快速开始

从 GitHub Release 下载对应平台的二进制文件(单文件,无需依赖):

# Linux/macOS 一键下载
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
tar -xzf frp_0.61.0_linux_amd64.tar.gz
cd frp_0.61.0_linux_amd64

服务端配置(frps.toml)

bindPort = 7000
token = "your_secure_token_here"

# 启用 Dashboard(可选)
dashboardPort = 7500
dashboardUser = "admin"
dashboardPwd = "your_strong_password"

启动服务端:

./frps -c frps.toml

客户端配置(frpc.toml)

serverAddr = "your-server-ip"
serverPort = 7000
token = "your_secure_token_here"

# SSH 穿透示例
[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22
remotePort = 6000

# Web 服务穿透示例
[[proxies]]
name = "web"
type = "http"
localPort = 8080
customDomains = ["dev.your-domain.com"]

启动客户端:

./frpc -c frpc.toml

Docker Compose 部署(推荐)

version: '3'
services:
  frps:
    image: snowdreamtech/frps:latest
    container_name: frps
    restart: always
    network_mode: host
    volumes:
      - ./frps.toml:/etc/frp/frps.toml

🚀 典型使用场景

场景一:远程 SSH 访问内网服务器

比如你把树莓派放在家里当服务器,没有公网 IP。通过 frp 把 22 端口映射到云服务器的 6000 端口:

[[proxies]]
name = "pi-ssh"
type = "tcp"
localPort = 22
remotePort = 6000

然后任何地方都能连:

ssh -p 6000 pi@your-server-ip

场景二:本地开发环境外网访问

前端开发时,Vue/React 项目跑在 localhost:3000,想让产品经理直接访问:

[[proxies]]
name = "dev-web"
type = "http"
localPort = 3000
customDomains = ["dev.your-domain.com"]

配合 nginx 反向代理 + SSL,就是一个专业的预览环境。

场景三:NAS 服务暴露

群晖、Unraid 等 NAS 的 Web 界面、文件服务暴露到公网:

[[proxies]]
name = "nas"
type = "http"
localPort = 5000
customDomains = ["nas.your-domain.com"]

场景四:P2P 大文件传输(省流量神器)

两台机器都要传大文件,走服务器中转太慢还费流量。用 xtcp 模式让两端直连:

# 服务端(有公网 IP 的那台)
[[proxies]]
name = "p2p-ssh"
type = "xtcp"
localPort = 22
secretKey = "your-secret-key"

连接时直接 P2P,延迟从 100ms 降到 20ms,服务器只负责握手,不中转数据。


⚠️ 注意事项

安全风险

  • 务必设置 token 认证,裸奔的 frp 服务端会被扫描利用
  • 生产环境建议启用 TLS 加密传输
  • Dashboard 不要暴露到公网,或设置强密码 + IP 白名单

性能考量

  • P2P 模式需要两端 NAT 类型为 Full Cone 或 Restricted Cone,Symmetric NAT 会失败
  • 高并发场景建议开启连接池(poolCount)和 TCP 多路复用(tcpMux)
  • 带宽敏感业务可开启压缩(useCompression = true)

已知限制

  • 部分运营商会封锁 80/443 等常用端口,建议用高位端口
  • UDP 穿透成功率受 NAT 类型影响,不如 TCP 稳定
  • 免费域名(如 nip.io)可能被部分企业防火墙拦截

✅ 总结

frp 把复杂的内网穿透流程封装成了几个配置文件,既保留了灵活性,又大大降低了使用门槛。105k+ Stars 的社区活跃度意味着丰富的文档、及时的 bug 修复和持续的功能迭代。

方案成本复杂度适用场景
frp 自建低(只需一台 VPS)长期使用、多服务管理
ngrok 免费版免费临时调试、快速演示
ngrok 付费版高($8/月起)企业级 SLA 需求
云服务器跳板单服务、有运维能力

适合人群:

  • 没有公网 IP 但需要远程访问内网服务的开发者
  • 需要临时暴露本地服务进行协作演示的团队
  • 想自建内网穿透服务替代商业方案的技术爱好者

总的来说,如果你需要一个稳定、免费、功能全面的内网穿透方案,frp 几乎是首选。