FRP 内网穿透全解析:让内网服务安全暴露到公网

1 阅读5分钟

🌐 FRP 内网穿透全解析:让内网服务安全暴露到公网

摘要:在 IPv4 地址枯竭与运营商级 NAT(CGNAT)普及的今天,绝大多数家庭和中小企业网络已无法获得公网 IP。这使得远程访问内网服务(如 NAS、开发环境、家庭摄像头)变得异常困难。FRP(Fast Reverse Proxy) 作为一款开源、高性能、跨平台的反向代理工具,通过“内网主动连接 + 公网中转”模式,完美解决了这一难题。本文将深入剖析 FRP 的工作原理、核心功能、安全机制,并提供完整部署指南与实战案例。


一、为什么需要 FRP?——内网穿透的现实困境

1.1 家庭网络的“双重隔离”

  • NAT(网络地址转换):路由器将多个内网设备共享一个公网 IP。
  • CGNAT(运营商级 NAT):运营商进一步将成千上万个用户复用少量公网 IP(如 100.64.x.x)。

→ 结果:外网无法主动连接你的任何设备,即使你在路由器设置了端口转发也无效。

1.2 传统方案的局限

方案缺陷
花生壳等商业工具免费版限速、限流量、广告多
IPv6部分运营商限制跨网访问,老旧设备不支持
申请公网 IP电信部分地区可行,移动/联通基本无望

FRP 的价值:只需一台廉价云服务器(月付 ¥10~30),即可实现完全自主可控、无厂商绑定、高带宽低延迟的内网穿透。


二、FRP 是什么?——架构与核心组件

FRP 采用 C/S(客户端/服务端)架构,由两个核心程序组成:

组件运行位置功能
frps(Server)公网服务器(如阿里云 ECS)接收外网请求,转发给内网客户端
frpc(Client)内网设备(PC/NAS/树莓派)主动连接 frps,注册本地服务

🔁 数据流向
外网用户 → frps(公网) → frpc(内网) → 本地服务(如 Web、SSH、自定义程序)


三、FRP 如何工作?——穿透原理详解

3.1 核心思想:反向连接 + 隧道复用

  1. 内网主动出站:frpc 启动后,主动连接 frps 的 bind_port(如 7000),建立持久 TCP 长连接(控制通道)。
  2. 服务注册:frpc 告知 frps:“我能代理 127.0.0.1:8080 的 HTTP 服务”。
  3. 外网请求到达:用户访问 http://your-domain.com,DNS 解析到 frps 服务器。
  4. 智能路由:frps 根据 HTTP 请求头中的 Host 字段,找到对应的 frpc。
  5. 数据透传:frps 通过已有控制通道通知 frpc,双方建立数据通道,后续流量双向转发。
sequenceDiagram
    participant User as 外网用户
    participant FRPS as 公网服务器 (frps)
    participant FRPC as 内网设备 (frpc)
    participant App as 本地服务 (8080)

    FRPC->>FRPS: 主动连接,注册服务
    User->>FRPS: GET http://display.myfamily.com
    FRPS->>FRPC: “有新请求,请准备”
    FRPC->>App: 转发请求
    App-->>FRPC: 返回响应
    FRPC-->>FRPS: 转发响应
    FRPS-->>User: 返回最终结果

3.2 支持的协议类型

协议用途特点
TCP/UDP通用端口映射透明透传,适用于任意应用
HTTP/HTTPSWeb 服务支持域名虚拟主机、自动 Host 头处理
STCP/SUDP安全点对点无公网端口暴露,需双方 frpc
XTCPP2P 直连成功打洞后绕过服务器,节省带宽

四、快速上手:部署 FRP 实战

4.1 准备工作

  • 一台 Linux 公网服务器(推荐 Ubuntu/CentOS,最低 1核1G)
  • 一台 内网设备(Windows/Linux/macOS/树莓派)
  • 域名(可选,但 HTTP 模式必需)

