网站首页 > 技术文章 正文
作为 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 码力】,感谢支持!
- 上一篇: Nginx正向代理、反向代理、负载均衡及性能优化
- 下一篇: Vue炼金术:解锁前端开发的进阶之道
猜你喜欢
- 2025-06-13 Linux 上利用Nginx代理uWSGI处理Flask web应用
- 2025-06-13 如何隐藏代理器服务地址?企业级IP匿名化与反追踪技术
- 2025-06-13 宝塔面板使用Nginx反向代理解决跨域问题
- 2025-06-13 海尔集团武汉中心总经理孙梁君——以智慧家电 升级品质生活
- 2025-06-13 给小白的 Nginx 10分钟入门指南(nginx入门教程)
- 2025-06-13 反向代理以及其使用场景(反向代理啥意思)
- 2025-06-13 Vue炼金术:解锁前端开发的进阶之道
- 2025-06-13 Nginx正向代理、反向代理、负载均衡及性能优化
- 2025-06-13 深入理解跨域及常见误区揭秘(深入理解跨域及常见误区揭秘论文)
- 2025-06-13 Nginx反向代理配置案例(4大常见配置案例)
你 发表评论:
欢迎- 518℃Oracle分析函数之Lag和Lead()使用
- 517℃几个Oracle空值处理函数 oracle处理null值的函数
- 511℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 502℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 496℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 488℃【数据统计分析】详解Oracle分组函数之CUBE
- 469℃Oracle有哪些常见的函数? oracle中常用的函数
- 467℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)