Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 建立VPN连接后SSH连接出错_Linux_Ssh_Openvpn - Fatal编程技术网

Linux 建立VPN连接后SSH连接出错

Linux 建立VPN连接后SSH连接出错,linux,ssh,openvpn,Linux,Ssh,Openvpn,对于我的问题,我搜索了很多,但没有找到一个可行的解决方案,所以我想我自己放一个问题在这里 问题是: 我有一台远程服务器(我们称之为a)和一台本地计算机(我们称之为a) 称之为B),两者都运行Ubuntu 14.04。我可以建立一个反向的 在服务器A上连接A和B的SSH隧道:SSH-R 2014年:本地主机:22userb@B在本地计算机上B:ssh-p 2014 usera@localhost 其中,用户a和用户b分别是a和b处的两个用户 现在,我将A连接到VPN。VPN连接成功后 已建立,当前

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

问题是:

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

其中,用户a和用户b分别是a和b处的两个用户

现在,我将A连接到VPN。VPN连接成功后 已建立,当前打开的ssh会话没有响应 不再而且,在我杀了那个人之前,我不能再ssh成一个 VPN连接


有没有办法让SSH和VPN都开心?也许要将SSH会话与VPN分离?(我发现了一种叫做分裂隧道的东西,但我并不真正理解它)。有人能告诉我这一点吗?

VPN通过修改默认网关以进入新的隧道接口,从而破坏了您的路由表。有趣的是,之后不能启动新的ssh连接。 那么您是说ssh-r2014:localhost:22userb@B通过VPN时无法连接

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

---编辑

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

telnet B 22

查看是否可以创建一个简单的目标TCP SYN。无论如何,我会很惊讶Hidemyas不会让你的ssh流量通过

总而言之,您的VPN是在服务器上配置的吗? 您正在尝试通过VPN从服务器B连接到客户端A? 您应该能够跟踪路由到您的VPN公共地址(例如,您可以通过whatismyip.com获得)

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


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

这可能有点晚了,但是

问题是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身上很管用。但是在一个旧的喘息系统上,我刚刚发现我需要在路由表条目中添加“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网关。

谢谢!ssh-r2014:localhost:22userb@B'在我将服务器A连接到VPN之前执行。加载VPN后,我无法再从B ssh到A。我不确定端口限制。如果有帮助的话,我正在使用Hidemyas VPN?加载VPN后,从B到A的跟踪路由仍然工作良好(即到达A)。但我认为从A到B的追踪路线没有!(控制台只显示一堆“***”行,没有有用的信息)。我发现了这个问题,非常简单!对不起,是我的错!问题与DNS有关。加载VPN后,我的ISP的DNS无法再解析任何地址。如果用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连接的路由(在
config.ovpn
文件中和/或从服务器“推送”)。(它也可以推动DNS更改。)您必须至少查看OpenVPN日志,以查看执行了哪些命令。