Mac在外网SSH用 Tailscale 绕过内网NAT的完整指南

0 阅读6分钟

导致问题的原因

我的需求是Mac在外网SSH连接家里Windows主机做训练和微调大模型,但现在路由器都自带 NAT 功能,家里的电脑没有一个可以被外网直接访问的公网地址;学校或实验室网络也常常有额外限制,所以直接通过公网 IP 连接往往行不通。

这篇文章记录一套我自己会长期使用的方案:用 Tailscale 把 Mac 和 Windows 组到同一个虚拟局域网里,再通过 SSH 远程登录 Windows 主机。 这样不用折腾公网 IP、端口映射和 DDNS,配置成本低,稳定性也更适合个人使用。

image.png

这篇文章适合谁

  • 家里有一台 Windows 台式机或工作站
  • 手头主要使用 MacBook
  • 需要在外面远程连接家里的机器
  • 不想折腾公网 IP、路由器端口转发和 DDNS

方案原理

Tailscale 可以把多台设备拉进同一个加密的虚拟网络中。只要 Mac 和 Windows 登录到同一个账号,它们就像处在同一个局域网里,可以直接通过 Tailscale 分配的地址互相访问。

这套方案的核心优点是:

  • 不需要公网 IP
  • 不需要在路由器上开放 22 端口
  • 自带加密传输,安全性比裸露公网端口更高
  • 对复杂网络环境更友好,适合家里和实验室这种跨网络场景

整体流程

  1. 在 Windows 上安装并启用 OpenSSH Server
  2. 在 Mac 和 Windows 上安装 Tailscale,并登录同一个账号
  3. 在 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,并登录同一个账号。

安装方式

  1. 打开 Tailscale 下载页
  2. 根据平台下载安装包
  3. 安装完成后登录同一个账号

常见平台选择:

  • 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 refusedsshd 没启动,或者防火墙规则不存在检查 Get-Service sshd 和防火墙规则
Connection timed outTailscale 没连上,或 Windows 处于休眠状态确认两台设备在线,并检查电源设置
Permission denied用户名不对、密码不对,或密钥未正确写入先用 whoami 确认用户名,再检查 authorized_keys
看得到 Tailscale 设备但连不上 SSHTailscale 正常,SSH 服务本身没配好回到第一步检查 OpenSSH Server 是否安装完成

安全建议

这套方案已经比“直接把家里 22 端口暴露到公网”安全很多,但如果要长期使用,还是建议再做几件事:

  • 优先使用 SSH 密钥登录,而不是只靠密码
  • 不要在路由器上额外做 22 端口映射
  • 给 Windows 账户设置强密码
  • 如果机器需要长期远程访问,检查是否会自动休眠

总结

如果你的目标只是“在外面稳定地连回家里的 Windows 主机”,那么 OpenSSH Server + Tailscale 是一套非常省心的方案。

它的优势不在于炫技,而在于简单、实用、可长期维护:不用研究公网 IP,不用折腾路由器,也不用担心一堆家庭网络环境带来的坑。对于需要远程跑模型、传文件、执行命令的人来说,这基本已经够用了。

如果后面你还想继续完善这套远程方案,可以再往下加:

  • scprsync 传文件
  • VS Code Remote SSH 远程开发
  • Jupyter / WebUI 通过 Tailscale 内网访问

这样你的家用 GPU 主机,基本就能变成一台随时可用的私人算力节点。