VPN连接建立后SSH连接出现问题

9

我遇到了一个问题,我已经搜索了很多但没有找到可行的解决方案,所以我想在这里提出一个问题。

问题:

我有一台远程服务器(我们称其为A)和一台本地计算机(我们称其为B),两者都运行Ubuntu 14.04。我可以通过以下方式建立反向SSH隧道连接A和B,在服务器A上:ssh -R 2014:localhost:22 userb@B在本地计算机B上:ssh -p 2014 usera@localhost

其中user-a和user-b分别是A和B上的两个用户。

现在,我将A连接到VPN。 VPN连接成功后,当前打开的ssh会话不再响应。此外,在我杀死VPN连接之前,我无法再次ssh进入A。

是否有办法让SSH和VPN同时工作?也许要将SSH会话与VPN分离?(我发现了一些称为拆分隧道的东西,但并不真正理解它)。有人能为我解答吗?

2个回答

5
这可能有点晚了,但是......问题在于OpenVPN会改变默认网关,这会导致当前的SSH连接断开,除非你在启动OpenVPN之前设置适当的路由。以下内容对我起作用。它使用iptables和ip(iproute2)。假设在启动OpenVPN之前默认网关接口为“eth0”。其思想是确保当建立与eth0的连接时,即使eth0不再是默认网关接口,响应数据包仍然回到eth0。您可以使用相同的连接标记、防火墙标记和路由表编号。我使用不同的编号使它们之间的差异更加明显。
# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

更新:

上述方法在Debian Jessie系统中运行良好。但是,在我发现的较旧的Wheezy系统上,我需要在路由表条目中添加“via”:

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

“12.345.67.89”必须是原始的非VPN网关。


1
VPN通过修改默认网关指向新的隧道接口来破坏您的路由表。有趣的是,之后您无法启动新的ssh连接。 那么您是说当通过您的VPN时,ssh -R 2014:localhost:22 userb@B无法连接?
traceroute显示什么?(一旦VPN加载)。您的VPN提供商没有任何端口限制吗?如果您使用商业VPN,则是这种情况。
---编辑
最好的尝试是,在连接到VPN时,从服务器A:
telnet B 22
看看是否可以向目标发出简单的TCP SYN。无论如何,我会惊讶hidemyass不会让您的ssh流量通过。
总之,您的VPN配置在您的服务器上? 您正在尝试通过VPN从服务器B连接到客户端A? 您应该能够对VPN公共地址进行traceroute(例如,您可以使用whatismyip.com获取)。
您还可以在客户端上检查远程数据包,这些数据包来自您的服务器:
tcpdump -nnXs 0 -i eth0 host ip.of.vpn

感谢wsteven!在将服务器A连接到VPN之前,执行了“ssh -R 2014:localhost:22 userb@B”。 VPN加载后,我无法从B ssh进入A。我不确定端口限制。如果有帮助的话,我正在使用HideMyAss VPN? - Cuong Truong
VPN加载后,从B到A的traceroute仍然正常工作(即到达A)。但是我认为从A到B的traceroute不行!(控制台仅显示一堆“***”行而没有有用的信息)。 - Cuong Truong
1
我找到了问题,非常简单!对不起,是我的错!问题与DNS有关。在加载VPN后,我的ISP的DNS无法再解析任何地址。将其替换为Google DNS(8.8.8.8、8.8.4.4)后,我可以建立保留的SSH隧道。然而,我真正想做的是在加载VPN之前建立SSH隧道,并且仍然能够通过当前建立的SSH会话从B远程工作到A,在加载VPN之前和之后都可以。有没有办法将SSH隧道与VPN分离? - Cuong Truong
是的,请要求openvpn在客户端上加载一条路由,以通过常规接口而不是tun0发送流量。不确定您是否可以使用openvpn conf文件执行此操作,但您可以在连接后运行脚本以添加静态路由。类似于: up /path/to/script.sh 使用route add -host ip.to.B dev eth0 或者如果您的客户端具有动态IP:route add -net ip.of.net netmask 255.255.255.0 dev eth0 - wsteven
我建议您在此主题下发布一个“答案”,因为您已经找到了它,这样该主题将明确显示为具有“答案”。### OpenVPN搞砸SSH的基本原因是它设置路由(在config.ovpn文件中和/或从服务器“推送”)可能会破坏现有的SSH连接。(它也可以推送DNS更改。)您至少需要查看OpenVPN日志以查看执行了哪些命令。 - Mike Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接