从外面的电脑管理家里的 Mac,可以让两台设备加入 Tailscale,再通过 macOS 自带的 SSH 服务登录。配置好以后,日常执行 ssh home-mac 就能进入服务器终端,不需要家庭公网 IP,也不需要在路由器上转发 22 端口。
这里把家中运行服务的 Mac 称为服务器 Mac,把用来连接它的另一台电脑称为管理电脑。两边的终端不是一回事,创建登录密钥和修改 SSH 客户端配置都在管理电脑上做。
Tailscale 和 SSH 分别负责什么
连接过程是:
管理电脑 → Tailscale 私有网络 → 服务器 Mac 的 SSH 服务 → Mac 用户账户Tailscale 让两台设备在有权限的私有网络中相互访问;SSH 负责登录账户、验证身份和执行远端命令。安装 Tailscale 不会自动开启 Mac 的“远程登录”,也不会自动把个人公钥装到 Mac 上。
两台电脑加入 Tailscale
在两台设备分别安装 Tailscale 客户端,登录同一个个人网络,或确认已经授权它们相互访问。Mac 上按安装提示允许 VPN 配置,不同时安装多种 Mac 客户端。
在 Tailscale 管理后台的设备列表找到服务器 Mac,确认在线,复制它的 Tailscale IPv4 地址。第一次先用 IP 连接,减少设备名称解析带来的干扰。不需要为此开启 Exit Node。
管理电脑装有 CLI 时,可以执行:
tailscale status
tailscale ping <服务器的Tailscale-IP>先替换尖括号中的内容。能够 ping 通,说明 Tailscale 链路可达。
在服务器 Mac 开启远程登录
在服务器 Mac 打开“系统设置 → 通用 → 共享 → 远程登录”,开启远程登录,并只允许需要管理服务器的用户访问。普通终端管理不必额外开启“远程用户完全磁盘访问”。
在服务器终端执行:
whoami
idwhoami 返回的短账户名才是 SSH 登录用户,不是 Tailscale 登录邮箱,也不是设备名称。id 可以查看账户所在的用户组。
回到管理电脑,先试一次普通登录:
ssh <Mac账户名>@<服务器的Tailscale-IP>首次连接会询问是否信任服务器的主机密钥。如果显示 ED25519 指纹,在服务器 Mac 本机执行:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub核对两边的 SHA256:... 是否一致,匹配后再确认连接。若协商的是另一种主机密钥,就核对对应的 .pub 文件。主机密钥用于确认“连到哪台机器”;后面创建的个人密钥用于证明“谁来登录”。
输入 Mac 账户密码,登录后执行 whoami,确认是预期账户,再执行 exit 回到管理电脑。
| 错误 | 优先检查 |
|---|---|
| 连接超时 | 服务器是否睡眠、Tailscale 是否在线、访问规则是否允许 TCP 22 |
Connection refused | 服务器是否开启远程登录 |
Permission denied | Mac 短账户名、密码、允许远程登录的用户 |
| 主机密钥与原记录不一致 | 是否重装或更换过设备,先在服务器核对指纹 |
可以在管理电脑用 nc -vz <服务器的Tailscale-IP> 22 单独检查端口。端口可达和账户认证成功仍是两项检查。
在管理电脑配置登录密钥
先检查是否已经有准备使用的密钥:
ls -l ~/.ssh/id_ed25519_home ~/.ssh/id_ed25519_home.pub已有就复用,不覆盖。只有两者都不存在时,再执行:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_home -C home-mac按提示设置私钥口令。不带 .pub 的文件是私钥,留在管理电脑;带 .pub 的才是要放到服务器的公钥。如果只有私钥、公钥文件丢失,可以用 ssh-keygen -y -f ~/.ssh/id_ed25519_home 重新导出公钥,不必重新生成私钥。
在管理电脑替换下面两个值,再执行:
MAC_USER='替换为服务器Mac账户名'
MAC_HOST='替换为服务器Tailscale-IP'
cat ~/.ssh/id_ed25519_home.pub | ssh "$MAC_USER@$MAC_HOST" \
'umask 077; mkdir -p "$HOME/.ssh"; cat >> "$HOME/.ssh/authorized_keys"; chmod 700 "$HOME/.ssh"; chmod 600 "$HOME/.ssh/authorized_keys"'这条命令通过已有的 SSH 登录,把公钥追加到远端账户的 authorized_keys 中,保留原有内容。首次安装仍可能需要 Mac 账户密码,成功通常没有输出。不要把私钥文件传过去。
给连接配置一个别名
编辑管理电脑的 ~/.ssh/config,加入下面的配置,替换地址和账户名:
Host home-mac
HostName <服务器的Tailscale-IP>
User <Mac账户名>
IdentityFile ~/.ssh/id_ed25519_home
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 3如果已有同名 Host 块,就修改原块。把这种具体配置放在通配的 Host * 之前:多数选项采用最先取得的值,并不是后面的配置一定覆盖前面。OpenSSH 配置规则
保存后在管理电脑执行:
chmod 600 ~/.ssh/config ~/.ssh/id_ed25519_home
ssh home-machome-mac 只是本地别名,远端登录账户由 User 决定。登录后可以查看文件、管理 Docker 和读取日志,需要管理员权限时再执行 sudo。
确认使用了公钥认证
普通登录成功可能是密码回退,也可能复用了旧连接。可以在管理电脑建立一次独立连接,禁止密码回退:
ssh -vv -S none -o ControlMaster=no \
-o PreferredAuthentications=publickey \
-o PasswordAuthentication=no \
-o KbdInteractiveAuthentication=no \
home-mac 'whoami'预期日志出现 Authenticated to ... using "publickey",并返回正确用户名。Offering public key 只表示客户端尝试了密钥,不代表服务端接受。私钥有口令时,仍可能要求输入私钥口令,它与 Mac 账户密码不同。
需要确认管理员权限时,重新登录服务器后执行:
sudo whoami有权限并验证通过后返回 root。日常仍使用普通账户即可。
如果客户端配置的用户名与远端 whoami 不一致,可以先查看生效配置,再禁用连接复用对照:
ssh -G home-mac | rg '^(user|hostname|identityfile|controlmaster|controlpath|controlpersist) '
ssh -S none -o ControlMaster=no home-mac 'whoami; id'只有异常在复用时出现,才有依据继续检查 ControlPath 是否区分用户,例如使用 %C 或包含 %r、%h、%p 的路径。出现密码提示本身,不能证明某个账户存在或认证成功。
长期运行时还要确认什么
经 Tailscale 登录,不代表 Mac 的 SSH 只监听 Tailscale 接口。“远程登录”也可能允许家庭局域网访问,实际可访问范围由系统与网络规则决定。
Mac 睡眠、断网或重启后,连接也会中断。把它作为长期服务器时,需要另外验证接电睡眠策略、Tailscale 恢复、系统登录和 Docker Desktop 启动。
SSH 登录可用后,如果还要让管理电脑上的数据库客户端连接多个容器,可以继续配置 一个 SSH 连接转发多个 Docker 服务端口。