让我们考虑以下场景:
在这种情况下,从您的机器(假设您的机器是 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 连接,让我们假设:
在这个阶段:
如果没有路由从远程 OpenVPN 服务器推送到您的本地 VPS,那么路由方面不会发生任何变化,您的 SSH 连接将毫无问题地继续存在。在这种情况下,唯一通过 VPN 的流量是指向远程 OpenVPN 服务器 (10.10.10.1) 的流量;
如果远程 OpenVPN 服务器将推回某些路由,特别是如果 VPS 默认网关将被 10.10.10.1(远程 OpenVPN 端点)替换,那么您就会遇到问题。在这种情况下,您将在 VPN 内通过隧道传输所有传出 IP 流量(OpenVPN 本身除外)。
在第二种情况下(在建立 VPN 连接后立即替换 def-gw),由于非对称路由,您之前的 SSH 连接将“挂起”:
换句话说:一旦建立了 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)
在哪里:
PS:通过提供一个更详细的问题,你会得到一个更快的答案:-)
您需要在您的 VPS 上的 OpenVPN 客户端配置文件中添加route-nopull选项(redirect-gateway如果存在则删除)。
这样连接到 VPN 服务器不会修改您的 VPS 上的任何路由,因此您可以自己设置所需的路由。
这可以帮助:
放入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没有''。