FRP 内网穿透:从入门到原理

FRP 内网穿透:从入门到原理

FRP 内网穿透:从入门到原理

直入主题,不绕弯子。

FRP 解决一个核心问题:你家里的电脑、NAS、树莓派没有公网 IP,外面连不进来。FRP 通过一台有公网 IP 的服务器做中转,把内网服务”踢”到公网上。

先看看有了 FRP 你能干什么:

  • 远程桌面回家 — 公司电脑连家里电脑,拿文件、跑脚本
  • SSH 远程管理 — 从外面连进内网终端
  • 用自己的机器建站 — 内网搭博客、API、演示站,省下云服务器续费
  • 远程访问 NAS — 在外面看照片、下文件
  • AI 服务挂在家里 — 本地 LLM、SD、微信机器人从外网调

架构

三句话讲清楚:

  1. 内网的 frpc 主动连到公网 frps,建立一条长连接隧道
  2. 外网用户访问 frps 的端口或域名
  3. 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.exefrpc.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 的做法:让内网机器先主动往外打一个连接,在路由器上留下映射记录,然后利用这条已有连接做双向通信。


文章版权归作者所有,未经允许请勿转载。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容