在服务器机器上登录 VPN 后防止 SSH 连接丢失

mic*_*c22 19 ubuntu vpn ssh routing openvpn

我遇到了一个我无法处理的问题。当我通过 SSH 登录到 VPS 并尝试在该 VPS 上建立 VPN 连接时,VPS 和我的机器之间的 SSH 连接丢失了。我认为这是因为 VPN 设置更改了路由。如何防止?

Dam*_*lli 9

让我们考虑以下场景:

  1. 您的 VPS 有一个以太网接口,配置了 IP 地址 4.3.2.1/24;
  2. 您的 VPS 可以通过默认网关 4.3.2.254 访问 Internet
  3. 您的VPS已经没有尚未激活任何OpenVPN的连接; 因此没有tun 接口处于活动状态

在这种情况下,从您的机器(假设您的机器是 9.8.7.6/24 和 def-gw 9.8.7.254)您可以成功建立到 4.3.2.1 的 SSH 连接。因此,主机 4.3.2.1 和 9.8.7.6 可以成功地相互访问。

现在,建立了这样的 SSH 连接,让我们假设:

  1. 您从 VPS 4.3.2.1 启动 OpenVPN 连接;
  2. 因此,将动态配置一个新的 tun0 接口(假设它将被分配一个 10.10.10.2 IP 和一个 10.10.10.1 PTP)。

在这个阶段:

  • 如果没有路由从远程 OpenVPN 服务器推送到您的本地 VPS,那么路由方面不会发生任何变化,您的 SSH 连接将毫无问题地继续存在。在这种情况下,唯一通过 VPN 的流量是指向远程 OpenVPN 服务器 (10.10.10.1) 的流量;

  • 如果远程 OpenVPN 服务器将推回某些路由,特别是如果 VPS 默认网关将被 10.10.10.1(远程 OpenVPN 端点)替换,那么您就会遇到问题。在这种情况下,您将在 VPN 内通过隧道传输所有传出 IP 流量(OpenVPN 本身除外)。

在第二种情况下(在建立 VPN 连接后立即替换 def-gw),由于非对称路由,您之前的 SSH 连接将“挂起”:

  • 从您的机器 (9.8.7.6) 到 VPS (4.3.2.1) 的流量将通过以前的、永远不会改变的路径;
  • 从 VPS (4.3.2.1) 到您的机器 (9.8.7.6) 的流量:
    • 没有 VPN(因此,最初)是通过 4.3.2.254 网关路由的;
    • VPN链路建立后,用相关的def-gw替换,通过VPN(10.10.10.1)路由。

换句话说:一旦建立了 VPN 链接,你从 VPS 到你机器的返回路由就会改变......这不是一件好事(沿着返回路径的几个网络设备可能会识别这种非对称路径并简单地丢弃数据包)。

此外,您的远程 OpenVPN 服务器很有可能充当 NAT 盒:来自 VPN 的所有流量都将使用远程 OpenVPN 服务器的公共 IP 地址进行 NAT。如果这是真的,不是事情没有更多......“不好”,但绝对“坏”,为您的SSH连接:返回流量,除了拿回沿着不同的路线,就要回到你的机器有不同的源 IP(VPN 服务器的公共接口之一)。

如何解决这个问题呢?

确实很容易。

简单地指示您的 VPS 服务器不要沿着 VPN 将流量路由到您的机器,而是依赖先前的路由。在启动 OpenVPN 之前,它应该像添加一样简单:

     route add -host 9.8.7.6 gw 4.3.2.254
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • 9.8.7.6是你机器公网IP地址
  • 4.3.2.254 是您的 VPS 的原始默认网关。

PS:通过提供一个更详细的问题,你会得到一个更快的答案:-)


Anu*_*ioz 7

您需要在您的 VPS 上的 OpenVPN 客户端配置文件中添加route-nopull选项(redirect-gateway如果存在则删除)。

这样连接到 VPN 服务器不会修改您的 VPS 上的任何路由,因此您可以自己设置所需的路由。


Gil*_*not 0

这可以帮助:

放入TCPKeepAlive=yes你的/etc/ssh/sshd_config

man sshd_config | less +/'^ *TCPKeepAlive'
Run Code Online (Sandbox Code Playgroud)

TCP保活

指定系统是否应向对方发送 TCP keepalive 消息。如果它们被发送,连接中断或其中一台机器崩溃将被正确注意到。然而,这意味着如果路由暂时中断,连接就会中断,有些人会觉得这很烦人。另一方面,如果不发送 TCP keepalive,会话可能会无限期地挂在服务器上,留下“幽灵”用户并消耗服务器资源。

默认是yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This avoids infinitely hanging sessions. To disable TCP keepalive messages, the value should be set to没有''。