乔人尹 - 远程
type: channel
link: https://underestimated.cn/tag/%E8%BF%9C%E7%A8%8B/
items: 💻远程访问 Mac 从入门到放弃

💻远程访问 Mac 从入门到放弃
type: item
date: 2026-04-25T11:15:00+00:00
description: 前言最近我入手了一台 Mac mini，打算把它当作家里常驻的远程服务器：跑些长时间任务、做开发环境、当 NAS、随时从公司或外面那台 MacBook 连回来用。要实现这件事，核心问题是怎么把家里这台机器安全地暴露到公网。传统方案有几个坑：路由器端口转发：得有公网 IP，运营商现在大多 NAT，搞不定；就算能搞还要应付动态 IP、DDoS、扫描器。frp / ngrok：需要自己一台带公网的 VPS 当中继，多一份成本和维护。Tailscale / ZeroTier：好用，但每台想接入的设备都得装客户端。Cloudflare Tunnel：免费，不要公网 IP，自带 HTTPS 和 DDoS 防护，可以叠加 Zero Trust Access 做身份验证。本文采用这套方案。最终目标：在外面的 MacBook 上，一条 ssh user@ssh.example.com 就能连回家里的 Mac mini，并且能随时拉起屏幕共享（VNC）。整体架构flowchart LR Client["客户端 Mac(MacBook)"] Edge["Cloudflare 边缘节点(443 端口)"] Tunnel["Cloudflared(运行在 Mac mini)"] Host["被访问 Mac(Mac mini)"] Client -- "ssh / vnc经 cloudflared access" --> Edge Edge -- "加密隧道主动出站" --> Tunnel Tunnel -- "localhost:22localhost:5900" --> Host关键点：Mac mini 主动连出去到 Cloudflare 边缘建立长连接，所以根本不需要公网 IP，也不用在路由器上开任何端口。前置条件一个已托管在 Cloudflare 的域名（DNS 的 NS 已切到 Cloudflare）。被访问的 Mac mini，开启了「远程登录（SSH）」和「屏幕共享（VNC）」。一台客户端 Mac，安装了 Homebrew。总体流程flowchart TD A[安装 cloudflaredhost 端] --> B[cloudflared tunnel login] B --> C[创建 Tunnelcloudflared tunnel create] C --> D[编辑 config.yml定义 ingress 规则] D --> E[路由 DNStunnel route dns] E --> F[前台测试tunnel run] F --> G{是否正常?} G -- 是 --> H[安装为 serviceservice install] G -- 否 --> I[排查日志] I --> D H --> J[客户端配置~/.ssh/config] J --> K[ssh / vnc 连接]一、Host 端配置（Mac mini）1. 安装 cloudflaredbrew install cloudflared2. 登录并授权cloudflared tunnel login会自动打开浏览器，登录后选择要使用的域名进行授权。完成后会在 ~/.cloudflared/ 生成 cert.pem。3. 创建隧道cloudflared tunnel create macminivisit记下返回的 Tunnel UUID，并确认 ~/.cloudflared/<UUID>.json 凭证文件已生成。4. 编辑 config.yml新建 ~/.cloudflared/config.yml：tunnel: 3ff7b7df-25c3-43d9-a49f-f9bc05701b9c credentials-file: /Users/你的用户名/.cloudflared/3ff7b7df-25c3-43d9-a49f-f9bc05701b9c.json ingress: - hostname: ssh.example.com service: ssh://localhost:22 - hostname: vnc.example.com service: tcp://localhost:5900 - service: http_status:404几个容易踩的点：credentials-file 必须是绝对路径，不能写 ~。VNC 的 service 是 tcp://，不是 vnc://。最后必须有兜底 http_status:404，否则会启动失败。hostname 用一级子域名（ssh.example.com），不要用深层子域名（ssh.home.example.com），否则会撞 SSL 证书覆盖问题。校验配置：cloudflared tunnel in…