我遇到了我无法解决的问题。当我通过SSH登录到VPS并尝试建立该VPS上的VPN连接时,VPS和我的计算机之间的SSH连接丢失。我认为那是因为路由被VPN设置更改了。如何预防呢?
--route-noexec选项可以忽略服务器推送的路由,但是,正如您提到的,当我想使用VPN作为代理时,这无济于事
我遇到了我无法解决的问题。当我通过SSH登录到VPS并尝试建立该VPS上的VPN连接时,VPS和我的计算机之间的SSH连接丢失。我认为那是因为路由被VPN设置更改了。如何预防呢?
--route-noexec选项可以忽略服务器推送的路由,但是,正如您提到的,当我想使用VPN作为代理时,这无济于事
Answers:
您需要在VPS上的OpenVPN客户端的配置文件中添加route-nopull选项(redirect-gateway如果存在,则将其删除)。
这样,连接到VPN服务器不会修改VPS上的任何路由,因此您可以自行设置所需的路由。
inet addr:10.56.10.6 P-t-P:10.56.10.5 Mask:255.255.255.255
让我们考虑以下情形:
在这种情况下,从您的计算机(假设您的计算机为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 Server(10.10.10.1)的流量;
如果远程OpenVPN服务器将回退某些路由,并且特别是如果将VPS default-gateway替换为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
哪里:
PS:通过提供更详细的问题,您会得到更快的答案:-)
route add这样的0.0.0.0 gw命令返回SIOCADDRT: Invalid argument
[server] Peer Connection Initiated with [AF_INET]64.251.27.139:443; TUN/TAP device tun0 opened; do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0; /sbin/ip link set dev tun0 up mtu 1500; /sbin/ip addr add dev tun0 10.200.1.251/22 broadcast 10.200.3.255; ERROR: Linux route add command failed: external program exited with error status: 2
netstat -rn结果0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0,我使用的VPS是板载Ubuntu 14.04 Server的OVH基本选项
这可以帮助:
放在TCPKeepAlive=yes你的/etc/ssh/sshd_config
从
man sshd_config | less +/'^ *TCPKeepAlive'
TCPKeepAlive
指定系统是否应将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否''。
TCPKeepAlive选项设置为,yes因此这不是一个合适的解决方案
我遇到了这个问题,并尝试了所有推荐的解决方案,但仍然没有解决我的问题!
在尝试了许多解决方案之后,我使用了该screen命令。(我的VPN客户端是cisco-any-connect)。
$ screen -R VPN
$ openconnect -b "your server"
提供凭据后,立即按ctrl + a + d并返回到您的会话。
我个人比较喜欢将所有与SSH的连接都通过VPN路由。如果在建立VPN之前进行有效的ssh连接,则由于路由更改,它必须重新连接。
我建议使用autossh
在您的ssh客户端配置下,只需添加.ssh/config
Host *
ServerAliveInterval 300
ServerAliveCountMax 2
BatchMode yes
连接VPN后,ssh会断开连接,因为来自服务器的ssh通信会通过VPN服务器。因此,为避免这种情况,请在连接VPN之前运行以下命令。
路由添加-host your-machine-public-ip gw Server-gatway-ip dev eth0
your-machine-public-ip:进行SSH的计算机的IP。Server-gatway-ip:该服务器的网关/路由器的IP
上面的命令将通过给定的网关而不是通过VPN Server重定向流量。