使用跳板机远程接入内网服务器时,最常碰到的问题就是会话被频繁断开。要稳定保持连接,需要结合操作系统的特性、SSH 客户端配置与后台会话工具来做整体设计。这篇指南对比macOS与Windows环境下的不同做法,给出可操作的配置和排查方法,帮助你实现不掉线的长期连接。
掉线的常见原因包括:网络中间设备的空闲超时(防火墙、NAT)、客户机或服务端的TCP空闲策略、Wi‑Fi 切换或休眠、客户端未使用持久会话工具等。通过在客户端和服务端同时设置心跳、使用会话管理器(如 tmux/screen)以及自动重连工具(如 autossh 或 Mosh)可以显著降低断线带来的工作中断。
macOS 内置的是系统级的 OpenSSH,可以直接在终端使用并读写 ~/.ssh/config;Windows 常见选择有 PuTTY、Windows 自带的 OpenSSH(PowerShell/WSL 下)以及通过 WSL 使用 Linux 工具。不同客户端默认的保活策略与代理支持各异,配置方式也不同。
macOS 可以借助系统钥匙串自动加载私钥,结合 ssh-agent 使用更顺畅。Windows 上可通过 Pageant(PuTTY)或 Windows 的 SSH Agent 服务来管理密钥,WSL 则可以共享 agent,但需要额外配置。
无论哪一端,以下几项是基础且高效的做法:
Host bastion
HostName bastion.example.com
User youruser
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 60
ServerAliveCountMax 3
Host internal-*
ProxyJump bastion
ServerAliveInterval 60
ServerAliveCountMax 3
这段配置启用每 60 秒心跳,并用 ProxyJump 为内网主机走跳板机。如果网络质量差,可把间隔调短到 30 秒。
登录后运行 tmux(或 screen),在会话里启动长期任务或编辑器。即使 SSH 连接断开,重连到跳板机后执行 tmux attach 即可恢复。
安装 autossh(Homebrew:brew install autossh),然后用 launchd 或简单的 nohup 在后台运行保活隧道:
autossh -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -i ~/.ssh/id_rsa -J user@bastion user@internal-host
使用 -M 0 关闭端口监测,改用 SSH 自带的心跳。
在 PuTTY Session → Connection,把 "Seconds between keepalives" 填为 30;在 SSH → Auth 配置密钥并启用agent(使用 Pageant)。保存会话后每次连接都会发送 keepalive,减少防火墙因空闲断连的概率。
如果在 Windows 上安装了 WSL,建议在 WSL 中使用与 macOS 类似的配置:编辑 ~/.ssh/config、安装 autossh 并用 Windows 任务计划或 systemd(若使用 systemd 的 WSL 发行版)启动重连脚本。优点是你能直接使用 Linux 生态的工具 (tmux, Mosh, autossh) 来保证会话稳定。
Windows 10/11 的 OpenSSH 客户端也支持 ~/.ssh/config。若需要长期隧道,可以在 Windows 上创建服务或计划任务,执行 autossh(通过 WSL)或使用 plink(PuTTY 的命令行工具)进行隧道和心跳配置。
避免系统进入睡眠是关键。macOS 可以通过“节能”设置或使用 caffeinate 命令保持唤醒;Windows 可在电源选项中调整网络适配器休眠策略。若无法避免切换,使用 Mosh 能在 IP 变更后自动恢复会话(但 Mosh 依赖UDP且不能做端口转发)。
靠心跳(ServerAliveInterval)是最直接的补救。如果对方网络非常严格,减小间隔到 15 秒,并把 ServerAliveCountMax 设为较高值,可以在短暂丢包时维持会话。
把任务放进 tmux 会话或在服务器端以守护进程方式运行(systemd、nohup & disown 等),避免因 SSH 断开而终止任务。
在 macOS 与 Windows 间的最大差别在于客户端工具链与密钥管理方式。通过统一的策略:配置心跳、使用 tmux 保存会话、对需要长期稳定的隧道使用 autossh 并在必要时选用 Mosh,绝大多数掉线问题都能迎刃而解。将这些措施组合起来,并依据你的网络环境微调参数,就能实现跳板机接入时的长期稳定,不再被断线打断工作流程。
问:在 Windows 上不想安装 WSL,该如何实现自动重连隧道?
答:可使用 PuTTY 的 plink 命令结合 Windows 任务计划或 NSSM(非吸烟服务管理器)把 plink 当作服务运行。并在 PuTTY/Plink 中设置 keepalive(Seconds between keepalives),同时用 Pageant 管理密钥。这样能在原生环境实现类似 autossh 的效果。
问:Mosh 能否完全替代 SSH 来避免断线?
答:Mosh 在移动网络或频繁切换 IP 场景下表现优异,因为它基于 UDP 并支持 roaming。但 Mosh 不支持端口转发、X11 或代理跳转等功能,因此在需要隧道或跳板功能时,建议把 Mosh 与 SSH 结合使用:SSH 用作隧道和端口转发(配合 autossh),Mosh 用作交互式远程终端。