专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

93.8k Star 的内网穿透神器 frp:DIY开发者必备的反向代理

ins518 2025-06-13 13:50:39 技术文章 7 ℃ 0 评论


作为 Java 架构师,我在日常开发中经常遇到这样的场景:本地调试的 Web 服务需要临时暴露给测试同学;家里的 NAS 想在公司远程访问;或者为物联网设备提供公网接口…… 这些需求的核心,都指向一个技术痛点 ——内网穿透

在尝试过 Ngrok、花生壳等工具后,我最终选择了 GitHub 上 93.8k Star 的开源项目frp。它不仅支持 TCP、UDP、HTTP/HTTPS 全协议,还能通过 P2P 减少服务器中转开销,更关键的是完全开源,配置灵活到 “想怎么穿就怎么穿”。本文将从开发者的实用角度出发,带你从 0 到 1 掌握 frp 的核心用法。

一、为什么是 frp?内网穿透的痛点与破局

1. 内网穿透的典型场景

想象这样的场景:你在本地用 Spring Boot 写了个 API 服务(端口 8080),需要让身在异地的客户临时测试;或者你有一台放在家里的 NAS(存储照片和文档),但出差时想通过公网访问。这时候,你的设备可能处于运营商 NAT 后(没有公网 IP),或者公司 / 家庭防火墙限制了入站连接,导致公网无法直接访问。

传统解决方案有两种:

  • 申请公网 IP:成本高(部分运营商不提供),且需要动态 DNS(DDNS)维护 IP 变化;
  • 第三方穿透工具:如 Ngrok(免费版限制多)、花生壳(收费且流量贵),关键是数据经过第三方服务器,安全性存疑。

2. frp 的核心优势

frp(Fast Reverse Proxy)作为反向代理工具,通过 “服务端 + 客户端” 模式,完美解决了上述问题:

  • 完全开源:代码透明,可自行修改扩展;
  • 协议全面:支持 TCP(SSH / 数据库)、UDP(游戏联机)、HTTP/HTTPS(Web 服务);
  • 功能灵活:支持端口复用、负载均衡、P2P 直连(减少服务器流量)、加密压缩(TLS/SSL);
  • 轻量高效:服务端仅需一个二进制文件,资源占用极低(实测 1 核 1G 云服务器可支撑数百连接)。

二、快速上手:5 分钟实现本地服务公网访问

1. 准备工作

  • 一台公网服务器(云服务器即可,如阿里云 / 腾讯云),用于部署 frp 服务端(frps);
  • 本地电脑(或内网设备),用于部署 frp 客户端(frpc);
  • 从frp Releases下载对应系统的二进制包(如 Linux 选frp_0.51.3_linux_amd64.tar.gz)。

2. 服务端配置(公网服务器)



解压后,服务端核心配置文件是frps.toml。我们以最常用的 TCP 代理为例,配置一个基础服务端:

toml

# frps.toml
bindPort = 7000  # frp服务端与客户端通信的端口(必选)
vhostHTTPPort = 8080  # HTTP虚拟主机端口(可选,用于暴露Web服务)
vhostHTTPSPort = 8443  # HTTPS虚拟主机端口(可选)

启动服务端:

bash

./frps -c ./frps.toml

3. 客户端配置(本地电脑)

本地电脑解压后,修改客户端配置文件frpc.toml,目标是将本地 8080 端口的 Web 服务暴露到公网:

toml

# frpc.toml
serverAddr = "你的公网服务器IP"  # 必选,公网服务器IP
serverPort = 7000  # 必选,与服务端bindPort一致

[[proxies]]
name = "web-demo"  # 代理名称(唯一标识)
type = "http"  # 代理类型(http/https/tcp/udp/stcp等)
localIP = "127.0.0.1"  # 本地服务IP(默认本机)
localPort = 8080  # 本地服务端口(必选)
customDomains = ["web.yourdomain.com"]  # 自定义域名(需解析到公网服务器IP)

启动客户端:

bash

./frpc -c ./frpc.toml

4. 验证效果

  • 域名解析:将web.yourdomain.com的 A 记录指向公网服务器 IP;
  • 访问测试:在公网环境浏览器输入http://web.yourdomain.com:8080,应能看到本地 Web 服务的内容。

三、进阶玩法:从 HTTP 到 P2P 的全场景覆盖

frp 的强大不仅在于基础穿透,更在于对复杂场景的支持。以下是几个开发者常用的进阶功能:

1. HTTPS 代理:安全暴露生产环境服务

如果需要暴露生产环境的 Web 服务(如前端项目或 API 接口),HTTPS 是刚需。frp 支持直接配置 SSL 证书,步骤如下:

  • 准备证书:可通过 Let’s Encrypt 申请免费证书(fullchain.pem和privkey.pem),或自签名(参考 frp 文档的 TLS 配置);
  • 服务端配置
  • toml
  • # frps.toml vhostHTTPSPort = 443 # 常用HTTPS端口 tlsOnly = true # 强制使用TLS(可选)

  • 客户端配置
  • toml
  • # frpc.toml [[proxies]] name = "web-https" type = "https" localPort = 8080 customDomains = ["web.yourdomain.com"] # 若服务端已配置证书,客户端无需重复配置;否则需指定证书路径 # tlsCertFile = "./fullchain.pem" # tlsKeyFile = "./privkey.pem"

