VPN 保持在线时通过第二条专用路径使用 SSH
绑定到隧道地址的 SSH 守护进程不会在新专用接口上响应。请先添加绑定并验证新会话,再关闭旧会话。
一台机器通过 VPN 访问另一台机器,现在有人想通过提供商的专用网络使用同一个 shell。路由存在,ping 成功,但 SSH 仍然拒绝连接。常见原因是守护进程从未监听新地址,因此没有可连接的对象。这首先是地址绑定问题,然后才是防火墙问题。
为什么新路由不会创建新的监听器
监听套接字由进程创建,该进程会指定它愿意接受的地址。路由只告诉数据包该往哪里走;它不会在目标处创建监听器。当 sshd 只配置了一个 ListenAddress 时,即使接口已启用,发往任何其他本地地址的连接也会被拒绝。拥有该端口的套接字单元也是如此,所以第一项检查始终是实际在监听什么。
按目标地址而不是接口名称比较两条路径。客户端连接的是地址,在任何防火墙规则生效之前,该地址必须先被绑定。
列出地址和监听器
在修改任何内容之前,先记录主机上的地址和当前存在的套接字。
ip -br addr
ss -ltnp | grep ':22'地址列表显示哪个专用地址是真实的以及位于哪个接口,套接字列表则显示是否有任何内容绑定到它。监听 0.0.0.0:22 的监听器已经接受所有地址,因此新增绑定不会带来任何变化。只监听某一个特定地址的监听器会立刻解释拒绝原因。如果端口属于套接字单元而不是守护进程,那么守护进程配置就不是全部原因。
添加绑定并保留旧绑定
OpenSSH 接受多个 ListenAddress 条目,因此可以在添加专用路径的同时保留 VPN 路径。重新加载前先测试文件。
sshd -t
systemctl reload sshd配置测试失败时,正在运行的守护进程会保持原样,这正是你在通过正在编辑的路径连接时所需要的。保留现有条目,添加新的本地地址,并确认服务重新加载时不会断开当前会话。在由套接字激活的安装中,改为把地址添加到套接字单元,并重新加载该单元。然后再次读取监听器列表,因为绑定从未出现意味着编辑了错误的组件。
关闭旧会话前先验证新会话
在原会话仍然打开时连接到新地址,并使用详细输出查看使用了哪个地址和密钥。保持原会话打开,直到探测连续成功两次。
ssh -v [email protected]阅读有关目标地址和所提供主机密钥的调试行。将主机密钥指纹与你已经信任的值进行核对,而不是因为网络被称为专用网络就接受未知密钥。新目标需要自己的 known_hosts 条目,这是预期行为。只有在专用路径可用之后,才应关闭旧的管理会话。
SSH 保护传输,但单独来看,它并不会让两个网络变得等价。在依赖专用中转之前,先判断其信任程度是否与数据相匹配。