FRP 内网穿透:从入门到原理
直入主题,不绕弯子。
FRP 解决一个核心问题:你家里的电脑、NAS、树莓派没有公网 IP,外面连不进来。FRP 通过一台有公网 IP 的服务器做中转,把内网服务”踢”到公网上。
先看看有了 FRP 你能干什么:
- 远程桌面回家 — 公司电脑连家里电脑,拿文件、跑脚本
- SSH 远程管理 — 从外面连进内网终端
- 用自己的机器建站 — 内网搭博客、API、演示站,省下云服务器续费
- 远程访问 NAS — 在外面看照片、下文件
- AI 服务挂在家里 — 本地 LLM、SD、微信机器人从外网调
架构
三句话讲清楚:
- 内网的 frpc 主动连到公网 frps,建立一条长连接隧道
- 外网用户访问 frps 的端口或域名
- frps 经隧道把请求转给 frpc,frpc 再转给本地服务
准备
- 一台有公网 IP 的云服务器(最低配置就行,几十块一年),系统 Ubuntu 22.04 或 Debian
- 你的内网电脑(Windows / Linux / macOS)
服务端设置
1. 下载 FRP
# 以 v0.68.0 为例,去 GitHub 看最新版
wget https://github.com/fatedier/frp/releases/download/v0.68.0/frp_0.68.0_linux_amd64.tar.gz
tar -xzf frp_0.68.0_linux_amd64.tar.gz
cd frp_0.68.0_linux_amd64
2. 配置 frps.toml
新版推荐 TOML 格式(旧版 INI 仍支持但已不推荐)。
bindPort = 7000 # frpc 连接端口
vhostHTTPPort = 8080 # HTTP 代理监听端口
auth.token = "你的密码" # 认证令牌,客户端需保持一致
webServer.addr = "0.0.0.0" # Dashboard 监听地址
webServer.port = 7500 # Dashboard 端口
webServer.user = "admin"
webServer.password = "admin"
bindPort— frpc 连过来用的端口vhostHTTPPort— 通过域名访问内网 Web 时才需要auth.token— 防君子不防小人,设个复杂密码webServer— 管理后台,方便看连接状态
3. 开放端口
# Ubuntu / Debian
ufw allow 7000/tcp
ufw allow 8080/tcp
ufw allow 7500/tcp
ufw reload
# 查看已开放的端口
ufw status
4. 启动服务端
./frps -c frps.toml
看到 frps started successfully 就 OK。打开 http://你的服务器IP:7500 可以看到 Dashboard。
后台运行:测试时直接跑就行。长期用建议配 systemd 或 screen / tmux。
客户端设置(内网电脑)
以 Windows 为例,Linux/macOS 同理。
1. 下载 FRP
https://github.com/fatedier/frp/releases
# 下载 windows_amd64 版本
解压后只需要 frpc.exe 和 frpc.toml。
2. 配置 frpc.toml
通用部分写在最上面,[[proxies]] 每加一段就多暴露一个服务。
通用配置:
serverAddr = "你的云服务器公网IP"
serverPort = 7000
auth.token = "你的密码"
然后按场景挑对应的 [[proxies]] 片段加到末尾:
远程桌面回家(RDP / TCP 3389)
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 6001
外网用 Windows 远程桌面连接 你的服务器IP:6001。
SSH 远程管理(TCP 22)
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
外网执行 ssh -p 6000 用户名@你的服务器IP。
用自己的机器建站(HTTP 代理)
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["www.example.com"]
域名 A 记录解析到服务器 IP,用户访问 http://www.example.com:8080。
访问 NAS / 调用本地 AI 服务
[[proxies]]
name = "nas"
type = "http"
localIP = "192.168.1.100" # 你的 NAS 内网 IP
localPort = 5000
customDomains = ["nas.example.com"]
[[proxies]]
name = "ai-api"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["ai.example.com"]
外网访问 http://nas.example.com:8080 进 NAS,http://ai.example.com:8080 调 AI 接口。
注意:
1.serverPort(客户端)必须等于服务端的bindPort
2.auth.token两端必须完全一致
3. TCP 代理的remotePort不能重复,HTTP 代理共享vhostHTTPPort不需要设remotePort
4.[[proxies]]可以写多段,一个 frpc 同时暴露多个服务
3. 启动客户端
# Windows(在 frpc.exe 所在目录)
frpc -c frpc.toml
# Linux
./frpc -c frpc.toml
看到 login to server success 就是穿透成功。
FRP 是怎么工作的?
FRP 的官方定义是反向代理:用户访问的是 frps,frps 背后把请求转给内网的 frpc,用户不知道也不关心背后是哪台机器。
核心问题:为什么没有公网 IP 的内网机器能被外网访问?
因为外网不能主动连你,但你可以主动连外网。frpc 先主动向 frps 发起一条出站 TCP 连接(NAT 允许出站),这条连接一旦建立就不断开,变成一条持久隧道。外网用户访问 frps 的端口时,frps 通过这条隧道把请求发给 frpc,frpc 再转给本地服务。响应原路返回。
几个关键技术点
控制连接 vs 工作连接
- 控制连接:一条长期维持,负责认证、心跳、代理创建。frpc 启动即建立,断连自动重连。
- 工作连接:有请求时动态创建,走实际业务流量,用完关闭。
心跳保活
frpc 默认每 30 秒向 frps 发一次心跳。frps 超过 90 秒没收到心跳就清理资源。心跳的目的是防止 NAT 路由器上的会话映射被超时关闭。
支持的协议
- TCP — 端口映射,SSH、RDP、数据库
- UDP — DNS、游戏、音视频
- HTTP / HTTPS — 域名方式访问,多个域名共享一个端口
- STCP / SUDP — 安全模式,两端都跑 frpc,公网不暴露端口
- XTCP — P2P 直连,frps 只撮合,流量不经过服务器
TLS 加密
新版 frp 默认在 frpc 和 frps 之间启用 TLS 加密。不需要的话客户端设 transport.tls.enable = false,但生产环境不建议关。
NAT 原理速览
NAT 是你家路由器干的事:内网多台设备共用一个公网 IP。设备对外发包时,路由器换掉内网 IP 和端口,记下映射关系,回包才能找到正确的设备。但外网主动发起的包,路由器没有映射记录,直接丢弃。
FRP 的做法:让内网机器先主动往外打一个连接,在路由器上留下映射记录,然后利用这条已有连接做双向通信。
文章版权归作者所有,未经允许请勿转载。












暂无评论内容