作者之前没折腾过frp, 借助AI花了一下午搭建好了, 在此记录下关键信息 ^0^
1. 需求场景
我拥有两台电脑(A 和 B),均连接家中同一 Wi-Fi 热点,可通过 IPv6 地址 + SSH 互相访问。但当用户离开局域网后,无法从外网连接家中的 macOS(电脑 B) ,提示 Connection timed out。
核心问题分析:
- 家中 macOS 使用的是 本地链路 IPv6 地址(如
fe80::...)或唯一本地地址(ULA,如fdxx::...) ,这类地址 仅限局域网内通信,无法被公网路由。 - 即使 ISP 分配了公网 IPv6 前缀,家庭路由器通常默认阻止外网主动入站连接(安全策略)。
- 用户无公网 IPv4,且不希望/无法修改路由器端口转发规则。
✅ 目标 :实现 从任意外网位置,安全、稳定地 SSH 登录家中的 macOS 设备。
2. 解决思路与选型
可选方案对比:
| 方案 | 优点 | 缺点 | 适用性 |
|---|---|---|---|
| 公网 IPv6 + 开放防火墙 | 直连,延迟低 | 需路由器支持 IPv6 端口控制,安全风险高 | 低(家用路由器支持差) |
| SSH 反向隧道 | 无需额外工具 | 需公网服务器,配置较繁琐 | 中 |
| Tailscale / ZeroTier | 零配置、加密 | 依赖第三方服务,自建复杂 | 中高 |
| frp(Fast Reverse Proxy) | 开源、轻量、跨平台、支持 TCP/UDP、配置灵活 | 需一台公网服务器(VPS) | ✅ 推荐 |
最终选型:frp
- 原理:客户端(frpc)主动连接公网服务器(frps),建立反向代理隧道。
- 优势 :
- 无需公网 IP,仅需一台 VPS(可低至 $3/月)。
- 支持 macOS(Intel / Apple Silicon)。
- 配置简单,支持 Token 认证,安全性高。
- 可代理任意 TCP/UDP 服务(SSH、Web、RDP 等)。
3. frp 解决步骤
环境:
- 公网服务器(VPS):Ubuntu 22.04,公网 IP
203.0.113.10(举例)- 客户端(Mac):macOS Sonoma,Apple Silicon(M1/M2/M3)
步骤 1:在 VPS 上部署 frps(服务端)
bash
# 下载 frp(Linux 64 位)
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
tar -zxvf frp_0.65.0_linux_amd64.tar.gz
cd frp_0.65.0_linux_amd64
创建配置文件 frps.toml(TOML 格式,v0.50+):
toml
[common]
bind_port = 7000
token = "your_strong_secret_token_32_chars"
启动服务:
bash
./frps -c ./frps.toml
🔒 防火墙 :开放
7000(frp 控制)和6000(SSH 隧道)端口。
步骤 2:在 macOS 上部署 frpc(客户端)
2.1 下载 frp(Apple Silicon 示例)
bash
mkdir -p ~/frp && cd ~/frp
curl -LO https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_darwin_arm64.tar.gz
tar -zxvf frp_0.65.0_darwin_arm64.tar.gz
🔍 Intel Mac 用户请下载
darwin_amd64版本。
2.2 配置 frpc.toml
toml
[common]
server_addr = "203.0.113.10" # VPS 公网 IP
server_port = 7000
token = "your_strong_secret_token_32_chars"
[ssh]
type = tcp
local_ip = "127.0.0.1"
local_port = 22 # macOS SSH 端口
remote_port = 6000 # VPS 对外暴露端口
2.3 开启 macOS SSH 服务
- 系统设置 > 通用 > 共享 > 勾选"远程登录"
- 确认当前用户在允许列表中
2.4 启动 frpc(临时测试)
bash
cd ~/frp/frp_0.65.0_darwin_arm64
./frpc -c ~/frp/frpc.toml
看到 start proxy success 即表示隧道建立成功。
步骤 3:外网访问验证
从任意外网设备执行:
bash
ssh -p 6000 你的Mac用户名@203.0.113.10
✅ 成功登录即表示整个链路打通。
4. 异常处理
常见问题与解决方案:
| 问题现象 | 根本原因 | 解决方法 |
|---|---|---|
json: unknown field "token" |
frp 版本 < v0.50,但用了 token 字段 |
升级到 v0.50+,使用 .toml 格式;或旧版改用 privilege_token |
Connection refused(外网) |
1. macOS SSH 未开启 2. frpc 进程退出 3. VPS 防火墙未开放 remote_port |
1. 检查"远程登录" 2. 后台运行 frpc 3. 开放安全组/ufw |
telnet 127.0.0.1 6000 失败(在 VPS 上) |
frpc 未运行或配置错误 | 检查 frpc 日志,确认 local_port=22 |
work connection closed |
网络不稳定导致断连 | 启用 KeepAlive(见自启动配置) |
关键诊断命令:
bash
# 在 Mac 上测试本地 SSH
ssh localhost
# 在 VPS 上测试隧道
telnet 127.0.0.1 6000
# 在外网测试端口连通性
telnet 203.0.113.10 6000
5. client 端(macOS)frpc 自启动教程
为确保 frpc 开机自启、崩溃重启、后台运行 ,使用 macOS 原生 launchd 服务。
步骤 1:创建 plist 文件
bash
mkdir -p ~/Library/LaunchAgents
nano ~/Library/LaunchAgents/com.user.frpc.plist
粘贴以下内容(替换 你的用户名 为实际路径):
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.frpc</string>
<key>ProgramArguments</key>
<array>
<string>/Users/你的用户名/frp/frp_0.65.0_darwin_arm64/frpc</string>
<string>-c</string>
<string>/Users/你的用户名/frp/frpc.toml</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/你的用户名/frp/frp_0.65.0_darwin_arm64</string>
<key>StandardOutPath</key>
<string>/Users/你的用户名/frp/frpc.log</string>
<key>StandardErrorPath</key>
<string>/Users/你的用户名/frp/frpc-error.log</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>AbandonProcessGroup</key>
<true/>
<key>NetworkState</key>
<true/>
</dict>
</plist>
步骤 2:加载并启动服务
bash
# 首次加载
launchctl load ~/Library/LaunchAgents/com.user.frpc.plist
# 启动
launchctl start com.user.frpc
# 验证
launchctl list | grep frpc
步骤 3:验证自启动
- 重启 Mac
- 登录后执行
ps aux | grep frpc - 查看日志:
tail -f ~/frp/frpc.log
✅ 正常应看到
login to server success和start proxy success。
管理命令:
bash
# 重启
launchctl stop com.user.frpc && launchctl start com.user.frpc
# 卸载
launchctl unload ~/Library/LaunchAgents/com.user.frpc.plist
✅ 总结
通过 frp + VPS + launchd 组合,我们实现了:
- 安全:Token 认证 + SSH 密钥登录
- 稳定:崩溃自动重启,开机自启
- 通用:适用于任何内网 TCP/UDP 服务穿透
- 低成本:仅需一台低配 VPS
💡 后续扩展 :可增加 Web 服务、VNC、Home Assistant 等代理,只需在
frpc.toml中添加新 proxy 即可。
参考:
frp官方指引: https://gofrp.org/zh-cn/docs/overview/
QWEN3: https://chat.qwen.ai/