两个 SSH 别名,一台服务器:直连 VPN 还是跳板主机
把已批准的 VPN 路径和已批准的堡垒机路径保留为两个独立的别名与书签,让任何快捷方式都不必猜哪条路径已获授权。
同一台私有服务器既能通过已批准的 VPN 应答,也能通过已批准的堡垒机应答,而你希望每条路各有一个 Emacs 书签,而不是一个靠猜的快捷方式。要决定的不是哪条路径更好,而是眼前这项工作授权走哪条路径。把两者都写明,分别命名,并让文件名说明你选了哪一个。
条件一:哪些路径已获批准?
跳板主机不是绕过 VPN 要求的自动后备,VPN 也不是跳过已批准堡垒机的许可证。去问清你的账号和这份数据授权走哪些路径。如果两条都授权,你就有选择;如果只有一条,书签集合里就只有一项。这个答案来自数据所有者,而不是来自今天碰巧能用的那条路径。
把答案写下来,因为在事故处理中这个区别会很快消失。
两条路径还各自需要自己的账号与身份配置。在一个路由上可用的共享别名,换到另一个路由可能因与网络无关的原因而失效。
条件二:你能给每条路径起不同的名字吗?
一份 SSH 配置可以为一个地址放两个主机别名,各自的代理行为不同。把具体配置块放在任何宽泛通配符之前,因为对大多数选项来说先取到的值生效。
Host proj-direct proj-bastion
HostName 10.60.0.21
User analyst
ControlPath none
Host proj-direct
ProxyJump none
Host proj-bastion
ProxyJump gw.example.com
上面的地址只是示例;请换成你们团队文档里记录的那个。跳板别名还需要堡垒机自己的已批准账号,这通常意味着要为堡垒机本身再写一个 Host 块。在这里关闭连接共享能让路径比较保持诚实,因为被复用的多路复用连接可能比你要观察的路由变更活得更久。
这样远端文件名就能保持区分且可读。
/ssh:proj-direct:/srv/project/README.md
/ssh:proj-bastion:/srv/project/README.md
条件三:编辑器知道这个区别吗?
TRAMP 会把这两个文件名当作不同目标,这正是你想要的。分别用一个能说明走哪条路径的名字加书签,并重新打开书签,而不是去改某一个目标的含义。两个书签也让比较变得可见:你可以把两个都打开,在不改任何配置的情况下看到哪个失败。
涉及 ProxyJump 时有一项设置值得注意:相关连接必须关闭 TRAMP 的连接共享,所以在打开它们之前先把 tramp-use-connection-share 设为 nil。这是兼容性设置,不是对缺失路由的修复,也不会让未获批准的路径变成已批准。TRAMP 的常见问题文档把书签列为缩短这些名称的受支持做法。
悄悄改变路由的书签,比没有书签更糟。
为什么网络图标证明不了任何事
NetworkManager 的整体状态值 70 意味着这台机器有全局连通性。它并不指明任何 VPN 配置文件,普通 Wi-Fi 就能满足它。只承载你所需路由的纯私有隧道,可能让这个汇总值保持不变。这就是为什么绑定图标的快捷方式会为一条它从未测试过的路径报告就绪。
要读具体连接的状态,而不是全局状态。
如果你要做自动化,先查询具名连接,然后按这个顺序检查目标路由、解析器应答和 SSH 可达性。其中任何一步都可能在前面成功时失败,而把它们压成一个布尔值,正是自动化最终为一条从未用过的路径报告成功的方式。
一条路径停止工作时该怎么办
调查之前先保存缓冲区,因为已有的 TRAMP 会话可能比路由变更活得更久,然后在下次写入时失败。通过受支持的清理方式把它关掉,重新打开书签,并比较两条路径,而不是假定服务器宕了。
堡垒机和目标两端都要保持主机密钥验证开启。
换一条路径并不赋予你接受一把意外服务器密钥的权利,也不会让未获批准的路径变得可以接受。这两件事都与你正在做的那个决定彼此独立。