跳转到内容

远程访问自己的 Mac ​

「出门在外连回家里那台 Mac」这件事有两个部分:让它能被连上,和让它只能被你连上。

多数教程只讲第一部分,于是产生了大量直接把 SSH 端口转发到公网、还开着密码登录的机器。这一篇两部分都讲,并且第二部分更重要。

开始之前 ​

需要读过凭据管理,尤其是 SSH 密钥那一节——本文假设你已经有一对带口令的密钥。

本文会开启系统的共享服务,这会改变机器的可访问性。每一节都给出了关闭方式,练习结束后可以完全恢复原状。图形界面层面的说明见共享与远程访问。

开启远程登录 ​

「系统设置 → 通用 → 共享 → 远程登录」打开开关。

打开时注意「允许访问」的设置:默认可能是「所有用户」。改成只允许特定用户,范围小得多。

开关打开后,设置面板里会显示连接命令,形如 ssh 用户名@主机名.local。

查询当前状态:

sh
sudo systemsetup -getremotelogin

systemsetup 是系统设置的命令行工具。在较新的 macOS 上,它需要执行它的终端拥有完全磁盘访问权限,否则会报错——这是 TCC 的限制而非命令有问题,见 TCC 隐私授权。图形界面始终可用,拿不准时以界面为准。

用密钥替代密码 ​

开着密码登录的 SSH 服务,安全性取决于你的密码强度和有没有人在猜。改成密钥登录能彻底消除这一类风险。

把公钥放到 Mac 上 ​

从另一台机器执行:

sh
ssh-copy-id 用户名@主机名.local

ssh-copy-id 把本机的公钥追加到目标机器的 ~/.ssh/authorized_keys 里。这一步还需要输一次密码——这是最后一次。

手工做也可以:把公钥内容(~/.ssh/id_ed25519.pub 的全文)追加到目标机器的 ~/.ssh/authorized_keys,并确认权限:

sh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

权限太松时 SSH 会拒绝使用这些文件——这是有意的设计,不是故障。

验证之后再关密码登录 ​

顺序不能反。 先确认密钥登录能成功:

sh
ssh -o PasswordAuthentication=no 用户名@主机名.local

-o 临时指定一个配置项,这里强制不使用密码。能进去,说明密钥这条路通了。

确认之后再编辑 /etc/ssh/sshd_config:

sh
sudo nano /etc/ssh/sshd_config

找到并改成:

PasswordAuthentication no

改完重启服务的方式是在系统设置里把「远程登录」关掉再打开。

先备份这个文件:

sh
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

改错了配置会导致连不上。手边有这台机器时这不是问题;如果你是在远程改一台够不着的机器,就需要格外小心——保持当前会话不要断开,另开一个新连接验证成功后再关掉旧的。

屏幕共享 ​

「系统设置 → 通用 → 共享 → 屏幕共享」。开启后,同一局域网的其他 Mac 可以在访达边栏看到这台机器并点「共享屏幕」。

也可以按 Command-K 输入:

vnc://主机名.local

屏幕共享比 SSH 消耗更多带宽,跨网络使用时体验取决于上行速度。只需要跑命令的话,SSH 更轻快也更可靠。

连接类型(标准与高性能)、虚拟显示器、会话里的剪贴板与文件传输、以及连不上时的排查顺序,单独展开在屏幕共享:看见并操作另一台 Mac。

怎么从外面连回来 ​

这是最关键的一节。

不推荐:端口转发 ​

在路由器上把 22 端口转发到 Mac,确实能连上。但这意味着你的 SSH 服务直接暴露在公网,会持续收到自动化的连接尝试。

即使用了密钥登录(这已经挡住了绝大部分风险),仍然有两个问题:SSH 服务本身的漏洞会直接影响你,以及路由器配置一旦出错影响范围很大。

换个端口号不解决问题——扫描器会扫全部端口,换端口只减少日志噪音,不增加安全性。

推荐:覆盖网络 ​

用 Tailscale、ZeroTier 这类工具,或者自己搭 WireGuard,在设备之间建立加密的虚拟局域网。

好处是:没有任何端口暴露在公网,设备之间通过点对点加密通信;连接建立在设备身份而非 IP 上,换网络也不受影响;多数方案对个人使用的少量设备有免费额度。

装好之后,从外面 ssh 用户名@虚拟网络里的地址 就和在家里一样。这是目前对个人用户最合适的方案——安全性高,配置反而更简单。

唤醒问题 ​

Mac 睡眠时连不上。「系统设置 → 电池 / 节能」里有「唤醒以供网络访问」一类的选项,打开后局域网内可以唤醒它。

代价是机器不会进入最省电的状态。插着电源的台式机无所谓,靠电池的笔记本要权衡。

看看谁连着 ​

sh
who

列出当前登录的会话,远程登录的会显示来源地址。

sh
last | head -20

last 显示历史登录记录,head -20 取最近 20 条。发现不认识的来源地址时,立刻关掉远程登录并改密码。

看本机哪些服务在监听:

sh
sudo lsof -i -P -n | grep LISTEN

这条命令在命令行网络诊断里解释过。定期看一眼,确认没有你不知道的服务在对外开放。

用完就关 ​

这是最有效的一条安全措施,也最容易被忽略:不需要远程访问的时候,把开关关掉。

远程登录和屏幕共享都是随开随关的,关掉之后攻击面直接归零。与其花力气加固一个常年开着的服务,不如只在需要的那几天开着。

检查结果 ​

sh
sudo lsof -i -P -n | grep LISTEN | grep -E ":22|:5900"

22 是 SSH,5900 是屏幕共享。开启了对应服务就能看到,关掉后应当消失——这是确认服务真的关闭了的可靠办法,比看设置界面的开关更直接。

sh
ssh -o PasswordAuthentication=no 用户名@localhost

能登录说明密钥认证可用。localhost 指本机,用它测试不需要另一台设备。

动手练习 ​

在局域网内完成一次完整配置,最后恢复原状:

  1. 开启远程登录,把「允许访问」限定为你自己的账号。
  2. 从本机执行 ssh 用户名@localhost,确认能连上。
  3. 用 ssh-copy-id 用户名@localhost 安装公钥(同一台机器上也能做这个练习)。
  4. 执行 ssh -o PasswordAuthentication=no 用户名@localhost,确认密钥登录成功。
  5. 执行 who 和 last | head,找到刚才的登录记录。
  6. 关闭远程登录,用 sudo lsof -i -P -n | grep ":22" 确认监听已消失。

成功标准是第 4 步和第 6 步:密钥登录可用,并且你能用命令确认服务已经关闭,而不是只相信界面上的开关。远程访问这件事上,能验证的状态才是真实的状态。

返回数据、备份与远程