外观
远程访问自己的 Mac
「出门在外连回家里那台 Mac」这件事有两个部分:让它能被连上,和让它只能被你连上。
多数教程只讲第一部分,于是产生了大量直接把 SSH 端口转发到公网、还开着密码登录的机器。这一篇两部分都讲,并且第二部分更重要。
开始之前
需要读过凭据管理,尤其是 SSH 密钥那一节——本文假设你已经有一对带口令的密钥。
本文会开启系统的共享服务,这会改变机器的可访问性。每一节都给出了关闭方式,练习结束后可以完全恢复原状。图形界面层面的说明见共享与远程访问。
开启远程登录
「系统设置 → 通用 → 共享 → 远程登录」打开开关。
打开时注意「允许访问」的设置:默认可能是「所有用户」。改成只允许特定用户,范围小得多。
开关打开后,设置面板里会显示连接命令,形如 ssh 用户名@主机名.local。
查询当前状态:
sh
sudo systemsetup -getremoteloginsystemsetup 是系统设置的命令行工具。在较新的 macOS 上,它需要执行它的终端拥有完全磁盘访问权限,否则会报错——这是 TCC 的限制而非命令有问题,见 TCC 隐私授权。图形界面始终可用,拿不准时以界面为准。
用密钥替代密码
开着密码登录的 SSH 服务,安全性取决于你的密码强度和有没有人在猜。改成密钥登录能彻底消除这一类风险。
把公钥放到 Mac 上
从另一台机器执行:
sh
ssh-copy-id 用户名@主机名.localssh-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 -20last 显示历史登录记录,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 指本机,用它测试不需要另一台设备。
动手练习
在局域网内完成一次完整配置,最后恢复原状:
- 开启远程登录,把「允许访问」限定为你自己的账号。
- 从本机执行
ssh 用户名@localhost,确认能连上。 - 用
ssh-copy-id 用户名@localhost安装公钥(同一台机器上也能做这个练习)。 - 执行
ssh -o PasswordAuthentication=no 用户名@localhost,确认密钥登录成功。 - 执行
who和last | head,找到刚才的登录记录。 - 关闭远程登录,用
sudo lsof -i -P -n | grep ":22"确认监听已消失。
成功标准是第 4 步和第 6 步:密钥登录可用,并且你能用命令确认服务已经关闭,而不是只相信界面上的开关。远程访问这件事上,能验证的状态才是真实的状态。