文章

frp内网穿透使用说明

frp内网穿透使用说明

frp内网穿透使用说明

本文介绍 frp(Fast Reverse Proxy)的内网穿透原理、组件分工与典型部署流程,涵盖 TCP(SSH)HTTP 域名访问 示例。配置语法以常见 INI 写法为主(与社区教程一致);新版本亦支持 TOML,完整参数以 frp 官方文档 为准。


1. frp 简介

1.1 是什么

frp 是一款开源的高性能反向代理应用,专注于内网穿透:将位于 NAT、防火墙或私网中的服务,通过一台具有公网 IP 的中转节点安全、可控地暴露到互联网。

官方定位(摘自 README_zh.md):

  • 支持 TCP、UDP、HTTP、HTTPS 等多种协议,并支持 P2P 等能力;
  • 客户端与服务器之间可经 TCP、QUIC、KCP、WebSocket 等传输;
  • 可在单连接上复用多路请求,支持端口复用、负载均衡、插件扩展与 Web 管理界面。

1.2 典型场景

场景说明
远程 SSH/RDP外网通过 VPS 端口访问内网主机
内网 Web 对外192.168.x.x:8080 以域名或端口形式暴露
NAS / 监控 / 管理后台无公网 IP 的家庭或机房设备供外网访问
开发联调临时把本机 localhost:3000 映射给同事或回调地址
多服务统一入口一台 VPS 上 frps,多台内网机器各自 frpc

1.3 相关链接

资源链接
GitHub 仓库https://github.com/fatedier/frp
中文 READMEhttps://github.com/fatedier/frp/blob/dev/README_zh.md
官方文档https://gofrp.org
Release 下载https://github.com/fatedier/frp/releases
社区实践(HTTP/SSH 配置)腾讯云开发者社区 · 用 frps 实现内网穿透

1.4 与其他方案对比(简要)

方式特点
frp(自建 frps)可控、成本低,需自运维 VPS 与安全
Cloudflare Tunnel可不买 VPS,适合 Web/HTTPS
ngrok / 花生壳等 SaaS开箱即用,按量或订阅
路由器端口映射需运营商真公网 IP,家宽常不可用

2. frp 组成

frp 由服务端客户端两部分组成,需成对部署:

1
2
3
4
5
6
7
8
9
┌─────────────────────────────────────────────────────────────┐
│                      frp 组成与角色                           │
├─────────────────────────────────────────────────────────────┤
│  公网 VPS / 云服务器                                          │
│    frps(Server)← 监听公网端口,接收外网连接,管理隧道          │
│         ↑ 主动连接(出站)                                    │
│  内网服务器 / PC / NAS                                        │
│    frpc(Client)→ 连接 frps,注册本地服务端口映射              │
└─────────────────────────────────────────────────────────────┘
组件部署位置作用
frps公网 IP 的 VPS接受 frpc 连接;将外网流量按规则转发到对应隧道
frpc内网机器主动连接 frps;把 local_ip:local_port 映射到公网端口或域名

要点:内网侧通常不需要公网 IP,也不必改路由器端口映射——由 frpc 主动连出到 frps 建立隧道。

解压 Release 后常见文件:

文件说明
frps / frps.exe服务端程序
frpc / frpc.exe客户端程序
frps.ini / frpc.ini配置模板(INI)
frps.toml / frpc.toml配置模板(TOML,新版本)

3. 内网穿透整体流程

内网 Web 通过子域名 test.example.com 对外提供访问 为例:

1
2
3
4
5
6
7
用户浏览器  https://test.example.com
      ↓ DNS:A 记录 → VPS 公网 IP(如 47.96.x.x)
  VPS 上的 frps(vhost_http_port = 80 / 443)
      ↓ 按 Host: test.example.com 匹配代理
  frpc 与 frps 之间的隧道(frpc 主动维持)
      ↓
  内网 Web 服务(127.0.0.1:8080)

3.1 前置条件

项目说明
VPS带公网 IP,安装 frps,安全组放行相应端口
内网机器安装 frpc,能访问 VPS 公网 IP
域名(HTTP 按域名访问时)已注册根域名;子域名 A 记录 指向 VPS IP(非内网 IP)
本地服务Web/SSH 等已在本机监听目标端口

3.2 子域名与 IP 的关系

购买根域名 example.com 后,可在 DNS 控制台自行添加子域名(如 test.example.comwww.example.com),一般无需为每个子域名单独付费

记录类型示例含义
Atest47.96.x.x子域名解析到 VPS 公网 IPv4
CNAMEtest → 其他域名别名指向另一域名

内网穿透场景下:域名始终解析到 frps 所在 VPS;frpc 再将流量转入内网私网地址。

3.3 端口与安全组(参考)

端口用途
7000(可改)frpc 连接 frps 的控制通道
80 / 443HTTP/HTTPS 对外访问(vhost_http_port / HTTPS)
6000 等TCP 映射时 frps 对外暴露的 remote_port

生产环境务必配置 token 等鉴权,控制通道端口避免对全网裸奔;对外 Web 建议 HTTPS 与应用层鉴权。


4. 部署与应用示例

