Skip to content

快速开始

从拿到二进制到打通第一条隧道,大约 5 分钟。全程只需要三样东西:

  1. 一台有公网 IP 的服务器(信令服务器,租的 VPS 即可)
  2. 房主电脑(跑游戏/服务的那台)
  3. 访客电脑(朋友那台)

第 1 步:部署信令服务器

在公网服务器上执行:

bash
# 构建(首次较慢)
cargo build --release

# 启动信令服务器
./target/release/frp-sh serve --addr 0.0.0.0:8080 --relay-addr 0.0.0.0:8081

启动后三个服务同时就绪:

  • HTTP REST(8080/tcp):房间注册与查询
  • UDP 公网探测(8080/udp):客户端学习自己的公网地址
  • TCP 中继(8081/tcp):打洞失败时的数据转发通道

记得在云厂商安全组和系统防火墙放行 8080/tcp8080/udp8081/tcp

服务器端也可以直接用打包好的二进制,见部署信令服务器的 systemd 方式。

第 2 步:配置客户端

房主和访客都需要一份指向该服务器的配置(默认配置指向 127.0.0.1,仅本机联调可用):

toml
# config/server.toml
signaling_addr = "http://你的服务器IP:8080"   # HTTP 信令
relay_addr     = "你的服务器IP:8081"          # TCP 中继

通过 --config 指定:

bash
frp-sh --config config/server.toml game create

第 3 步:房主创建房间

在运行游戏/服务的那台机器上:

bash
frp-sh game create --service 127.0.0.1:25565

其中 --service 是房主本地服务的地址(默认 127.0.0.1:25565,这是 Minecraft 的默认端口,可通过 --service 改成任意端口)。输出示例:

text
  Room created : game-a3f9c2
  Signaling    : http://你的服务器IP:8080
  Your ID      : 123e4567-e89b-12d3-a456-426614174000
  Local service: 127.0.0.1:25565
  Waiting for a guest to join ...

game-a3f9c2 发给朋友。

第 4 步:访客加入

在朋友机器上:

bash
frp-sh game join game-a3f9c2 --listen 127.0.0.1:25565

--listen 是访客本地要监听的端口(默认 127.0.0.1:25565)。输出示例:

text
  Joined room : game-a3f9c2
  Host address: 你的服务器IP:xxx
  Local listen: 127.0.0.1:25565
  Punching through NAT ...

>>> P2P direct link established with 你的服务器IP:xxx   ← 打洞成功!

此时朋友连接自己电脑的 127.0.0.1:25565,流量即到达房主的 127.0.0.1:25565

如果打洞失败,会自动回退:

text
>>> UDP hole punching failed, falling back to relay ...
>>> relay connected, waiting for host ...

隧道依然可用,只是数据经过服务器转发(见网络原理)。

断线后(网络抖动、NAT 映射过期)双方都会自动重连:

text
>>> 连接已断开,2 秒后自动重连(Ctrl-C 退出)...

无需手动干预,重连间隔按 2s、4s、8s…退避,上限 15s。

最小可用命令

角色最小命令说明
房主frp-sh game create所有参数均有默认值
访客frp-sh game join game-xxxxxx只需房间号
服务器frp-sh serve监听 0.0.0.0:8080/8081

下一步

frp-sh · 社交化 P2P 打洞工具