[每周一更]-(第139期):从FRP认识内网穿透及反向代理
文章目录
- **一、FRP的核心功能与实战应用**
- **1. 远程访问场景**
- **2. Web服务暴露**
- Web服务访问实际案例:
- **3. 物联网与设备管理**
- **4. 高级功能**
- **二、FRP性能优化与安全加固**
- **三、同类工具对比与选型建议**
- **四、总结与选型建议**
- **特殊场景解决方案**
- **1. 跨国低延迟穿透**
- **2. 大规模IoT设备管理**
- **3. 企业级零信任网络**
- 五、内网穿透**核心工具**分类
该文章一直挂在TODO目录很久了,因为日常用远程桌面内网穿透场景比较多,但是毕竟不仅仅只有这个功能,今天就展开讲一讲,有需要的朋友可以参考,我所写的文章基本都是实战派,或者就是自己有使用场景,还是有参考价值,也欢迎大家来相互沟通。
因为内网穿透一直用的工具是FRP,今天从FRP来讲解。
一、FRP的核心功能与实战应用
- 核心能力:
- 支持TCP/UDP/HTTP/HTTPS全协议,配置文件驱动。
- 自建服务器完全可控,适合企业级定制需求。
FRP(Fast Reverse Proxy)是一款基于反向代理的内网穿透工具,通过公网服务器将内网服务暴露到外网,支持TCP、UDP、HTTP、HTTPS等多种协议。以下是其典型应用场景及实战配置方法:
使用FRP,需要有一台有公网IP的云服务器,其上运行frps服务,客户端也就是受控的电脑,需要启动frpc服务,才能进行后续操作。
外部请求地址(80/443等) ------>|服务器frps内部有监听端口、外部监听端口(80/443等)|—转发—>客户端frpc(客户端web应用等)
示意图如下:(在线预览:https://mermaid.live/edit)
1. 远程访问场景
-
远程桌面(RDP/VNC)
通过FRP将内网Windows的3389端口或Linux的VNC服务映射到公网,实现外网远程控制。
配置示例:[rdp] type = tcp local_port = 3389 remote_port = 7000 # 远程桌面配置,采用tcp协议,也可以采用udp协议,毕竟传输快,下边延伸下TCP和UDP的对比 客户端:(frpc需要启动) [common] server_addr = 公网IP server_port = 8083 [udp] type = tcp local_ip = 0.0.0.0 local_port = 3389 remote_port = 8084 服务端:(frps需要启动) [common] bind_addr = 0.0.0.0 bind_port = 8083
优化建议:启用
kcp
协议降低延迟,或使用stcp
模式通过密钥验证访问端,增强安全性。协议对比 TCP UDP 连接性 面向连接(发送数据前使用三次握手建立连接) 无连接(发送数据前不需要建立连接) 可靠性 可靠(丢包会自动重传) 不可靠(不会) 有序性 有序(消息在传输过程中可能会乱序,后发送的消息可能会先到达,会对其进行重新排序) 无序( 不会) 有界性 有界(通过字节流传输) 无界(每一个包都是单独的) 拥塞控制 有(流量控制是基于滑窗协议实现的) 无(没有) 传输速度 慢(需要建立连接、保证可靠性和有序性,所以比较耗时) 快(视频流、广播电视、在线多媒体游戏等) 量级 重量级(建立连接、保证可靠性和有序性,就会传输更多的信息) 轻量级 头部大小 大( 头部需要 20 字节) 小(头部只要 8 个字节) -
SSH访问内网服务器
将内网Linux的22端口映射到公网,支持安全运维。
配置示例:[ssh] type = tcp local_port = 22 remote_port = 6000
安全加固:结合SSH密钥登录,禁用密码认证。
2. Web服务暴露
-
本地开发环境临时公开
将本地Web服务(如Laravel或Django)暴露到公网,方便测试或演示。
配置示例:[web] type = http local_port = 3000 custom_domains = dev.example.com
进阶用法:启用HTTPS(服务端配置SSL证书)、多域名复用同一端口。
-
内网NAS/私有云穿透
外网访问家庭NAS或Nextcloud私有云。
配置示例:
[nas] type = http local_port = 5000 custom_domains = nas.example.com
优化建议:限制IP访问或启用HTTP Basic Auth。
Web服务访问实际案例:
配置如果只在客户端这么配置,会报错:[web] start error: type [http] not supported when vhost http port is not set
1.服务端和客户端完整配置文件
服务器端完整配置:
[common]
bind_addr = 0.0.0.0
bind_port = 8083
# 添加这一行,设置HTTP虚拟主机端口*
vhost_http_port = 8085
客户端完整配置:(同时远程桌面和Web服务)
[common]
server_addr = 公网IP
server_port = 8083
[udp]
type = tcp
local_ip = 0.0.0.0
local_port = 3389
remote_port = 8084
[web]
type = http
local_port = 8085
custom_domains = dev.example.cn
2.配置web服务器
apache配置:(实际运行服务)
<VirtualHost *:80>
ServerName dev.example.cn
ProxyRequests Off
ProxyPreserveHost On
# 转发所有请求
ProxyPass / http://localhost:8085/
ProxyPassReverse / http://localhost:8085/
ErrorLog logs/proxy-error.log
CustomLog logs/proxy-access.log combined
</VirtualHost>
linux 配置:(可参考)
server {
listen 80;
server_name dev.example.com; # 替换为您的域名或使用 localhost
# 日志配置
access_log /var/log/nginx/proxy_access.log;
error_log /var/log/nginx/proxy_error.log;
# 转发特定路径
location /update_unionid {
proxy_pass http://localhost:8085/api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 或者转发所有请求
# location / {
# proxy_pass http://localhost:8085;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# }
}
3.域名解析也不能忘记
4.客户端和服务器服务启动日志:
- 服务端:
2025/04/08 18:09:01 [I] [http.go:110] [4bbdffd4acdff7e5] [web] http proxy listen for host [dev.example.com] location [] group [], routeByHTTPUser []
2025/04/08 18:09:01 [I] [control.go:500] [4bbdffd4acdff7e5] new proxy [web] type [http] success
- 客户端监听标识:
2025/04/08 18:09:01 [I] [control.go:172] [4bbdffd4acdff7e5] [web] start proxy success
3. 物联网与设备管理
-
智能家居控制面板
将Home Assistant等内网服务映射到外网,支持远程控制。
配置示例:[home-assistant] type = http local_port = 8123 custom_domains = home.example.com
安全建议:启用TLS加密通信。
-
摄像头/监控流媒体穿透
外网访问内网RTSP/RTMP视频流。
配置示例:[camera] type = tcp local_port = 554 remote_port = 7003
注意:视频流需高带宽服务器,建议开启
kcp
协议。
4. 高级功能
-
多级代理与负载均衡
通过多个FRP节点实现流量分流或高可用架构。
配置示例:[common] server_addr = server1,server2 server_port = 7000
-
透明代理与端口复用
单端口代理多服务(如HTTP+HTTPS)。
配置示例:[http-proxy] type = tcp plugin = http_proxy remote_port = 7006
二、FRP性能优化与安全加固
-
性能提升
- 启用
kcp
协议减少丢包(配置protocol = kcp
)。 - 使用高带宽云服务器(推荐阿里云、腾讯云),静态资源通过CDN分发。
- 启用
-
安全防护
-
启用
privilege_token
和服务端密码,限制未授权访问。 -
流量加密:
- 强制TLS:FRP启用
tls_enable = true
- 强制TLS:FRP启用
-
配置
allow_ports
限制代理端口范围,避免端口滥用。# frps.ini 服务端限制端口 allow_ports = 6000-7000,80,443
-
三、同类工具对比与选型建议
工具 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
FRP | 开源、协议全面、高度可控 | 配置复杂、需自建服务器 | 开发调试、自定义需求 |
NPS | 可视化界面、配置简单 | 功能较基础 | 轻量化穿透、远程办公 |
花生壳 | 易用性高、动态域名解析 | 免费版带宽受限、安全性风险 | 家庭用户、快速部署 |
P2Link | P2P直连、低延迟、安全性高 | 功能较少、依赖服务稳定性 | 实时控制、视频会议 |
ZeroTier | 虚拟局域网、跨平台直连 | 依赖网络架构、需客户端安装 | 跨网络设备通信、IoT管理 |
性能对比(HTTP协议):
- FRP:延迟104ms,吞吐13MB/s,稳定性高。
- NPS:延迟390ms,吞吐2.95MB/s,稳定性较低。
- P2Link:低延迟但依赖两端网络穿透成功率。
四、总结与选型建议
- FRP优势:适合技术用户,需灵活协议支持和高可控性场景(如企业级服务穿透)。
- Web服务为主:也可以选:Cloudflare Tunnel(免运维)或 Ngrok(快速测试)
- 替代方案:
- 非技术用户可选向日葵或花生壳,牺牲部分性能换取易用性。
- 实时性要求高(如游戏联机)优先P2Link或ZeroTier。
通过合理配置FRP并结合优化策略(如动静分离、CDN加速),可显著提升穿透服务的性能与安全性。若需完整代码示例或高级功能文档,可参考FRP官方文档。
特殊场景解决方案
1. 跨国低延迟穿透
- 组合方案:
- 国内FRP节点(阿里云) + 海外Cloudflare CDN
- 使用Anycast IP(如Cloudflare Tunnel)优化路由
2. 大规模IoT设备管理
-
架构设计:
- 每个区域部署FRP中转,通过NATS实现消息总线
3. 企业级零信任网络
- 组件集成:
- Tailscale + 自建DERP中继服务器
- 结合OAuth 2.0实现员工权限分级
五、内网穿透核心工具分类
类型 | 代表工具 | 核心原理 | 适用场景 |
---|---|---|---|
反向代理 | FRP、NPS、Ngrok | 公网服务器中转流量 | Web服务、远程桌面、SSH |
虚拟局域网 | ZeroTier、Tailscale | 创建加密虚拟网络直连设备 | 跨网络组网、IoT设备管理 |
P2P穿透 | P2Link、NATAPP | NAT穿透技术点对点直连 | 低延迟实时通信、游戏联机 |
商业集成 | 向日葵、花生壳 | 厂商服务器中转+客户端集成功能 | 非技术用户快速部署 |
云服务集成 | Cloudflare Tunnel | 基于云服务商基础设施穿透 | Web服务暴露、无需公网服务器 |
- 个人开发者:优先选择FRP + Cloudflare Tunnel组合,平衡灵活性与成本。
- 企业用户:采用Tailscale建立零信任网络,关键服务通过FRP做灾备穿透。
- 物联网项目:使用P2Link实现设备直连,结合MQTT协议降低带宽消耗。