2. UDP 穿透:游戏联机与物联网设备通信

UDP 协议常用于实时通信(如游戏、视频流)。frp 的udp类型代理可直接穿透:

toml

# frpc.toml
[[proxies]]
name = "game-server"
type = "udp"
localIP = "192.168.1.100"  # 内网游戏服务器IP
localPort = 27015  # 游戏服务端口
remotePort = 27015  # 公网映射端口(需与服务端协商未被占用)

3. 安全增强:加密、压缩与访问控制

frp 提供了多层安全防护:

  • 加密:配置useEncryption = true,客户端与服务端通信加密(防中间人攻击);
  • 压缩:配置useCompression = true,减少传输流量(适合带宽有限场景);
  • HTTP 基本认证:为 HTTP 代理添加用户名密码,防止恶意访问:
  • toml
  • [[proxies]] name = "web-auth" type = "http" localPort = 8080 httpUser = "admin" # 用户名 httpPwd = "123456" # 密码

4. P2P 直连:减少服务器流量开销

传统穿透模式中,所有流量都经过公网服务器中转,当流量较大时(如视频流),服务器带宽成本会很高。frp 的stcp(Secret TCP)模式支持 P2P 直连,流量直接在客户端和访问者之间传输,仅需服务器做握手协商:

  • 被穿透方(B)配置
  • toml
  • [[proxies]] name = "secret-ssh" type = "stcp" serverName = "secret-ssh" # 与访问者协商的服务名 secretKey = "abcdefg" # 通信密钥(需与访问者一致) localPort = 22 # 本地SSH端口

  • 访问者(C)配置
  • toml
  • [[proxies]] name = "access-ssh" type = "stcp" role = "visitor" # 标记为访问者 serverName = "secret-ssh" # 与被穿透方一致 secretKey = "abcdefg" # 密钥一致 bindAddr = "127.0.0.1" # 访问者本地绑定IP bindPort = 6000 # 访问者本地端口(通过ssh -p 6000 127.0.0.1访问)

四、实战场景:开发者最常用的 3 类需求

1. 本地开发调试:替代 Ngrok 的免费方案

前端同学在开发 Vue/React 项目时,常需要将本地localhost:3000暴露给测试或客户。用 frp 的 HTTP 代理模式,只需:

  • 服务端开放 8080 端口;
  • 客户端配置customDomains为临时域名(如dev.yourdomain.com);
  • 测试人员直接访问http://dev.yourdomain.com:8080即可,无需安装任何工具。

2. 远程运维:SSH 管理内网设备

对于没有公网 IP 的内网服务器(如工厂里的工控机),可通过 frp 的 TCP 代理暴露 SSH 端口(22)。运维人员通过公网服务器 IP + 映射端口(如 6000),即可远程登录:

bash

ssh -p 6000 user@公网服务器IP

3. 家庭 NAS:随时访问私有云存储

家里的 NAS(如群晖)通常处于运营商 NAT 后,无法直接公网访问。通过 frp 将 NAS 的 5000(HTTP)和 5001(HTTPS)端口映射到公网,出差时通过
https://nas.yourdomain.com:5001即可访问私有云,数据仅经自己的服务器中转,比第三方网盘更安全。

五、避坑指南:这些问题你可能会遇到

1. 端口被运营商封禁

国内部分运营商会封禁 80、443 等常用端口。解决方法:

  • 使用非标准端口(如 8080、8443);
  • 启用 TLS 加密(部分运营商会识别流量类型,加密后更难被封)。

2. 杀毒软件误报

frp 的客户端(frpc)因涉及网络穿透,可能被部分杀毒软件误判为恶意程序。解决方案:

  • 将 frpc 添加到杀毒软件白名单;
  • 从官方 Releases 下载最新版本(避免第三方修改版)。

3. 性能优化建议

  • 连接复用:frp 默认使用 TCP 长连接复用,减少握手开销;
  • 限制流量:通过bandwidthLimit配置客户端带宽,避免占用过多服务器资源;
  • 健康检查:为 HTTP 代理配置healthCheckUrl(如/health),自动检测本地服务是否存活。

总结:frp 为什么值得开发者收藏?

作为 93.8k Star 的开源项目,frp 不仅解决了内网穿透的 “刚需”,更通过灵活的配置和丰富的功能,覆盖了从开发调试到生产环境的全场景。无论是个人开发者还是企业团队,frp 都是值得深入研究的工具 ——它让 “控制感” 回到用户手中:你可以自由选择公网服务器、自定义端口、配置加密,甚至修改源码扩展功能。

最后,建议开发者将 frp 加入工具链清单。下次遇到内网穿透需求时,不再求助于第三方工具,而是自信地掏出 frp 配置文件 —— 这或许就是技术人 “掌控感” 的最佳体现。


关注【AI 码力】,感谢支持!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表