以下示例假设:

  • VPS 公网 IP:47.96.123.45
  • frps / frpc 共用 token:your_secure_token
  • 内网 Web:127.0.0.1:8080
  • 对外域名:test.example.com(DNS 已 A 记录到 VPS)

软件可从 Releases 下载,Linux 解压至 /usr/local/frp,Windows 可置于 C:\frp

4.1 示例一:TCP 映射(SSH 远程登录)

场景:外网通过 47.96.123.45:6000 访问内网 22 端口 SSH。

VPS — frps.ini

1
2
3
[common]
bind_port = 7000
token = your_secure_token

内网 — frpc.ini

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 47.96.123.45
server_port = 7000
token = your_secure_token

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

启动:

1
2
3
4
5
# VPS
cd /usr/local/frp && ./frps -c frps.ini

# 内网
cd /usr/local/frp && ./frpc -c frpc.ini

访问:

1
ssh -p 6000 user@47.96.123.45

Windows 客户端同理使用 frpc.exe -c frpc.ini

4.2 示例二:HTTP + 自定义域名(内网 Web)

场景:浏览器访问 http://test.example.com → 内网 8080

步骤 1:DNS

主机记录类型记录值
testA47.96.123.45

步骤 2:VPS — frps.ini

1
2
3
4
[common]
bind_port = 7000
vhost_http_port = 80
token = your_secure_token

若 VPS 上 80 已被占用,可改为 8080,访问时需带端口 http://test.example.com:8080

步骤 3:内网 — frpc.ini

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 47.96.123.45
server_port = 7000
token = your_secure_token

[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = test.example.com

说明(参见 腾讯云社区文章):

  • type = http:按 HTTP 虚拟主机转发;
  • custom_domains:与请求头 Host 匹配,须与 DNS 子域名一致;
  • 亦可用 subdomain = test(需 frps 配置 subdomain_host = example.com),效果类似 test.example.com

步骤 4:启动与验证

1
2
3
4
5
6
7
8
# VPS
./frps -c frps.ini

# 内网
./frpc -c frpc.ini

# 内网自检
curl http://127.0.0.1:8080

浏览器访问:http://test.example.com

4.3 示例三:--replace 与多服务(概念)

同一 VPS 上 frps 可通过不同 custom_domains 或不同 remote_port 暴露多个内网服务,例如:

子域名 / 端口内网目标
app.example.com127.0.0.1:3000
api.example.com127.0.0.1:8080
VPS :6000内网 SSH :22

每条映射在 frpc.ini 中增加一个 [section] 即可。

4.4 systemd 常驻(Linux 建议)

/etc/systemd/system/frps.service(VPS):

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=frp server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
Restart=on-failure

[Install]
WantedBy=multi-user.target

内网 frpc.service 同理,将 frps 换为 frpc。启用:

1
2
sudo systemctl daemon-reload
sudo systemctl enable --now frps   # 或 frpc

5. 其他补充

5.1 HTTPS

生产环境建议在 VPS 上为 test.example.com 配置 TLS

  • 使用 Nginx / Caddy 终结 HTTPS 并反代到 frp 或内网端口;或
  • gofrp.org 文档配置 frp 的 HTTPS / 证书插件。

Let’s Encrypt 申请证书前,需确保域名已解析到 VPS 且 80/443 可从公网访问。

5.2 常见问题

现象可能原因处理建议
frpc 连不上 frps安全组未放行 7000;token 不一致检查防火墙与两端 [common] 配置
域名无法访问DNS 未生效;未放行 80/443nslookup test.example.com;查云厂商安全组
502 / 连接被拒绝frpc 未运行;本地端口错误确认 local_portcurl 本机访问
Host 不匹配custom_domains 与浏览器地址不一致域名大小写不敏感,但须完全一致
已有 Web 占 80vhost_http_port 冲突vhost_http_port 或调整现有 Nginx 与 frp 分工

5.3 安全建议

  1. 强 token,定期轮换;控制端口限制来源 IP(若可行)。
  2. 管理面板(如 frps dashboard勿对公网开放,或加 IP 白名单。
  3. 穿透等于扩大攻击面:SSH 用密钥登录、Web 做认证,避免裸奔管理口。
  4. frpc 进程需常驻(systemd / 计划任务),否则隧道断开外网即不可达。
  5. 流量经 VPS 中转,带宽与延迟受 VPS 规格与线路影响。

5.4 配置格式说明

社区教程(含 腾讯云此文)多使用 INIfrps.ini / frpc.ini)。较新版本同时提供 TOML 配置,字段名略有差异(如 vhost_http_portvhostHTTPPort),升级或复制配置时请对照当前版本的 官方文档 与 Release 附带的 *_full.ini / *.toml 示例。


6. 小结

步骤动作
1准备 VPS(frps) + 内网机器(frpc)
2下载 frp,配置 tokenbind_port
3TCP 场景:配置 remote_port;HTTP 场景:配置 DNS + vhost_http_port + custom_domains
4启动 frps → 启动 frpc → 外网验证
5生产补充 HTTPSsystemd 常驻安全加固

一句话frps 在公网接客,frpc 在内网连出去注册服务;域名通过 DNS 指向 VPS,由 frp 按域名或端口把流量送进内网。

本文由作者按照 CC BY 4.0 进行授权