导致问题的原因
我的需求是Mac在外网SSH连接家里Windows主机做训练和微调大模型,但现在路由器都自带 NAT 功能,家里的电脑没有一个可以被外网直接访问的公网地址;学校或实验室网络也常常有额外限制,所以直接通过公网 IP 连接往往行不通。
这篇文章记录一套我自己会长期使用的方案:用 Tailscale 把 Mac 和 Windows 组到同一个虚拟局域网里,再通过 SSH 远程登录 Windows 主机。 这样不用折腾公网 IP、端口映射和 DDNS,配置成本低,稳定性也更适合个人使用。
这篇文章适合谁
- 家里有一台 Windows 台式机或工作站
- 手头主要使用 MacBook
- 需要在外面远程连接家里的机器
- 不想折腾公网 IP、路由器端口转发和 DDNS
方案原理
Tailscale 可以把多台设备拉进同一个加密的虚拟网络中。只要 Mac 和 Windows 登录到同一个账号,它们就像处在同一个局域网里,可以直接通过 Tailscale 分配的地址互相访问。
这套方案的核心优点是:
- 不需要公网 IP
- 不需要在路由器上开放 22 端口
- 自带加密传输,安全性比裸露公网端口更高
- 对复杂网络环境更友好,适合家里和实验室这种跨网络场景
整体流程
- 在 Windows 上安装并启用
OpenSSH Server - 在 Mac 和 Windows 上安装
Tailscale,并登录同一个账号 - 在 Mac 上通过 Tailscale 地址发起 SSH 连接
第一步:在 Windows 上启用 SSH 服务
Windows 11 已经内置了 OpenSSH 组件,但很多机器默认只装了客户端,没有启用服务端。
方法一:图形界面安装
设置 -> 系统 -> 可选功能 -> 添加功能 -> 搜索 "OpenSSH Server" -> 安装
方法二:PowerShell 安装
以管理员身份打开 PowerShell,执行:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
启动 sshd 并设置为开机自启
# 启动 SSH 服务
Start-Service sshd
# 设置为开机自动启动
Set-Service -Name sshd -StartupType Automatic
检查防火墙规则
通常安装 OpenSSH Server 后,Windows 会自动创建防火墙规则。可以先检查:
Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP"
如果没有这条规则,再手动创建:
New-NetFirewallRule -Name "OpenSSH-Server-In-TCP" `
-DisplayName "OpenSSH Server (sshd)" `
-Enabled True `
-Direction Inbound `
-Protocol TCP `
-Action Allow `
-LocalPort 22
验证 SSH 服务是否正常
Get-Service sshd
如果状态显示为 Running,说明 SSH 服务已经起来了。
第二步:在两台设备上安装并登录 Tailscale
Mac 和 Windows 两端都需要安装 Tailscale,并登录同一个账号。
安装方式
- 打开 Tailscale 下载页
- 根据平台下载安装包
- 安装完成后登录同一个账号
常见平台选择:
- Mac:
App Store或官方dmg - Windows:官方
exe安装包
登录完成后,两台设备就会出现在同一个 Tailnet 里。
查看 Windows 的 Tailscale 地址
在 Windows PowerShell 中执行:
tailscale ip -4
你会看到一个类似下面的地址:
100.xx.xx.xx
也可以在 Mac 上查看当前 Tailnet 里的设备状态:
tailscale status
第三步:从 Mac 发起 SSH 连接
拿到 Windows 主机的 Tailscale 地址之后,就可以直接在 Mac 终端连接:
ssh 你的Windows用户名@100.xx.xx.xx
如果你不确定 Windows 的用户名,可以先在 Windows 终端执行:
whoami
然后使用返回结果中的用户名部分进行连接。
一个连接示例
ssh wangkun@100.xx.xx.xx
第一次连接时,终端会提示你确认主机指纹,输入 yes 即可。
可选优化:配置 ~/.ssh/config
如果你不想每次都手动输入完整 IP,可以在 Mac 上编辑 ~/.ssh/config:
Host home-gpu
HostName 100.xx.xx.xx
User 你的Windows用户名
Port 22
保存后,以后只需要输入:
ssh home-gpu
如果你的 Tailscale 网络里设备名比较稳定,也可以把 HostName 换成设备名。
可选优化:配置 SSH 密钥免密登录
如果你经常要连接这台机器,推荐配置 SSH 密钥登录,省去重复输入密码,也更安全。
在 Mac 上生成密钥
ssh-keygen -t ed25519
一路回车即可,默认会生成:
- 私钥:
~/.ssh/id_ed25519 - 公钥:
~/.ssh/id_ed25519.pub
将公钥写入 Windows
如果你的系统装了 ssh-copy-id,可以直接执行:
ssh-copy-id 你的Windows用户名@100.xx.xx.xx
如果没有 ssh-copy-id,就把公钥内容手动追加到 Windows 的这个文件中:
C:\Users\你的用户名\.ssh\authorized_keys
公钥内容可以用下面这条命令查看:
cat ~/.ssh/id_ed25519.pub
常见问题排查
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
Connection refused | sshd 没启动,或者防火墙规则不存在 | 检查 Get-Service sshd 和防火墙规则 |
Connection timed out | Tailscale 没连上,或 Windows 处于休眠状态 | 确认两台设备在线,并检查电源设置 |
Permission denied | 用户名不对、密码不对,或密钥未正确写入 | 先用 whoami 确认用户名,再检查 authorized_keys |
| 看得到 Tailscale 设备但连不上 SSH | Tailscale 正常,SSH 服务本身没配好 | 回到第一步检查 OpenSSH Server 是否安装完成 |
安全建议
这套方案已经比“直接把家里 22 端口暴露到公网”安全很多,但如果要长期使用,还是建议再做几件事:
- 优先使用 SSH 密钥登录,而不是只靠密码
- 不要在路由器上额外做 22 端口映射
- 给 Windows 账户设置强密码
- 如果机器需要长期远程访问,检查是否会自动休眠
总结
如果你的目标只是“在外面稳定地连回家里的 Windows 主机”,那么 OpenSSH Server + Tailscale 是一套非常省心的方案。
它的优势不在于炫技,而在于简单、实用、可长期维护:不用研究公网 IP,不用折腾路由器,也不用担心一堆家庭网络环境带来的坑。对于需要远程跑模型、传文件、执行命令的人来说,这基本已经够用了。
如果后面你还想继续完善这套远程方案,可以再往下加:
scp或rsync传文件- VS Code Remote SSH 远程开发
- Jupyter / WebUI 通过 Tailscale 内网访问
这样你的家用 GPU 主机,基本就能变成一台随时可用的私人算力节点。