【问题标题】:SSH connection screwed up after VPN connection established [closed]VPN连接建立后SSH连接搞砸了[关闭]
【发布时间】:2014-07-11 09:51:43
【问题描述】:

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

问题:

我有一台远程服务器(我们称之为 A)和一台本地计算机(让 称之为 B),两者都运行 Ubuntu 14.04。我可以建立一个反向的 SSH 隧道通过这样做连接 A 和 B 在服务器 A:ssh -R 2014:localhost:22 userb@B 在本地计算机B:ssh -p 2014 用户@localhost

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

现在,我将 A 连接到 VPN。 VPN连接成功后 已建立,当前打开的 ssh 会话没有响应 了。另外,在我杀死 VPN 连接。

有没有办法让 SSH 和 VPN 都满意?也许将 SSH 会话与 VPN 分开? (我发现了一种叫做拆分隧道的东西,但并没有真正理解它)。有人可以启发我吗?

【问题讨论】:

    标签: linux ssh openvpn


    【解决方案1】:

    这可能有点晚了,但是...

    问题是 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网关。

    【讨论】:

      【解决方案2】:

      VPN 通过将您的默认网关修改为新的隧道接口来破坏您的路由表。有趣的是,之后您无法启动新的 ssh 连接。 所以您是说 ssh -R 2014:localhost:22 userb@B 在通过您的 VPN 时无法连接?

      traceroute 在说什么? (一旦加载 VPN)。您的 vpn 提供商没有任何端口限制吗?如果您使用的是商业版,我的意思是。

      --- 编辑

      您最好的尝试是,在连接到 VPN 时,从服务器 A:

      远程登录 B 22

      查看是否可以对目标进行简单的 TCP SYN。无论如何,我会很惊讶 hidemyass 不会让你的 ssh 流量通过。

      回顾一下,您的 VPN 是在您的服务器上配置的吗? 您正在尝试通过您的 VPN 从您的服务器 B 连接到您的客户端 A? 您应该能够追踪到您的 VPN 公共地址(例如,您可以通过 whatismyip.com 获得)。

      您也可以在客户端上检查来自服务器的远程数据包:

      tcpdump -nnXs 0 -i eth0 主机ip.of.vpn

      【讨论】:

      • 感谢 wsteven!在我将服务器 A 连接到 VPN 之前,执行了“ssh -R 2014:localhost:22 userb@B”。加载 VPN 后,我无法再从 B SSH 进入 A。我不确定端口限制。如果有帮助,我正在使用 HideMyAss VPN?
      • VPN 加载后,从 B 到 A 的 traceroute 仍然运行良好(即到达 A)。但是我认为从 A 到 B 的 traceroute 没有! (控制台只显示一堆“***”,没有有用的信息)。
      • 我找到了问题,很简单!对不起,是我的错!问题与 DNS 有关。加载 VPN 后,我的 ISP 的 DNS 无法再解析任何地址。 Atfer 用 Google DNS (8.8.8.8, 8.8.4.4) 替换它,我可以建立保留的 SSH 隧道。但是,我真正想要的是在加载 VPN 之前建立 SSH 隧道,并且在加载 VPN 和加载 VPN 之后仍然能够通过我当前建立的 SSH 会话从 B 远程工作。有没有办法将 SSH 隧道与 VPN 分开?
      • 是的,请让 openvpn 在您的客户端上加载一条路由,以通过您的常规接口而不是 tun0 发送流量。不确定您是否可以使用 openvpn conf 文件执行此操作,但您可以在连接完成后运行脚本以添加静态路由。类似于:up /path/to/script.sh 使用路由 add -host ip.to.B dev eth0 或者如果您的客户端上有动态 IP: route add -net ip.of.net netmask 255.255.255.0 dev eth0
      • 我建议你在这个话题上发布一个“答案”,因为你找到了它,这样这个话题就会明确地显示为有一个“答案”。 ### OpenVPN 搞乱 SSH 的基本原因是它正在设置可能会破坏现有SSH 连接。 (它也可以推送 DNS 更改。)您必须至少查看 OpenVPN 日志以查看已执行的命令。
      猜你喜欢
      • 2014-06-14
      • 2015-07-09
      • 2013-04-24
      • 1970-01-01
      • 2020-06-18
      • 2013-01-14
      • 2017-04-13
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多