4.2 部署 FRPS(服务端)

# 下载最新版(以 v0.62.0 为例)
wget https://github.com/fatedier/frp/releases/download/v0.62.0/frp_0.62.0_linux_amd64.tar.gz
tar -xzf frp_*.tar.gz && cd frp_*

# 编辑 frps.toml
cat > frps.toml <<EOF
[common]
bindPort = 7000          # 控制通道端口
vhostHttpPort = 8080     # HTTP 服务入口(关键!)
token = your_strong_token # 认证密钥
dashboardAddr = 0.0.0.0
dashboardPort = 7500
dashboardUser = admin
dashboardPassword = secure_password
EOF

# 启动(建议用 systemd 管理)
./frps -c ./frps.toml

4.3 配置 FRPC(客户端)

# frpc.toml
[common]
serverAddr = 203.0.113.10   # frps 服务器公网 IP
serverPort = 7000
token = your_strong_token

[[proxies]]
name = "family_display"
type = "http"
localPort = 8080
customDomains = ["display.myfamily.com"]  # 必须 DNS 解析到 frps IP

4.4 配置 DNS

在域名管理后台添加 A 记录:

display.myfamily.com → 203.0.113.10

4.5 启动并测试

# 启动 frpc
./frpc -c ./frpc.toml

# 外网访问
curl http://display.myfamily.com:8080
# 或浏览器打开 http://display.myfamily.com:8080

五、安全加固:避免成为“肉鸡”

FRP 强大,但配置不当会带来严重风险。务必做到:

✅ 必做安全措施

  1. 启用 Token 认证:防止未授权 frpc 接入。
  2. 限制端口范围(frps.toml):
allowPorts = [{ start = 50000, end = 60000 }]
  1. 启用 TLS 加密
[common]
tlsEnable = true
  1. 不要暴露敏感服务:如 SSH(22)、RDP(3389)、数据库(3306)。
  2. 使用 STCP 保护私密服务:家人间通信无需公网端口。

❌ 高危行为(绝对禁止)

  • token = 123456(弱密码)
  • allowPorts = all(开放所有端口)
  • 暴露路由器管理页(192.168.1.1:80

六、典型应用场景

场景配置要点协议
远程桌面映射 3389 (Windows) / 5900 (VNC)TCP
家庭 NAS 访问映射群晖 DSM 5000 端口HTTP
开发环境联调暴露本地 Vue/React 项目HTTP
IoT 设备管理自定义 TCP 协议上报状态TCP
家庭信息屏自研 Web 服务接收图片/留言HTTP
安全文件共享STCP 模式点对点传输STCP

七、高级技巧与优化

7.1 使用 Nginx 反向代理(隐藏端口)

server {
    listen 80;
    server_name display.myfamily.com;
    location / {
        proxy_pass http://127.0.0.1:8080;  # 转发给 frps 的 vhostHttpPort
    }
}

→ 用户访问 http://display.myfamily.com(无端口)

7.2 启用 HTTPS(Let's Encrypt)

certbot --nginx -d display.myfamily.com

→ 自动获取免费 SSL 证书,实现 https://

7.3 多设备管理

为每个显示器分配独立子域名:

  • livingroom.display.myfamily.com
  • kitchen.display.myfamily.com

八、总结:FRP 的核心价值

  • 简单:配置即用,无需复杂网络知识。
  • 灵活:支持 TCP/HTTP/STCP 等多种协议。
  • 安全:Token 认证、TLS 加密、端口限制。
  • 免费开源:无厂商锁定,社区活跃(GitHub 40k+ stars)。
  • 轻量高效:Go 语言编写,资源占用极低。

FRP 不是万能的,但它是解决“内网服务公网可达”问题最优雅的通用方案之一


附录:资源链接


作者注:本文基于 FRP v0.62.0 撰写,适用于 2026 年主流使用场景。技术日新月异,建议始终参考官方最新文档。