通过 frp 实现安全访问家中 macOS 的 SSH 服务

作者之前没折腾过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(服务端)

# 下载 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.tomlTOML 格式,v0.50+):

[common]
bind_port = 7000
token = "your_strong_secret_token_32_chars"

启动服务:

./frps -c ./frps.toml

🔒 防火墙:开放 7000(frp 控制)和 6000(SSH 隧道)端口。


步骤 2:在 macOS 上部署 frpc(客户端)

2.1 下载 frp(Apple Silicon 示例)

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

[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(临时测试)

cd ~/frp/frp_0.65.0_darwin_arm64
./frpc -c ~/frp/frpc.toml

看到 start proxy success 即表示隧道建立成功。


步骤 3:外网访问验证

从任意外网设备执行:

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(见自启动配置)

关键诊断命令:

# 在 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 文件

mkdir -p ~/Library/LaunchAgents
nano ~/Library/LaunchAgents/com.user.frpc.plist

粘贴以下内容(替换 你的用户名 为实际路径):

<?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:加载并启动服务

# 首次加载
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 successstart proxy success

管理命令:

# 重启
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/

posted @ 2025-11-15 21:13  HappyMonk  阅读(0)  评论(0)    收藏  举报